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