Skip to content

Commit 9a853e6

Browse files
committed
fix: improve performance of ApplyPowerTableDiffs in ImportSnapshotToDatastore
1 parent 9288fba commit 9a853e6

File tree

2 files changed

+30
-13
lines changed

2 files changed

+30
-13
lines changed

certs/certs.go

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,38 @@ func MakePowerTableDiff(oldPowerTable, newPowerTable gpbft.PowerEntries) PowerTa
236236
return diff
237237
}
238238

239+
func PowerTableArrayToMap(pt gpbft.PowerEntries) map[gpbft.ActorID]gpbft.PowerEntry {
240+
ptm := make(map[gpbft.ActorID]gpbft.PowerEntry, len(pt))
241+
for _, pe := range pt {
242+
ptm[pe.ID] = pe
243+
}
244+
return ptm
245+
}
246+
247+
func PowerTableMapToArray(ptm map[gpbft.ActorID]gpbft.PowerEntry) gpbft.PowerEntries {
248+
pt := make(gpbft.PowerEntries, 0, len(ptm))
249+
for _, pe := range ptm {
250+
pt = append(pt, pe)
251+
}
252+
sort.Sort(pt)
253+
return pt
254+
}
255+
239256
// Apply a set of power table diffs to the passed power table.
240257
//
241258
// - The delta must be sorted by participant ID, ascending.
242259
// - The returned power table is sorted by power, descending.
243260
func ApplyPowerTableDiffs(prevPowerTable gpbft.PowerEntries, diffs ...PowerTableDiff) (gpbft.PowerEntries, error) {
244-
powerTableMap := make(map[gpbft.ActorID]gpbft.PowerEntry, len(prevPowerTable))
245-
for _, pe := range prevPowerTable {
246-
powerTableMap[pe.ID] = pe
261+
powerTableMap := PowerTableArrayToMap(prevPowerTable)
262+
powerTableMap, err := ApplyPowerTableDiffsToMap(powerTableMap, diffs...)
263+
if err != nil {
264+
return nil, err
247265
}
266+
newPowerTable := PowerTableMapToArray(powerTableMap)
267+
return newPowerTable, nil
268+
}
269+
270+
func ApplyPowerTableDiffsToMap(powerTableMap map[gpbft.ActorID]gpbft.PowerEntry, diffs ...PowerTableDiff) (map[gpbft.ActorID]gpbft.PowerEntry, error) {
248271
for j, diff := range diffs {
249272
var lastActorId gpbft.ActorID
250273
for i, d := range diff {
@@ -298,17 +321,10 @@ func ApplyPowerTableDiffs(prevPowerTable gpbft.PowerEntries, diffs ...PowerTable
298321
default: // if the power becomes negative, something went wrong
299322
return nil, fmt.Errorf("diff %d resulted in negative power for participant %d", j, pe.ID)
300323
}
301-
302324
}
303325
}
304326

305-
newPowerTable := make(gpbft.PowerEntries, 0, len(powerTableMap))
306-
for _, pe := range powerTableMap {
307-
newPowerTable = append(newPowerTable, pe)
308-
}
309-
310-
sort.Sort(newPowerTable)
311-
return newPowerTable, nil
327+
return powerTableMap, nil
312328
}
313329

314330
// MakePowerTableCID returns the DagCBOR-blake2b256 CID of the given power entries. This method does

certstore/snapshot.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func importSnapshotToDatastoreWithTestingPowerTableFrequency(ctx context.Context
110110
if err != nil {
111111
return err
112112
}
113-
pt := header.InitialPowerTable
113+
ptm := certs.PowerTableArrayToMap(header.InitialPowerTable)
114114
for {
115115
certBytes, err := readSnapshotBlockBytes(snapshot)
116116
if err == io.EOF {
@@ -123,10 +123,11 @@ func importSnapshotToDatastoreWithTestingPowerTableFrequency(ctx context.Context
123123
if err = cs.Put(ctx, &cert); err != nil {
124124
return err
125125
}
126-
if pt, err = certs.ApplyPowerTableDiffs(pt, cert.PowerTableDelta); err != nil {
126+
if ptm, err = certs.ApplyPowerTableDiffsToMap(ptm, cert.PowerTableDelta); err != nil {
127127
return err
128128
}
129129
if (cert.GPBFTInstance+1)%cs.powerTableFrequency == 0 {
130+
pt := certs.PowerTableMapToArray(ptm)
130131
if err := cs.putPowerTable(ctx, cert.GPBFTInstance+1, pt); err != nil {
131132
return err
132133
}

0 commit comments

Comments
 (0)