Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/rawdb/accessors_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ func ReadSenders(db databaseReader, hash common.Hash, number uint64) ([]common.A
func WriteBody(db ethdb.Database, hash common.Hash, number uint64, body *types.Body) error {
// Pre-processing
body.SendersFromTxs()
baseTxId, err := db.Sequence(dbutils.EthTx, uint64(len(body.Transactions)))
baseTxId, err := db.IncrementSequence(dbutils.EthTx, uint64(len(body.Transactions)))
if err != nil {
return err
}
Expand Down
3 changes: 2 additions & 1 deletion ethdb/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ type Database interface {

Append(bucket string, key, value []byte) error
AppendDup(bucket string, key, value []byte) error
Sequence(bucket string, amount uint64) (uint64, error)
IncrementSequence(bucket string, amount uint64) (uint64, error)
ReadSequence(bucket string) (uint64, error)
}

// MinDatabase is a minimalistic version of the Database interface.
Expand Down
3 changes: 2 additions & 1 deletion ethdb/kv_abstract.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ type Tx interface {
// Can be called for a read transaction to retrieve the current sequence value, and the increment must be zero.
// Sequence changes become visible outside the current write transaction after it is committed, and discarded on abort.
// Starts from 0.
Sequence(bucket string, amount uint64) (uint64, error)
ReadSequence(bucket string) (uint64, error)
IncrementSequence(bucket string, amount uint64) (uint64, error)

CHandle() unsafe.Pointer // Pointer to the underlying C transaction handle (e.g. *C.MDB_txn)
}
Expand Down
16 changes: 8 additions & 8 deletions ethdb/kv_abstract_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,29 +31,29 @@ func TestSequence(t *testing.T) {
require.NoError(t, err)
defer tx.Rollback()

i, err := tx.Sequence(dbutils.Buckets[0], 0)
i, err := tx.ReadSequence(dbutils.Buckets[0])
require.NoError(t, err)
require.Equal(t, uint64(0), i)
i, err = tx.Sequence(dbutils.Buckets[0], 1)
i, err = tx.IncrementSequence(dbutils.Buckets[0], 1)
require.NoError(t, err)
require.Equal(t, uint64(0), i)
i, err = tx.Sequence(dbutils.Buckets[0], 6)
i, err = tx.IncrementSequence(dbutils.Buckets[0], 6)
require.NoError(t, err)
require.Equal(t, uint64(1), i)
i, err = tx.Sequence(dbutils.Buckets[0], 1)
i, err = tx.IncrementSequence(dbutils.Buckets[0], 1)
require.NoError(t, err)
require.Equal(t, uint64(7), i)

i, err = tx.Sequence(dbutils.Buckets[1], 0)
i, err = tx.ReadSequence(dbutils.Buckets[1])
require.NoError(t, err)
require.Equal(t, uint64(0), i)
i, err = tx.Sequence(dbutils.Buckets[1], 1)
i, err = tx.IncrementSequence(dbutils.Buckets[1], 1)
require.NoError(t, err)
require.Equal(t, uint64(0), i)
i, err = tx.Sequence(dbutils.Buckets[1], 6)
i, err = tx.IncrementSequence(dbutils.Buckets[1], 6)
require.NoError(t, err)
require.Equal(t, uint64(1), i)
i, err = tx.Sequence(dbutils.Buckets[1], 1)
i, err = tx.IncrementSequence(dbutils.Buckets[1], 1)
require.NoError(t, err)
require.Equal(t, uint64(7), i)
}
Expand Down
22 changes: 17 additions & 5 deletions ethdb/kv_lmdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,7 @@ func (tx *lmdbTx) HasOne(bucket string, key []byte) (bool, error) {
}
}

func (tx *lmdbTx) Sequence(bucket string, amount uint64) (uint64, error) {
func (tx *lmdbTx) IncrementSequence(bucket string, amount uint64) (uint64, error) {
c := tx.Cursor(dbutils.Sequence)
defer c.Close()
_, v, err := c.SeekExact([]byte(bucket))
Expand All @@ -742,10 +742,6 @@ func (tx *lmdbTx) Sequence(bucket string, amount uint64) (uint64, error) {
currentV = binary.BigEndian.Uint64(v)
}

if amount == 0 {
return currentV, nil
}

newVBytes := make([]byte, 8)
binary.BigEndian.PutUint64(newVBytes, currentV+amount)
err = c.Put([]byte(bucket), newVBytes)
Expand All @@ -755,6 +751,22 @@ func (tx *lmdbTx) Sequence(bucket string, amount uint64) (uint64, error) {
return currentV, nil
}

func (tx *lmdbTx) ReadSequence(bucket string) (uint64, error) {
c := tx.Cursor(dbutils.Sequence)
defer c.Close()
_, v, err := c.SeekExact([]byte(bucket))
if err != nil && !lmdb.IsNotFound(err) {
return 0, err
}

var currentV uint64 = 0
if len(v) > 0 {
currentV = binary.BigEndian.Uint64(v)
}

return currentV, nil
}

func (tx *lmdbTx) BucketSize(name string) (uint64, error) {
st, err := tx.tx.Stat(lmdb.DBI(tx.db.buckets[name].DBI))
if err != nil {
Expand Down
25 changes: 17 additions & 8 deletions ethdb/kv_mdbx.go
Original file line number Diff line number Diff line change
Expand Up @@ -770,10 +770,7 @@ func (tx *MdbxTx) HasOne(bucket string, key []byte) (bool, error) {
}
}

func (tx *MdbxTx) Sequence(bucket string, amount uint64) (uint64, error) {
// non-native for now
// return tx.tx.Sequence(mdbx.DBI(tx.db.buckets[bucket].DBI), amount)

func (tx *MdbxTx) IncrementSequence(bucket string, amount uint64) (uint64, error) {
c := tx.Cursor(dbutils.Sequence)
defer c.Close()
_, v, err := c.SeekExact([]byte(bucket))
Expand All @@ -786,10 +783,6 @@ func (tx *MdbxTx) Sequence(bucket string, amount uint64) (uint64, error) {
currentV = binary.BigEndian.Uint64(v)
}

if amount == 0 {
return currentV, nil
}

newVBytes := make([]byte, 8)
binary.BigEndian.PutUint64(newVBytes, currentV+amount)
err = c.Put([]byte(bucket), newVBytes)
Expand All @@ -799,6 +792,22 @@ func (tx *MdbxTx) Sequence(bucket string, amount uint64) (uint64, error) {
return currentV, nil
}

func (tx *MdbxTx) ReadSequence(bucket string) (uint64, error) {
c := tx.Cursor(dbutils.Sequence)
defer c.Close()
_, v, err := c.SeekExact([]byte(bucket))
if err != nil && !mdbx.IsNotFound(err) {
return 0, err
}

var currentV uint64 = 0
if len(v) > 0 {
currentV = binary.BigEndian.Uint64(v)
}

return currentV, nil
}

func (tx *MdbxTx) BucketSize(name string) (uint64, error) {
st, err := tx.BucketStat(name)
if err != nil {
Expand Down
5 changes: 4 additions & 1 deletion ethdb/kv_remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,10 @@ func (db *RemoteKV) Update(ctx context.Context, f func(tx Tx) error) (err error)
func (tx *remoteTx) Comparator(bucket string) dbutils.CmpFunc { panic("not implemented yet") }
func (tx *remoteTx) CHandle() unsafe.Pointer { panic("not implemented yet") }

func (tx *remoteTx) Sequence(bucket string, amount uint64) (uint64, error) {
func (tx *remoteTx) IncrementSequence(bucket string, amount uint64) (uint64, error) {
panic("not implemented yet")
}
func (tx *remoteTx) ReadSequence(bucket string) (uint64, error) {
panic("not implemented yet")
}

Expand Down
6 changes: 5 additions & 1 deletion ethdb/kv_snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,11 @@ func (s *sn2TX) Comparator(bucket string) dbutils.CmpFunc {
return s.dbTX.Comparator(bucket)
}

func (s *sn2TX) Sequence(bucket string, amount uint64) (uint64, error) {
func (s *sn2TX) IncrementSequence(bucket string, amount uint64) (uint64, error) {
panic("implement me")
}

func (s *sn2TX) ReadSequence(bucket string) (uint64, error) {
panic("implement me")
}

Expand Down
17 changes: 16 additions & 1 deletion ethdb/mutation.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func (m *mutation) getMem(table string, key []byte) ([]byte, bool) {
return i.(*MutationItem).value, true
}

func (m *mutation) Sequence(bucket string, amount uint64) (res uint64, err error) {
func (m *mutation) IncrementSequence(bucket string, amount uint64) (res uint64, err error) {
v, ok := m.getMem(dbutils.Sequence, []byte(bucket))
if !ok && m.db != nil {
v, err = m.db.Get(dbutils.Sequence, []byte(bucket))
Expand All @@ -88,6 +88,21 @@ func (m *mutation) Sequence(bucket string, amount uint64) (res uint64, err error

return currentV, nil
}
func (m *mutation) ReadSequence(bucket string) (res uint64, err error) {
v, ok := m.getMem(dbutils.Sequence, []byte(bucket))
if !ok && m.db != nil {
v, err = m.db.Get(dbutils.Sequence, []byte(bucket))
if err != nil && !errors.Is(err, ErrKeyNotFound) {
return 0, err
}
}
var currentV uint64 = 0
if len(v) > 0 {
currentV = binary.BigEndian.Uint64(v)
}

return currentV, nil
}

// Can only be called from the worker thread
func (m *mutation) Get(table string, key []byte) ([]byte, error) {
Expand Down
18 changes: 9 additions & 9 deletions ethdb/object_db.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,16 +142,16 @@ func (db *ObjectDatabase) DiskSize(ctx context.Context) (uint64, error) {
return casted.DiskSize(ctx)
}

func (db *ObjectDatabase) Sequence(bucket string, amount uint64) (res uint64, err error) {
if amount == 0 {
err = db.kv.View(context.Background(), func(tx Tx) error {
res, err = tx.Sequence(bucket, amount)
return err
})
return res, err
}
func (db *ObjectDatabase) IncrementSequence(bucket string, amount uint64) (res uint64, err error) {
err = db.kv.Update(context.Background(), func(tx Tx) error {
res, err = tx.Sequence(bucket, amount)
res, err = tx.IncrementSequence(bucket, amount)
return err
})
return res, err
}
func (db *ObjectDatabase) ReadSequence(bucket string) (res uint64, err error) {
err = db.kv.View(context.Background(), func(tx Tx) error {
res, err = tx.ReadSequence(bucket)
return err
})
return res, err
Expand Down
8 changes: 6 additions & 2 deletions ethdb/tx_db.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,12 @@ func (m *TxDb) cursor(bucket string) Cursor {
return c
}

func (m *TxDb) Sequence(bucket string, amount uint64) (res uint64, err error) {
return m.tx.Sequence(bucket, amount)
func (m *TxDb) IncrementSequence(bucket string, amount uint64) (res uint64, err error) {
return m.tx.IncrementSequence(bucket, amount)
}

func (m *TxDb) ReadSequence(bucket string) (res uint64, err error) {
return m.tx.ReadSequence(bucket)
}

func (m *TxDb) Put(bucket string, key []byte, value []byte) error {
Expand Down
2 changes: 1 addition & 1 deletion migrations/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ var transactionsTable = Migration{

txIds := make([]uint64, len(body.Transactions))
var baseTxId uint64
baseTxId, err = db.Sequence(dbutils.EthTx, uint64(len(body.Transactions)))
baseTxId, err = db.IncrementSequence(dbutils.EthTx, uint64(len(body.Transactions)))
if err != nil {
return false, nil
}
Expand Down