Merge pull request #631 from wpaulino/dropwtxmgr-max-reorg-depth

cmd/dropwtxmgr+waddrmgr: handle constraint when resetting synced state
This commit is contained in:
Olaoluwa Osuntokun 2019-07-10 15:45:58 -07:00 committed by GitHub
commit cd66e82bc8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 6 deletions

View file

@ -135,7 +135,17 @@ func mainInt() int {
return waddrmgr.PutSyncedTo(ns, startBlock)
}
return waddrmgr.PutSyncedTo(ns, &birthdayBlock)
// We'll need to remove our birthday block first because it
// serves as a barrier when updating our state to detect reorgs
// due to the wallet not storing all block hashes of the chain.
if err := waddrmgr.DeleteBirthdayBlock(ns); err != nil {
return err
}
if err := waddrmgr.PutSyncedTo(ns, &birthdayBlock); err != nil {
return err
}
return waddrmgr.PutBirthdayBlock(ns, birthdayBlock)
})
if err != nil {
fmt.Println("Failed to drop and re-create namespace:", err)

View file

@ -2060,13 +2060,27 @@ func FetchBirthdayBlock(ns walletdb.ReadBucket) (BlockStamp, error) {
return block, nil
}
// putBirthdayBlock stores the provided birthday block to the database.
// DeleteBirthdayBlock removes the birthday block from the database.
//
// NOTE: This does not alter the birthday block verification state.
func DeleteBirthdayBlock(ns walletdb.ReadWriteBucket) error {
bucket := ns.NestedReadWriteBucket(syncBucketName)
if err := bucket.Delete(birthdayBlockName); err != nil {
str := "failed to remove birthday block"
return managerError(ErrDatabase, str, err)
}
return nil
}
// PutBirthdayBlock stores the provided birthday block to the database.
//
// The block is serialized as follows:
// [0:4] block height
// [4:36] block hash
// [36:44] block timestamp
func putBirthdayBlock(ns walletdb.ReadWriteBucket, block BlockStamp) error {
//
// NOTE: This does not alter the birthday block verification state.
func PutBirthdayBlock(ns walletdb.ReadWriteBucket, block BlockStamp) error {
var birthdayBlock [44]byte
binary.BigEndian.PutUint32(birthdayBlock[:4], uint32(block.Height))
copy(birthdayBlock[4:36], block.Hash[:])

View file

@ -354,7 +354,7 @@ func populateBirthdayBlock(ns walletdb.ReadWriteBucket) error {
// NOTE: The timestamp of the birthday block isn't set since we do not
// store each block's timestamp.
return putBirthdayBlock(ns, BlockStamp{
return PutBirthdayBlock(ns, BlockStamp{
Height: birthdayHeight,
Hash: *birthdayHash,
})

View file

@ -247,7 +247,7 @@ func TestMigrationResetSyncedBlockToBirthday(t *testing.T) {
Hash: *birthdayHash, Height: birthdayHeight,
}
return putBirthdayBlock(ns, birthdayBlock)
return PutBirthdayBlock(ns, birthdayBlock)
}
afterMigration := func(ns walletdb.ReadWriteBucket) error {

View file

@ -128,7 +128,7 @@ func (m *Manager) BirthdayBlock(ns walletdb.ReadBucket) (BlockStamp, bool, error
func (m *Manager) SetBirthdayBlock(ns walletdb.ReadWriteBucket,
block BlockStamp, verified bool) error {
if err := putBirthdayBlock(ns, block); err != nil {
if err := PutBirthdayBlock(ns, block); err != nil {
return err
}
return putBirthdayBlockVerification(ns, verified)