aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-10-02 18:20:18 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-10-02 18:20:18 +0800
commita6cc02f68fb13167b861efa72690538e7cf5b177 (patch)
treeb0e9c031062c21b3b149e2dce7c85d19210794d1
parent49ae53850622f3ea051184dccc867fbfec4c9ecb (diff)
downloaddexon-a6cc02f68fb13167b861efa72690538e7cf5b177.tar.gz
dexon-a6cc02f68fb13167b861efa72690538e7cf5b177.tar.zst
dexon-a6cc02f68fb13167b861efa72690538e7cf5b177.zip
core: deadlock in chainmanager after posting RemovedTransactionEvent
This PR solves an issue with the chain manager posting a `RemovedTransactionEvent`, the tx pool will try to acquire the chainmanager lock which has previously been locked prior to posting `RemovedTransactionEvent`. This results in a deadlock in the core.
-rw-r--r--core/chain_manager.go4
1 files changed, 3 insertions, 1 deletions
diff --git a/core/chain_manager.go b/core/chain_manager.go
index 55ef3fcad..49f831a59 100644
--- a/core/chain_manager.go
+++ b/core/chain_manager.go
@@ -804,7 +804,9 @@ func (self *ChainManager) reorg(oldBlock, newBlock *types.Block) error {
DeleteReceipt(self.chainDb, tx.Hash())
DeleteTransaction(self.chainDb, tx.Hash())
}
- self.eventMux.Post(RemovedTransactionEvent{diff})
+ // Must be posted in a goroutine because of the transaction pool trying
+ // to acquire the chain manager lock
+ go self.eventMux.Post(RemovedTransactionEvent{diff})
return nil
}