Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
db1c24f27b |
@@ -1965,16 +1965,10 @@ func TestUpdatePeerBatchStoresTheEarliestAndLatestTimesOfANewPeer(
|
|||||||
// of first_seen and last_seen, as when a collector catches up on a backlog.
|
// of first_seen and last_seen, as when a collector catches up on a backlog.
|
||||||
const backlogAge = 24 * time.Hour
|
const backlogAge = 24 * time.Hour
|
||||||
|
|
||||||
// batchSpan is how much earlier a batch's First is than its Last in the tests
|
|
||||||
// of first_seen and last_seen.
|
|
||||||
const batchSpan = time.Hour
|
|
||||||
|
|
||||||
// TestOlderWriteKeepsLastSeenAndLowersFirstSeen writes a row of each of asns,
|
// TestOlderWriteKeepsLastSeenAndLowersFirstSeen writes a row of each of asns,
|
||||||
// peerings and bgp_peers through each function that writes one: first at a
|
// peerings and bgp_peers through each function that writes one: first at a
|
||||||
// newer time, then at an older one. Each row keeps the newer last_seen and
|
// newer time, then at an older one. Each row keeps the newer last_seen and
|
||||||
// takes the older first_seen. Each function writes a row of its own. A batch
|
// takes the older first_seen. Each function writes a row of its own.
|
||||||
// write's First is batchSpan before its Last, so the test catches the two
|
|
||||||
// swapped. A single-row write takes one time.
|
|
||||||
func TestOlderWriteKeepsLastSeenAndLowersFirstSeen(t *testing.T) {
|
func TestOlderWriteKeepsLastSeenAndLowersFirstSeen(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -1994,57 +1988,53 @@ func TestOlderWriteKeepsLastSeenAndLowersFirstSeen(t *testing.T) {
|
|||||||
"WHERE peer_ip = ?"
|
"WHERE peer_ip = ?"
|
||||||
)
|
)
|
||||||
|
|
||||||
checkOlderWrite(t, db, func(seen SeenTimes) error {
|
checkOlderWrite(t, db, func(at time.Time) error {
|
||||||
return db.GetOrCreateASNBatch(map[int]SeenTimes{batchASN: seen})
|
return db.GetOrCreateASNBatch(
|
||||||
}, batchSpan, asnQuery, batchASN)
|
map[int]SeenTimes{batchASN: {First: at, Last: at}})
|
||||||
|
}, asnQuery, batchASN)
|
||||||
|
|
||||||
checkOlderWrite(t, db, func(seen SeenTimes) error {
|
checkOlderWrite(t, db, func(at time.Time) error {
|
||||||
_, err := db.GetOrCreateASN(singleASN, seen.Last)
|
_, err := db.GetOrCreateASN(singleASN, at)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, 0, asnQuery, singleASN)
|
}, asnQuery, singleASN)
|
||||||
|
|
||||||
checkOlderWrite(t, db, func(seen SeenTimes) error {
|
checkOlderWrite(t, db, func(at time.Time) error {
|
||||||
return db.RecordPeering(batchASN, singleASN, seen)
|
return db.RecordPeering(batchASN, singleASN,
|
||||||
}, batchSpan, peeringQuery, batchASN, singleASN)
|
SeenTimes{First: at, Last: at})
|
||||||
|
}, peeringQuery, batchASN, singleASN)
|
||||||
|
|
||||||
checkOlderWrite(t, db, func(seen SeenTimes) error {
|
checkOlderWrite(t, db, func(at time.Time) error {
|
||||||
return db.UpdatePeerBatch(map[string]PeerUpdate{
|
return db.UpdatePeerBatch(map[string]PeerUpdate{
|
||||||
testV4PeerIP: {
|
testV4PeerIP: {
|
||||||
PeerIP: testV4PeerIP, PeerASN: peerASN,
|
PeerIP: testV4PeerIP, PeerASN: peerASN,
|
||||||
MessageType: ristypes.MessageTypeUpdate,
|
MessageType: ristypes.MessageTypeUpdate,
|
||||||
Seen: seen,
|
Seen: SeenTimes{First: at, Last: at},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}, batchSpan, peerQuery, testV4PeerIP)
|
}, peerQuery, testV4PeerIP)
|
||||||
|
|
||||||
checkOlderWrite(t, db, func(seen SeenTimes) error {
|
checkOlderWrite(t, db, func(at time.Time) error {
|
||||||
return db.UpdatePeer(testPeerIP, peerASN, ristypes.MessageTypeUpdate,
|
return db.UpdatePeer(testPeerIP, peerASN, ristypes.MessageTypeUpdate, at)
|
||||||
seen.Last)
|
}, peerQuery, testPeerIP)
|
||||||
}, 0, peerQuery, testPeerIP)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkOlderWrite calls write twice, each time with First span before Last:
|
// checkOlderWrite calls write at a newer time, then at a time backlogAge older.
|
||||||
// first at newer times, then at times backlogAge older. It checks that query,
|
// It checks that query, given args, reads first_seen at the older time and
|
||||||
// given args, reads the older write's First as first_seen and the newer write's
|
// last_seen at the newer one.
|
||||||
// Last as last_seen.
|
|
||||||
func checkOlderWrite(
|
func checkOlderWrite(
|
||||||
t *testing.T, db *Database, write func(seen SeenTimes) error,
|
t *testing.T, db *Database, write func(at time.Time) error,
|
||||||
span time.Duration, query string, args ...any,
|
query string, args ...any,
|
||||||
) {
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
newerLast := time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC)
|
newer := time.Date(2026, 1, 2, 3, 4, 5, 0, time.UTC)
|
||||||
newer := SeenTimes{First: newerLast.Add(-span), Last: newerLast}
|
older := newer.Add(-backlogAge)
|
||||||
older := SeenTimes{
|
|
||||||
First: newer.First.Add(-backlogAge),
|
|
||||||
Last: newer.Last.Add(-backlogAge),
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, seen := range []SeenTimes{newer, older} {
|
for _, at := range []time.Time{newer, older} {
|
||||||
err := write(seen)
|
err := write(at)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("writing first %s, last %s: %v", seen.First, seen.Last, err)
|
t.Fatalf("writing at %s: %v", at, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2056,9 +2046,9 @@ func checkOlderWrite(
|
|||||||
t.Fatalf("reading the row: %v", err)
|
t.Fatalf("reading the row: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !firstSeen.Equal(older.First) || !lastSeen.Equal(newer.Last) {
|
if !firstSeen.Equal(older) || !lastSeen.Equal(newer) {
|
||||||
t.Errorf("first seen %s, last seen %s; want %s, %s",
|
t.Errorf("first seen %s, last seen %s; want %s, %s",
|
||||||
firstSeen, lastSeen, older.First, newer.Last)
|
firstSeen, lastSeen, older, newer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user