@@ -47,6 +47,14 @@ func TestHeartbeat_Cleanup(t *testing.T) {
47
47
<- waitForCleanup
48
48
return nil
49
49
})
50
+ mStore .EXPECT ().CleanTailnetLostPeers (gomock .Any ()).MinTimes (2 ).DoAndReturn (func (_ context.Context ) error {
51
+ <- waitForCleanup
52
+ return nil
53
+ })
54
+ mStore .EXPECT ().CleanTailnetTunnels (gomock .Any ()).MinTimes (2 ).DoAndReturn (func (_ context.Context ) error {
55
+ <- waitForCleanup
56
+ return nil
57
+ })
50
58
51
59
uut := & heartbeats {
52
60
ctx : ctx ,
@@ -56,7 +64,7 @@ func TestHeartbeat_Cleanup(t *testing.T) {
56
64
}
57
65
go uut .cleanupLoop ()
58
66
59
- for i := 0 ; i < 2 ; i ++ {
67
+ for i := 0 ; i < 6 ; i ++ {
60
68
select {
61
69
case <- ctx .Done ():
62
70
t .Fatal ("timeout" )
@@ -67,6 +75,104 @@ func TestHeartbeat_Cleanup(t *testing.T) {
67
75
close (waitForCleanup )
68
76
}
69
77
78
+ // TestLostPeerCleanupQueries tests that our SQL queries to clean up lost peers do what we expect,
79
+ // that is, clean up peers and associated tunnels that have been lost for over 24 hours.
80
+ func TestLostPeerCleanupQueries (t * testing.T ) {
81
+ t .Parallel ()
82
+ if ! dbtestutil .WillUsePostgres () {
83
+ t .Skip ("test only with postgres" )
84
+ }
85
+ store , _ , sqlDB := dbtestutil .NewDBWithSQLDB (t , dbtestutil .WithDumpOnFailure ())
86
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitShort )
87
+ defer cancel ()
88
+
89
+ coordID := uuid .New ()
90
+ _ , err := store .UpsertTailnetCoordinator (ctx , coordID )
91
+ require .NoError (t , err )
92
+
93
+ peerID := uuid .New ()
94
+ _ , err = store .UpsertTailnetPeer (ctx , database.UpsertTailnetPeerParams {
95
+ ID : peerID ,
96
+ CoordinatorID : coordID ,
97
+ Node : []byte ("test" ),
98
+ Status : database .TailnetStatusLost ,
99
+ })
100
+ require .NoError (t , err )
101
+
102
+ otherID := uuid .New ()
103
+ _ , err = store .UpsertTailnetTunnel (ctx , database.UpsertTailnetTunnelParams {
104
+ CoordinatorID : coordID ,
105
+ SrcID : peerID ,
106
+ DstID : otherID ,
107
+ })
108
+ require .NoError (t , err )
109
+
110
+ peers , err := store .GetAllTailnetPeers (ctx )
111
+ require .NoError (t , err )
112
+ require .Len (t , peers , 1 )
113
+ require .Equal (t , peerID , peers [0 ].ID )
114
+
115
+ tunnels , err := store .GetAllTailnetTunnels (ctx )
116
+ require .NoError (t , err )
117
+ require .Len (t , tunnels , 1 )
118
+ require .Equal (t , peerID , tunnels [0 ].SrcID )
119
+ require .Equal (t , otherID , tunnels [0 ].DstID )
120
+
121
+ // this clean is a noop since the peer and tunnel are less than 24h old
122
+ err = store .CleanTailnetLostPeers (ctx )
123
+ require .NoError (t , err )
124
+ err = store .CleanTailnetTunnels (ctx )
125
+ require .NoError (t , err )
126
+
127
+ peers , err = store .GetAllTailnetPeers (ctx )
128
+ require .NoError (t , err )
129
+ require .Len (t , peers , 1 )
130
+ require .Equal (t , peerID , peers [0 ].ID )
131
+
132
+ tunnels , err = store .GetAllTailnetTunnels (ctx )
133
+ require .NoError (t , err )
134
+ require .Len (t , tunnels , 1 )
135
+ require .Equal (t , peerID , tunnels [0 ].SrcID )
136
+ require .Equal (t , otherID , tunnels [0 ].DstID )
137
+
138
+ // set the age of the tunnel to >24h
139
+ sqlDB .Exec ("UPDATE tailnet_tunnels SET updated_at = $1" , time .Now ().Add (- 25 * time .Hour ))
140
+
141
+ // this clean is still a noop since the peer hasn't been lost for 24 hours
142
+ err = store .CleanTailnetLostPeers (ctx )
143
+ require .NoError (t , err )
144
+ err = store .CleanTailnetTunnels (ctx )
145
+ require .NoError (t , err )
146
+
147
+ peers , err = store .GetAllTailnetPeers (ctx )
148
+ require .NoError (t , err )
149
+ require .Len (t , peers , 1 )
150
+ require .Equal (t , peerID , peers [0 ].ID )
151
+
152
+ tunnels , err = store .GetAllTailnetTunnels (ctx )
153
+ require .NoError (t , err )
154
+ require .Len (t , tunnels , 1 )
155
+ require .Equal (t , peerID , tunnels [0 ].SrcID )
156
+ require .Equal (t , otherID , tunnels [0 ].DstID )
157
+
158
+ // set the age of the tunnel to >24h
159
+ sqlDB .Exec ("UPDATE tailnet_peers SET updated_at = $1" , time .Now ().Add (- 25 * time .Hour ))
160
+
161
+ // this clean removes the peer and the associated tunnel
162
+ err = store .CleanTailnetLostPeers (ctx )
163
+ require .NoError (t , err )
164
+ err = store .CleanTailnetTunnels (ctx )
165
+ require .NoError (t , err )
166
+
167
+ peers , err = store .GetAllTailnetPeers (ctx )
168
+ require .NoError (t , err )
169
+ require .Len (t , peers , 0 )
170
+
171
+ tunnels , err = store .GetAllTailnetTunnels (ctx )
172
+ require .NoError (t , err )
173
+ require .Len (t , tunnels , 0 )
174
+ }
175
+
70
176
func TestDebugTemplate (t * testing.T ) {
71
177
t .Parallel ()
72
178
if runtime .GOOS == "windows" {
0 commit comments