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 := ðpb.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 }