github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/migration_block_slot_index.go (about)

     1  package kv
     2  
     3  import (
     4  	"bytes"
     5  	"strconv"
     6  
     7  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
     8  	bolt "go.etcd.io/bbolt"
     9  )
    10  
    11  var migrationBlockSlotIndex0Key = []byte("block_slot_index_0")
    12  
    13  func migrateBlockSlotIndex(tx *bolt.Tx) error {
    14  	mb := tx.Bucket(migrationsBucket)
    15  	if b := mb.Get(migrationBlockSlotIndex0Key); bytes.Equal(b, migrationCompleted) {
    16  		return nil // Migration already completed.
    17  	}
    18  
    19  	bkt := tx.Bucket(blockSlotIndicesBucket)
    20  
    21  	// Convert indices from strings to big endian integers.
    22  	if err := bkt.ForEach(func(k, v []byte) error {
    23  		key, err := strconv.ParseUint(string(k), 10, 64)
    24  		if err != nil {
    25  			return err
    26  		}
    27  		if err := bkt.Delete(k); err != nil {
    28  			return err
    29  		}
    30  		return bkt.Put(bytesutil.Uint64ToBytesBigEndian(key), v)
    31  	}); err != nil {
    32  		return err
    33  	}
    34  
    35  	return mb.Put(migrationBlockSlotIndex0Key, migrationCompleted)
    36  }