Skip to content

Commit

Permalink
Merge pull request ethereum#15343 from karalabe/txpool-replacement-pr…
Browse files Browse the repository at this point in the history
…opagation

core: fire tx event on replace, expand tests
  • Loading branch information
karalabe authored Oct 20, 2017
2 parents eaa4f8a + 0af1ab0 commit 479aa61
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 7 deletions.
2 changes: 1 addition & 1 deletion core/bloombits/matcher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func TestWildcardMatcher(t *testing.T) {
}

// makeRandomIndexes generates a random filter system, composed on multiple filter
// criteria, each having one bloom list component for the address and arbitrarilly
// criteria, each having one bloom list component for the address and arbitrarily
// many topic bloom list components.
func makeRandomIndexes(lengths []int, max int) [][]bloomIndexes {
res := make([][]bloomIndexes, len(lengths))
Expand Down
13 changes: 13 additions & 0 deletions core/tx_journal.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ import (
// into the journal, but no such file is currently open.
var errNoActiveJournal = errors.New("no active journal")

// devNull is a WriteCloser that just discards anything written into it. Its
// goal is to allow the transaction journal to write into a fake journal when
// loading transactions on startup without printing warnings due to no file
// being readt for write.
type devNull struct{}

func (*devNull) Write(p []byte) (n int, err error) { return len(p), nil }
func (*devNull) Close() error { return nil }

// txJournal is a rotating log of transactions with the aim of storing locally
// created transactions to allow non-executed ones to survive node restarts.
type txJournal struct {
Expand Down Expand Up @@ -59,6 +68,10 @@ func (journal *txJournal) load(add func(*types.Transaction) error) error {
}
defer input.Close()

// Temporarilly discard any journal additions (don't double add on load)
journal.writer = new(devNull)
defer func() { journal.writer = nil }()

// Inject all transactions from the journal into the pool
stream := rlp.NewStream(input, 0)
total, dropped := 0, 0
Expand Down
5 changes: 5 additions & 0 deletions core/tx_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,10 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) {
pool.journalTx(from, tx)

log.Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.To())

// We've directly injected a replacement transaction, notify subsystems
go pool.txFeed.Send(TxPreEvent{tx})

return old != nil, nil
}
// New transaction isn't replacing a pending one, push into queue
Expand Down Expand Up @@ -729,6 +733,7 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T
// Set the potentially new pending nonce and notify any subsystems of the new tx
pool.beats[addr] = time.Now()
pool.pendingState.SetNonce(addr, tx.Nonce()+1)

go pool.txFeed.Send(TxPreEvent{tx})
}

Expand Down
Loading

0 comments on commit 479aa61

Please sign in to comment.