mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
fix: wait for PGCoordinator to clean up db state (#13351)
c.f. https://github.com/coder/coder/pull/13192#issuecomment-2097657692 We need to wait for PGCoordinator to finish its work before returning on `Close()`, so that we delete database state (best effort -- if this fails others will filter it out based on heartbeats).
This commit is contained in:
@@ -864,6 +864,53 @@ func TestPGCoordinator_Lost(t *testing.T) {
|
||||
agpltest.LostTest(ctx, t, coordinator)
|
||||
}
|
||||
|
||||
func TestPGCoordinator_DeleteOnClose(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitSuperLong)
|
||||
defer cancel()
|
||||
ctrl := gomock.NewController(t)
|
||||
mStore := dbmock.NewMockStore(ctrl)
|
||||
ps := pubsub.NewInMemory()
|
||||
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)
|
||||
|
||||
upsertDone := make(chan struct{})
|
||||
deleteCalled := make(chan struct{})
|
||||
finishDelete := make(chan struct{})
|
||||
mStore.EXPECT().UpsertTailnetCoordinator(gomock.Any(), gomock.Any()).
|
||||
MinTimes(1).
|
||||
Do(func(_ context.Context, _ uuid.UUID) { close(upsertDone) }).
|
||||
Return(database.TailnetCoordinator{}, nil)
|
||||
mStore.EXPECT().DeleteCoordinator(gomock.Any(), gomock.Any()).
|
||||
Times(1).
|
||||
Do(func(_ context.Context, _ uuid.UUID) {
|
||||
close(deleteCalled)
|
||||
<-finishDelete
|
||||
}).
|
||||
Return(nil)
|
||||
|
||||
// extra calls we don't particularly care about for this test
|
||||
mStore.EXPECT().CleanTailnetCoordinators(gomock.Any()).AnyTimes().Return(nil)
|
||||
mStore.EXPECT().CleanTailnetLostPeers(gomock.Any()).AnyTimes().Return(nil)
|
||||
mStore.EXPECT().CleanTailnetTunnels(gomock.Any()).AnyTimes().Return(nil)
|
||||
|
||||
uut, err := tailnet.NewPGCoord(ctx, logger, ps, mStore)
|
||||
require.NoError(t, err)
|
||||
testutil.RequireRecvCtx(ctx, t, upsertDone)
|
||||
closeErr := make(chan error, 1)
|
||||
go func() {
|
||||
closeErr <- uut.Close()
|
||||
}()
|
||||
select {
|
||||
case <-closeErr:
|
||||
t.Fatal("close returned before DeleteCoordinator called")
|
||||
case <-deleteCalled:
|
||||
close(finishDelete)
|
||||
err := testutil.RequireRecvCtx(ctx, t, closeErr)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
type testConn struct {
|
||||
ws, serverWS net.Conn
|
||||
nodeChan chan []*agpl.Node
|
||||
|
||||
Reference in New Issue
Block a user