diff --git a/network/dataStructures/roundData.go b/network/dataStructures/roundData.go index 986ab960adcc0e32a7c77296b946a33a9d3f3cda..2c98af73e904eeb2ab005bf67bee77c5f8596fb2 100644 --- a/network/dataStructures/roundData.go +++ b/network/dataStructures/roundData.go @@ -57,3 +57,8 @@ func (d *Data) GetRound(id int) (*mixmessages.RoundInfo, error) { func (d *Data) GetLastRoundID() id.Round { return id.Round(d.rounds.GetNewestId()) } + +// Gets the ID of the oldest roundd in the buffer +func (d *Data) GetOldestRoundID() id.Round { + return id.Round(d.rounds.GetOldestId()) +} diff --git a/network/instance.go b/network/instance.go index ae67a6061c603fe68819f3cdcdadbc934824089c..2891bed0416c3520e6d3caf139e3bb2fccc14db6 100644 --- a/network/instance.go +++ b/network/instance.go @@ -519,6 +519,11 @@ func (i *Instance) GetLastRoundID() id.Round { return i.roundData.GetLastRoundID() - 1 } +// Get the oldest round id +func (i *Instance) GetOldestRoundID() id.Round { + return i.roundData.GetOldestRoundID() +} + // Update gateway hosts based on most complete ndf func (i *Instance) UpdateGatewayConnections() error { if i.full != nil { diff --git a/network/instance_test.go b/network/instance_test.go index 80f5563a925aba1cf62ae6d12492ec36c3bbce5c..a5c9d5fade400f0acda93ce84be7f638472d7de9 100644 --- a/network/instance_test.go +++ b/network/instance_test.go @@ -316,6 +316,49 @@ func TestInstance_GetLastUpdateID(t *testing.T) { i.GetLastUpdateID() } +func TestInstance_GetOldestRoundID(t *testing.T) { + i := Instance{ + roundData: ds.NewData(), + } + + expectedOldRound := id.Round(0) + _ = i.roundData.UpsertRound(&mixmessages.RoundInfo{ID: uint64(expectedOldRound)}) + _ = i.roundData.UpsertRound(&mixmessages.RoundInfo{ID:uint64(2)}) + + + returned := i.GetOldestRoundID() + if returned != expectedOldRound { + t.Errorf("Failed to get oldest round from buffer." + + "\n\tExpected: %v" + + "\n\tReceived: %v", expectedOldRound, returned) + } +} + +// Test which forces a full buffer, causing overwriting of old rounds +func TestInstance_GetOldestRoundID_ManyRounds(t *testing.T) { + testInstance := Instance{ + roundData: ds.NewData(), + } + + // Ensure a circle back in the round buffer + for i := 1; i <= ds.RoundInfoBufLen ; i++ { + _ = testInstance.roundData.UpsertRound(&mixmessages.RoundInfo{ID: uint64(i)}) + + } + + // This will have oldest round as 0, until we reach RoundInfoBufLen, then + // round 0 will be overwritten by the newest round, + // moving the oldest round to round 1 + expected := id.Round(1) + returned := testInstance.GetOldestRoundID() + if returned != expected { + t.Errorf("Failed to get oldest round from buffer." + + "\n\tExpected: %v" + + "\n\tReceived: %v", 1, returned) + } +} + + func TestInstance_UpdateGatewayConnections(t *testing.T) { secured, _ := NewSecuredNdf(testutils.NDF) testManager := connect.NewManagerTesting(t)