Skip to content

Commit b14f952

Browse files
perf(ledger): optimize private data retrieval by caching purge markers
Signed-off-by: Sukanya Patnaik <[email protected]>
1 parent f16bc05 commit b14f952

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

core/ledger/pvtdatastorage/store.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ func (s *Store) GetPvtDataByBlockNum(blockNum uint64, filter ledger.PvtNsCollFil
491491
var currentTxNum uint64
492492
var currentTxWsetAssember *txPvtdataAssembler
493493
firstItr := true
494+
purgeMarkerCache := make(map[string]*version.Height)
494495

495496
for itr.Next() {
496497
dataKeyBytes := itr.Key()
@@ -524,7 +525,21 @@ func (s *Store) GetPvtDataByBlockNum(blockNum uint64, filter ledger.PvtNsCollFil
524525
return nil, err
525526
}
526527

527-
if err := s.removePurgedDataFromCollPvtRWset(dataKey, dataValue); err != nil {
528+
529+
// Check the cache for purge marker height
530+
cacheKey := dataKey.ns + "~" + dataKey.coll
531+
var purgeMarkerHt *version.Height
532+
var exists bool
533+
if purgeMarkerHt, exists = purgeMarkerCache[cacheKey]; !exists {
534+
var err error
535+
purgeMarkerHt, err = s.retrieveLatestPurgeKeyCollMarkerHt(dataKey.ns, dataKey.coll)
536+
if err != nil {
537+
return nil, err
538+
}
539+
purgeMarkerCache[cacheKey] = purgeMarkerHt
540+
}
541+
542+
if err := s.removePurgedDataFromCollPvtRWset(dataKey, dataValue, purgeMarkerHt); err != nil {
528543
return nil, err
529544
}
530545

@@ -611,10 +626,18 @@ func (s *Store) RemoveAppInitiatedPurgesUsingReconMarker(
611626
return trimmedKVHashes, nil
612627
}
613628

614-
func (s *Store) removePurgedDataFromCollPvtRWset(k *dataKey, v *rwset.CollectionPvtReadWriteSet) error {
615-
purgePossible, err := s.keyPotentiallyPurged(k)
616-
if !purgePossible || err != nil {
617-
return err
629+
func (s *Store) removePurgedDataFromCollPvtRWset(k *dataKey, v *rwset.CollectionPvtReadWriteSet, purgeMarkerHt *version.Height) error {
630+
var purgePossible bool
631+
if purgeMarkerHt != nil {
632+
keyHt := &version.Height{
633+
BlockNum: k.blkNum,
634+
TxNum: k.txNum,
635+
}
636+
purgePossible = keyHt.Compare(purgeMarkerHt) <= 0
637+
}
638+
639+
if !purgePossible {
640+
return nil
618641
}
619642

620643
collRWSet, err := rwsetutil.CollPvtRwSetFromProtoMsg(v)

0 commit comments

Comments
 (0)