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

     1  package kv
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  
     7  	types "github.com/prysmaticlabs/eth2-types"
     8  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     9  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    10  	bolt "go.etcd.io/bbolt"
    11  )
    12  
    13  var migrationArchivedIndex0Key = []byte("archive_index_0")
    14  
    15  func migrateArchivedIndex(tx *bolt.Tx) error {
    16  	mb := tx.Bucket(migrationsBucket)
    17  	if b := mb.Get(migrationArchivedIndex0Key); bytes.Equal(b, migrationCompleted) {
    18  		return nil // Migration already completed.
    19  	}
    20  
    21  	bkt := tx.Bucket(archivedRootBucket)
    22  	if bkt == nil {
    23  		return nil
    24  	}
    25  	// Remove "last archived index" key before iterating over all keys.
    26  	if err := bkt.Delete(lastArchivedIndexKey); err != nil {
    27  		return err
    28  	}
    29  
    30  	var highest types.Slot
    31  	c := bkt.Cursor()
    32  	for k, v := c.First(); k != nil; k, v = c.Next() {
    33  		// Look up actual slot from block
    34  		b := tx.Bucket(blocksBucket).Get(v)
    35  		// Skip this key if there is no block for whatever reason.
    36  		if b == nil {
    37  			continue
    38  		}
    39  		blk := &ethpb.SignedBeaconBlock{}
    40  		if err := decode(context.TODO(), b, blk); err != nil {
    41  			return err
    42  		}
    43  		if err := tx.Bucket(stateSlotIndicesBucket).Put(bytesutil.SlotToBytesBigEndian(blk.Block.Slot), v); err != nil {
    44  			return err
    45  		}
    46  		if blk.Block.Slot > highest {
    47  			highest = blk.Block.Slot
    48  		}
    49  	}
    50  
    51  	// Delete deprecated buckets.
    52  	for _, bkt := range [][]byte{slotsHasObjectBucket, archivedRootBucket} {
    53  		if tx.Bucket(bkt) != nil {
    54  			if err := tx.DeleteBucket(bkt); err != nil {
    55  				return err
    56  			}
    57  		}
    58  	}
    59  
    60  	// Mark migration complete.
    61  	return mb.Put(migrationArchivedIndex0Key, migrationCompleted)
    62  }