diff --git a/ledger/accountdb.go b/ledger/accountdb.go index 5c92758c2f..1596a54cff 100644 --- a/ledger/accountdb.go +++ b/ledger/accountdb.go @@ -3830,11 +3830,18 @@ func accountsNewRoundImpl( } updatedKVs = make(map[string]persistedKVData, len(kvPairs)) - for key, value := range kvPairs { - if value.data != nil { - err = writer.upsertKvPair(key, value.data) - updatedKVs[key] = persistedKVData{value: value.data, round: lastUpdateRound} + for key, mv := range kvPairs { + if mv.data != nil { + // reminder: check oldData for nil here, b/c bytes.Equal conflates nil and "". + if mv.oldData != nil && bytes.Equal(mv.oldData, mv.data) { + continue // changed back within the delta span + } + err = writer.upsertKvPair(key, mv.data) + updatedKVs[key] = persistedKVData{value: mv.data, round: lastUpdateRound} } else { + if mv.oldData == nil { // Came and went within the delta span + continue + } err = writer.deleteKvPair(key) updatedKVs[key] = persistedKVData{value: nil, round: lastUpdateRound} } diff --git a/ledger/acctupdates_test.go b/ledger/acctupdates_test.go index be1fa577b6..a19217fed4 100644 --- a/ledger/acctupdates_test.go +++ b/ledger/acctupdates_test.go @@ -1499,7 +1499,9 @@ func TestKVCache(t *testing.T) { if i < kvCnt/kvsPerBlock { for j := 0; j < kvsPerBlock; j++ { name := fmt.Sprintf("%d", curKV) - kvMods[name] = ledgercore.KvValueDelta{Data: nil} + // needs an old data, else optimized away. + // if oldData = "" there is the best chance of a bug, so we use that + kvMods[name] = ledgercore.KvValueDelta{Data: nil, OldData: []byte("")} curKV++ } } diff --git a/ledger/catchpointtracker.go b/ledger/catchpointtracker.go index 9c74f341fa..768c934473 100644 --- a/ledger/catchpointtracker.go +++ b/ledger/catchpointtracker.go @@ -1015,6 +1015,7 @@ func (ct *catchpointTracker) accountsUpdateBalances(accountsDeltas compactAccoun continue } if mv.oldData != nil { + // reminder: check mv.data for nil here, b/c bytes.Equal conflates nil and "". if mv.data != nil && bytes.Equal(mv.oldData, mv.data) { continue // changed back within the delta span }