github.com/evdatsion/aphelion-dpos-bft@v0.32.1/mempool/doc.go (about) 1 // The mempool pushes new txs onto the proxyAppConn. 2 // It gets a stream of (req, res) tuples from the proxy. 3 // The mempool stores good txs in a concurrent linked-list. 4 5 // Multiple concurrent go-routines can traverse this linked-list 6 // safely by calling .NextWait() on each element. 7 8 // So we have several go-routines: 9 // 1. Consensus calling Update() and Reap() synchronously 10 // 2. Many mempool reactor's peer routines calling CheckTx() 11 // 3. Many mempool reactor's peer routines traversing the txs linked list 12 // 4. Another goroutine calling GarbageCollectTxs() periodically 13 14 // To manage these goroutines, there are three methods of locking. 15 // 1. Mutations to the linked-list is protected by an internal mtx (CList is goroutine-safe) 16 // 2. Mutations to the linked-list elements are atomic 17 // 3. CheckTx() calls can be paused upon Update() and Reap(), protected by .proxyMtx 18 19 // Garbage collection of old elements from mempool.txs is handlde via 20 // the DetachPrev() call, which makes old elements not reachable by 21 // peer broadcastTxRoutine() automatically garbage collected. 22 23 // TODO: Better handle abci client errors. (make it automatically handle connection errors) 24 package mempool