Skip to content

Commit

Permalink
tortoise: cap ballot layer by current according to the clock
Browse files Browse the repository at this point in the history
  • Loading branch information
dshulyak committed Aug 13, 2023
1 parent 7668357 commit 437777a
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 12 deletions.
3 changes: 2 additions & 1 deletion node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,8 @@ func (app *App) initServices(ctx context.Context) error {
trtlopts = append(trtlopts, tortoise.WithTracer())
}
trtl, err := tortoise.Recover(
app.cachedDB, beaconProtocol, trtlopts...,
app.cachedDB,
app.clock.CurrentLayer(), beaconProtocol, trtlopts...,
)
if err != nil {
return fmt.Errorf("can't recover tortoise state: %w", err)
Expand Down
2 changes: 1 addition & 1 deletion tortoise/model/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ func (c *core) OnMessage(m Messenger, event Message) {
m.Send(MessageBallot{Ballot: ballot})
case MessageLayerEnd:
if ev.LayerID.After(types.GetEffectiveGenesis()) {
tortoise.RecoverLayer(context.Background(), c.tortoise, c.cdb, c.beacons, ev.LayerID)
tortoise.RecoverLayer(context.Background(), c.tortoise, c.cdb, c.beacons, ev.LayerID, ev.LayerID)
m.Notify(EventVerified{ID: c.id, Verified: c.tortoise.LatestComplete(), Layer: ev.LayerID})
}

Expand Down
10 changes: 6 additions & 4 deletions tortoise/recover.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
)

// Recover tortoise state from database.
func Recover(db *datastore.CachedDB, beacon system.BeaconGetter, opts ...Opt) (*Tortoise, error) {
func Recover(db *datastore.CachedDB, latest types.LayerID, beacon system.BeaconGetter, opts ...Opt) (*Tortoise, error) {
trtl, err := New(opts...)
if err != nil {
return nil, err
Expand Down Expand Up @@ -57,7 +57,7 @@ func Recover(db *datastore.CachedDB, beacon system.BeaconGetter, opts ...Opt) (*
}
}
for lid := types.GetEffectiveGenesis().Add(1); !lid.After(layer); lid = lid.Add(1) {
if err := RecoverLayer(context.Background(), trtl, db, beacon, lid); err != nil {
if err := RecoverLayer(context.Background(), trtl, db, beacon, lid, types.MinLayer(layer, latest)); err != nil {
return nil, fmt.Errorf("failed to load tortoise state at layer %d: %w", lid, err)
}
}
Expand All @@ -78,7 +78,7 @@ func recoverEpoch(epoch types.EpochID, trtl *Tortoise, db *datastore.CachedDB, b
return nil
}

func RecoverLayer(ctx context.Context, trtl *Tortoise, db *datastore.CachedDB, beacon system.BeaconGetter, lid types.LayerID) error {
func RecoverLayer(ctx context.Context, trtl *Tortoise, db *datastore.CachedDB, beacon system.BeaconGetter, lid, current types.LayerID) error {
if lid.FirstInEpoch() {
if err := recoverEpoch(lid.GetEpoch(), trtl, db, beacon); err != nil {
return err
Expand Down Expand Up @@ -120,7 +120,9 @@ func RecoverLayer(ctx context.Context, trtl *Tortoise, db *datastore.CachedDB, b
if err == nil {
trtl.OnWeakCoin(lid, coin)
}
trtl.TallyVotes(ctx, lid)
if lid <= current {
trtl.TallyVotes(ctx, lid)
}
opinion, err := layers.GetAggregatedHash(db, lid-1)
if err == nil {
trtl.resetPending(lid-1, opinion)
Expand Down
8 changes: 4 additions & 4 deletions tortoise/recover_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func (a *recoveryAdapter) TallyVotes(ctx context.Context, current types.LayerID)
a.prev = genesis
}
for lid := a.prev; lid <= current; lid++ {
require.NoError(a, RecoverLayer(ctx, a.Tortoise, a.db, a.beacon, lid))
require.NoError(a, RecoverLayer(ctx, a.Tortoise, a.db, a.beacon, lid, current))
a.prev = lid
}
}
Expand All @@ -52,7 +52,7 @@ func TestRecoverState(t *testing.T) {
}
require.Equal(t, last.Sub(1), verified)

tortoise2, err := Recover(s.GetState(0).DB, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
tortoise2, err := Recover(s.GetState(0).DB, last, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
require.NoError(t, err)
verified = tortoise2.LatestComplete()
require.Equal(t, last.Sub(1), verified)
Expand All @@ -69,7 +69,7 @@ func TestRecoverEmpty(t *testing.T) {

cfg := defaultTestConfig()
cfg.LayerSize = size
tortoise, err := Recover(s.GetState(0).DB, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
tortoise, err := Recover(s.GetState(0).DB, 100, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
require.NoError(t, err)
require.NotNil(t, tortoise)
}
Expand All @@ -93,7 +93,7 @@ func TestRecoverWithOpinion(t *testing.T) {
}
last = rst
}
tortoise, err := Recover(s.GetState(0).DB, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
tortoise, err := Recover(s.GetState(0).DB, last.Layer, s.GetState(0).Beacons, WithLogger(logtest.New(t)), WithConfig(cfg))
require.NoError(t, err)
require.NotNil(t, tortoise)
updates := tortoise.Updates()
Expand Down
5 changes: 3 additions & 2 deletions tortoise/tracer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ func TestTracer(t *testing.T) {
for i := 0; i < 100; i++ {
s.Next()
}
trt.TallyVotes(ctx, s.Next())
last := s.Next()
trt.TallyVotes(ctx, last)
trt.Updates() // just trace final result
t.Run("live", func(t *testing.T) {
t.Parallel()
Expand All @@ -42,7 +43,7 @@ func TestTracer(t *testing.T) {
t.Run("recover", func(t *testing.T) {
t.Parallel()
path := filepath.Join(t.TempDir(), "tortoise.trace")
trt, err := Recover(s.GetState(0).DB, s.GetState(0).Beacons, WithTracer(WithOutput(path)))
trt, err := Recover(s.GetState(0).DB, last, s.GetState(0).Beacons, WithTracer(WithOutput(path)))
require.NoError(t, err)
trt.Updates()
trt.Results(types.GetEffectiveGenesis(), trt.LatestComplete())
Expand Down

0 comments on commit 437777a

Please sign in to comment.