Skip to content

Commit

Permalink
Merge pull request #971 from iotaledger/fix/export-epoch0
Browse files Browse the repository at this point in the history
Fixed pool rewards not getting exported when creating a snapshot with targetEpoch 0
  • Loading branch information
alexsporn authored May 14, 2024
2 parents cd2c505 + dc72db4 commit 44f0f3c
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ func (m *Manager) createCommitment(slot iotago.SlotIndex) (*model.Commitment, er
rmc,
)

m.LogDebug("Committing", "commitment", newCommitment, "roots ", roots)
m.LogInfo("Committing", "commitment", newCommitment, "roots ", roots)

newModelCommitment, err := model.CommitmentFromCommitment(newCommitment, apiForSlot, serix.WithValidation())
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -293,52 +293,58 @@ func (t *Tracker) exportPoolRewards(writer io.WriteSeeker, targetEpoch iotago.Ep

if err := stream.WriteCollection(writer, serializer.SeriLengthPrefixTypeAsUint32, func() (int, error) {
var epochCount int
// Here underflow will not happen because we will stop iterating for epoch 0, because 0 is not greater than zero.
// Use safemath here anyway to avoid hard to trace problems stemming from an accidental underflow.
for epoch := targetEpoch; epoch > earliestRewardEpoch; epoch = lo.PanicOnErr(safemath.SafeSub(epoch, 1)) {
// Start at the targest epoch and go back in time until earliestRewardEpoch or epoch 0 (included)
epoch := targetEpoch
for {
rewardsMap, err := t.rewardsMap(epoch)
if err != nil {
return 0, ierrors.Wrapf(err, "unable to get rewards tree for epoch %d", epoch)
}
// if the map was not present in storage we can skip this epoch
if !rewardsMap.WasRestoredFromStorage() {
t.LogDebug("Skipping epoch", "epoch", epoch, "reason", "not restored from storage")
continue
}

t.LogDebug("Exporting Pool Rewards", "epoch", epoch)
if rewardsMap.WasRestoredFromStorage() {
t.LogDebug("Exporting Pool Rewards", "epoch", epoch)

if err := stream.Write(writer, epoch); err != nil {
return 0, ierrors.Wrapf(err, "unable to write epoch index for epoch index %d", epoch)
}
if err := stream.Write(writer, epoch); err != nil {
return 0, ierrors.Wrapf(err, "unable to write epoch index for epoch index %d", epoch)
}

if err := stream.WriteCollection(writer, serializer.SeriLengthPrefixTypeAsUint64, func() (int, error) {
var accountCount int
if err := stream.WriteCollection(writer, serializer.SeriLengthPrefixTypeAsUint64, func() (int, error) {
var accountCount int

if err = rewardsMap.Stream(func(key iotago.AccountID, value *model.PoolRewards) error {
if err := stream.Write(writer, key); err != nil {
return ierrors.Wrapf(err, "unable to write account id for epoch %d and accountID %s", epoch, key)
}
if err = rewardsMap.Stream(func(key iotago.AccountID, value *model.PoolRewards) error {
if err := stream.Write(writer, key); err != nil {
return ierrors.Wrapf(err, "unable to write account id for epoch %d and accountID %s", epoch, key)
}

if err := stream.WriteObject(writer, value, (*model.PoolRewards).Bytes); err != nil {
return ierrors.Wrapf(err, "unable to write account rewards for epoch index %d and accountID %s", epoch, key)
}
if err := stream.WriteObject(writer, value, (*model.PoolRewards).Bytes); err != nil {
return ierrors.Wrapf(err, "unable to write account rewards for epoch index %d and accountID %s", epoch, key)
}

t.LogDebug("Exporting Pool Reward", "epoch", epoch, "accountID", key, "rewards", value)
t.LogDebug("Exporting Pool Reward", "epoch", epoch, "accountID", key, "rewards", value)

accountCount++
accountCount++

return nil
return nil
}); err != nil {
return 0, ierrors.Wrapf(err, "unable to stream rewards for epoch index %d", epoch)
}

return accountCount, nil
}); err != nil {
return 0, ierrors.Wrapf(err, "unable to stream rewards for epoch index %d", epoch)
return 0, ierrors.Wrapf(err, "unable to write rewards for epoch index %d", epoch)
}

return accountCount, nil
}); err != nil {
return 0, ierrors.Wrapf(err, "unable to write rewards for epoch index %d", epoch)
epochCount++
} else {
// if the map was not present in storage we can skip this epoch
t.LogDebug("Skipping epoch", "epoch", epoch, "reason", "not restored from storage")
}

epochCount++
if epoch <= earliestRewardEpoch {
// Every reward before earliestRewardEpoch is already exported, so stop here
break
}
epoch = lo.PanicOnErr(safemath.SafeSub(epoch, 1))
}

return epochCount, nil
Expand Down

0 comments on commit 44f0f3c

Please sign in to comment.