Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Fixed pool rewards not getting exported when creating a snapshot with targetEpoch 0 #971

Merged
merged 3 commits into from
May 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading