Skip to content

Commit 80fa254

Browse files
vms/avm: Simplify Peek function in mempool (#2449)
Co-authored-by: Stephen Buttolph <stephen@avalabs.org>
1 parent dd2c6ef commit 80fa254

File tree

5 files changed

+56
-31
lines changed

5 files changed

+56
-31
lines changed

vms/avm/block/builder/builder.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,12 @@ func (b *builder) BuildBlock(context.Context) (snowman.Block, error) {
9393
remainingSize = targetBlockSize
9494
)
9595
for {
96-
tx := b.mempool.Peek(remainingSize)
97-
if tx == nil {
96+
tx := b.mempool.Peek()
97+
// Invariant: [mempool.MaxTxSize] < [targetBlockSize]. This guarantees
98+
// that we will only stop building a block once there are no
99+
// transactions in the mempool or the block is at least
100+
// [targetBlockSize - mempool.MaxTxSize] bytes full.
101+
if tx == nil || len(tx.Bytes()) > remainingSize {
98102
break
99103
}
100104
b.mempool.Remove([]*txs.Tx{tx})

vms/avm/block/builder/builder_test.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,11 @@ func TestBuilderBuildBlock(t *testing.T) {
134134
tx := &txs.Tx{Unsigned: unsignedTx}
135135

136136
mempool := mempool.NewMockMempool(ctrl)
137-
mempool.EXPECT().Peek(gomock.Any()).Return(tx)
137+
mempool.EXPECT().Peek().Return(tx)
138138
mempool.EXPECT().Remove([]*txs.Tx{tx})
139139
mempool.EXPECT().MarkDropped(tx.ID(), errTest)
140140
// Second loop iteration
141-
mempool.EXPECT().Peek(gomock.Any()).Return(nil)
141+
mempool.EXPECT().Peek().Return(nil)
142142
mempool.EXPECT().RequestBuildBlock()
143143

144144
return New(
@@ -179,11 +179,11 @@ func TestBuilderBuildBlock(t *testing.T) {
179179
tx := &txs.Tx{Unsigned: unsignedTx}
180180

181181
mempool := mempool.NewMockMempool(ctrl)
182-
mempool.EXPECT().Peek(gomock.Any()).Return(tx)
182+
mempool.EXPECT().Peek().Return(tx)
183183
mempool.EXPECT().Remove([]*txs.Tx{tx})
184184
mempool.EXPECT().MarkDropped(tx.ID(), errTest)
185185
// Second loop iteration
186-
mempool.EXPECT().Peek(gomock.Any()).Return(nil)
186+
mempool.EXPECT().Peek().Return(nil)
187187
mempool.EXPECT().RequestBuildBlock()
188188

189189
return New(
@@ -225,11 +225,11 @@ func TestBuilderBuildBlock(t *testing.T) {
225225
tx := &txs.Tx{Unsigned: unsignedTx}
226226

227227
mempool := mempool.NewMockMempool(ctrl)
228-
mempool.EXPECT().Peek(gomock.Any()).Return(tx)
228+
mempool.EXPECT().Peek().Return(tx)
229229
mempool.EXPECT().Remove([]*txs.Tx{tx})
230230
mempool.EXPECT().MarkDropped(tx.ID(), errTest)
231231
// Second loop iteration
232-
mempool.EXPECT().Peek(gomock.Any()).Return(nil)
232+
mempool.EXPECT().Peek().Return(nil)
233233
mempool.EXPECT().RequestBuildBlock()
234234

235235
return New(
@@ -309,14 +309,14 @@ func TestBuilderBuildBlock(t *testing.T) {
309309
)
310310

311311
mempool := mempool.NewMockMempool(ctrl)
312-
mempool.EXPECT().Peek(targetBlockSize).Return(tx1)
312+
mempool.EXPECT().Peek().Return(tx1)
313313
mempool.EXPECT().Remove([]*txs.Tx{tx1})
314314
// Second loop iteration
315-
mempool.EXPECT().Peek(targetBlockSize - len(tx1Bytes)).Return(tx2)
315+
mempool.EXPECT().Peek().Return(tx2)
316316
mempool.EXPECT().Remove([]*txs.Tx{tx2})
317317
mempool.EXPECT().MarkDropped(tx2.ID(), blkexecutor.ErrConflictingBlockTxs)
318318
// Third loop iteration
319-
mempool.EXPECT().Peek(targetBlockSize - len(tx1Bytes)).Return(nil)
319+
mempool.EXPECT().Peek().Return(nil)
320320
mempool.EXPECT().RequestBuildBlock()
321321

322322
// To marshal the tx/block
@@ -385,10 +385,10 @@ func TestBuilderBuildBlock(t *testing.T) {
385385
tx := &txs.Tx{Unsigned: unsignedTx}
386386

387387
mempool := mempool.NewMockMempool(ctrl)
388-
mempool.EXPECT().Peek(gomock.Any()).Return(tx)
388+
mempool.EXPECT().Peek().Return(tx)
389389
mempool.EXPECT().Remove([]*txs.Tx{tx})
390390
// Second loop iteration
391-
mempool.EXPECT().Peek(gomock.Any()).Return(nil)
391+
mempool.EXPECT().Peek().Return(nil)
392392
mempool.EXPECT().RequestBuildBlock()
393393

394394
// To marshal the tx/block
@@ -459,10 +459,10 @@ func TestBuilderBuildBlock(t *testing.T) {
459459
tx := &txs.Tx{Unsigned: unsignedTx}
460460

461461
mempool := mempool.NewMockMempool(ctrl)
462-
mempool.EXPECT().Peek(gomock.Any()).Return(tx)
462+
mempool.EXPECT().Peek().Return(tx)
463463
mempool.EXPECT().Remove([]*txs.Tx{tx})
464464
// Second loop iteration
465-
mempool.EXPECT().Peek(gomock.Any()).Return(nil)
465+
mempool.EXPECT().Peek().Return(nil)
466466
mempool.EXPECT().RequestBuildBlock()
467467

468468
// To marshal the tx/block

vms/avm/txs/mempool/mempool.go

+5-12
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ type Mempool interface {
4848
Get(txID ids.ID) *txs.Tx
4949
Remove(txs []*txs.Tx)
5050

51-
// Peek returns the first tx in the mempool whose size is <= [maxTxSize].
52-
Peek(maxTxSize int) *txs.Tx
51+
// Peek returns the oldest tx in the mempool.
52+
Peek() *txs.Tx
5353

5454
// RequestBuildBlock notifies the consensus engine that a block should be
5555
// built if there is at least one transaction in the mempool.
@@ -182,16 +182,9 @@ func (m *mempool) Remove(txsToRemove []*txs.Tx) {
182182
}
183183
}
184184

185-
func (m *mempool) Peek(maxTxSize int) *txs.Tx {
186-
txIter := m.unissuedTxs.NewIterator()
187-
for txIter.Next() {
188-
tx := txIter.Value()
189-
txSize := len(tx.Bytes())
190-
if txSize <= maxTxSize {
191-
return tx
192-
}
193-
}
194-
return nil
185+
func (m *mempool) Peek() *txs.Tx {
186+
_, tx, _ := m.unissuedTxs.Oldest()
187+
return tx
195188
}
196189

197190
func (m *mempool) RequestBuildBlock() {

vms/avm/txs/mempool/mempool_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,31 @@ func createTestTxs(count int) []*txs.Tx {
170170
}
171171
return testTxs
172172
}
173+
174+
func TestPeekTxs(t *testing.T) {
175+
require := require.New(t)
176+
177+
registerer := prometheus.NewRegistry()
178+
toEngine := make(chan common.Message, 100)
179+
mempool, err := New("mempool", registerer, toEngine)
180+
require.NoError(err)
181+
182+
testTxs := createTestTxs(2)
183+
184+
require.Nil(mempool.Peek())
185+
186+
require.NoError(mempool.Add(testTxs[0]))
187+
require.NoError(mempool.Add(testTxs[1]))
188+
189+
require.Equal(mempool.Peek(), testTxs[0])
190+
require.NotEqual(mempool.Peek(), testTxs[1])
191+
192+
mempool.Remove([]*txs.Tx{testTxs[0]})
193+
194+
require.NotEqual(mempool.Peek(), testTxs[0])
195+
require.Equal(mempool.Peek(), testTxs[1])
196+
197+
mempool.Remove([]*txs.Tx{testTxs[1]})
198+
199+
require.Nil(mempool.Peek())
200+
}

vms/avm/txs/mempool/mock_mempool.go

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)