satellite/satellitedb: don't include DQd and exited nodes in DQStrayNodes
Don't update DQ time of already DQd nodes. Don't DQ nodes who exited. Change-Id: I4528a9ba9f8e278987165ad337a9b34dadb9788b
This commit is contained in:
parent
3c49f0ff73
commit
549033f2e6
@ -21,22 +21,52 @@ import (
|
|||||||
|
|
||||||
func TestDQNodesLastSeenBefore(t *testing.T) {
|
func TestDQNodesLastSeenBefore(t *testing.T) {
|
||||||
testplanet.Run(t, testplanet.Config{
|
testplanet.Run(t, testplanet.Config{
|
||||||
SatelliteCount: 1, StorageNodeCount: 1,
|
SatelliteCount: 1, StorageNodeCount: 2,
|
||||||
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
||||||
node := planet.StorageNodes[0]
|
planet.Satellites[0].Overlay.DQStrayNodes.Loop.Pause()
|
||||||
node.Contact.Chore.Pause(ctx)
|
|
||||||
|
node1 := planet.StorageNodes[0]
|
||||||
|
node2 := planet.StorageNodes[1]
|
||||||
|
node1.Contact.Chore.Pause(ctx)
|
||||||
|
node2.Contact.Chore.Pause(ctx)
|
||||||
|
|
||||||
cache := planet.Satellites[0].Overlay.DB
|
cache := planet.Satellites[0].Overlay.DB
|
||||||
|
|
||||||
info, err := cache.Get(ctx, node.ID())
|
// initial check that node1 is not disqualified
|
||||||
|
n1Info, err := cache.Get(ctx, node1.ID())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Nil(t, info.Disqualified)
|
require.Nil(t, n1Info.Disqualified)
|
||||||
|
|
||||||
|
// gracefully exit node2
|
||||||
|
req := &overlay.ExitStatusRequest{
|
||||||
|
NodeID: node2.ID(),
|
||||||
|
ExitInitiatedAt: time.Now(),
|
||||||
|
ExitLoopCompletedAt: time.Now(),
|
||||||
|
ExitFinishedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
dossier, err := cache.UpdateExitStatus(ctx, req)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, dossier.ExitStatus.ExitFinishedAt)
|
||||||
|
|
||||||
|
// check that node1 is disqualified and node2 is not
|
||||||
require.NoError(t, cache.DQNodesLastSeenBefore(ctx, time.Now()))
|
require.NoError(t, cache.DQNodesLastSeenBefore(ctx, time.Now()))
|
||||||
|
|
||||||
info, err = cache.Get(ctx, node.ID())
|
n1Info, err = cache.Get(ctx, node1.ID())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotNil(t, info.Disqualified)
|
require.NotNil(t, n1Info.Disqualified)
|
||||||
|
n1DQTime := n1Info.Disqualified
|
||||||
|
|
||||||
|
n2Info, err := cache.Get(ctx, node2.ID())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Nil(t, n2Info.Disqualified)
|
||||||
|
|
||||||
|
// check that node1 DQ time is not overwritten
|
||||||
|
require.NoError(t, cache.DQNodesLastSeenBefore(ctx, time.Now()))
|
||||||
|
|
||||||
|
n1Info, err = cache.Get(ctx, node1.ID())
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, n1DQTime, n1Info.Disqualified)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1553,10 +1553,14 @@ func (cache *overlaycache) populateUpdateFields(dbNode *dbx.Node, updateReq *ove
|
|||||||
return updateFields
|
return updateFields
|
||||||
}
|
}
|
||||||
|
|
||||||
// DQNodesLastSeenBefore disqualifies all nodes where last_contact_success < cutoff.
|
// DQNodesLastSeenBefore disqualifies all nodes where last_contact_success < cutoff except those already disqualified
|
||||||
|
// or gracefully exited.
|
||||||
func (cache *overlaycache) DQNodesLastSeenBefore(ctx context.Context, cutoff time.Time) (err error) {
|
func (cache *overlaycache) DQNodesLastSeenBefore(ctx context.Context, cutoff time.Time) (err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
q := `UPDATE nodes SET disqualified = current_timestamp WHERE last_contact_success < $1;`
|
q := `UPDATE nodes SET disqualified = current_timestamp
|
||||||
|
WHERE last_contact_success < $1
|
||||||
|
AND disqualified is NULL
|
||||||
|
AND exit_finished_at is NULL;`
|
||||||
_, err = cache.db.ExecContext(ctx, q, cutoff)
|
_, err = cache.db.ExecContext(ctx, q, cutoff)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user