Skip to content

Commit afbda22

Browse files
authored
fix: insert replica when removed by cleanup (coder#10917)
1 parent 52901e1 commit afbda22

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

enterprise/replicasync/replicasync.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,26 @@ func (m *Manager) syncReplicas(ctx context.Context) error {
331331
Primary: m.self.Primary,
332332
})
333333
if err != nil {
334-
return xerrors.Errorf("update replica: %w", err)
334+
if !errors.Is(err, sql.ErrNoRows) {
335+
return xerrors.Errorf("update replica: %w", err)
336+
}
337+
// self replica has been cleaned up, we must reinsert
338+
// nolint:gocritic // Updating a replica is a system function.
339+
replica, err = m.db.InsertReplica(dbauthz.AsSystemRestricted(ctx), database.InsertReplicaParams{
340+
ID: m.self.ID,
341+
CreatedAt: dbtime.Now(),
342+
UpdatedAt: dbtime.Now(),
343+
StartedAt: m.self.StartedAt,
344+
RelayAddress: m.self.RelayAddress,
345+
RegionID: m.self.RegionID,
346+
Hostname: m.self.Hostname,
347+
Version: m.self.Version,
348+
DatabaseLatency: int32(databaseLatency.Microseconds()),
349+
Primary: m.self.Primary,
350+
})
351+
if err != nil {
352+
return xerrors.Errorf("update replica: %w", err)
353+
}
335354
}
336355
if m.self.Error != replica.Error {
337356
// Publish an update occurred!

enterprise/replicasync/replicasync_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,25 @@ func TestReplica(t *testing.T) {
255255
}
256256
wg.Wait()
257257
})
258+
t.Run("UpsertAfterDelete", func(t *testing.T) {
259+
t.Parallel()
260+
db, pubsub := dbtestutil.NewDB(t)
261+
ctx, cancelCtx := context.WithCancel(context.Background())
262+
defer cancelCtx()
263+
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
264+
RelayAddress: "google.com",
265+
CleanupInterval: time.Millisecond,
266+
UpdateInterval: time.Millisecond,
267+
})
268+
require.NoError(t, err)
269+
defer server.Close()
270+
err = db.DeleteReplicasUpdatedBefore(ctx, dbtime.Now())
271+
require.NoError(t, err)
272+
deleteTime := dbtime.Now()
273+
require.Eventually(t, func() bool {
274+
return server.Self().UpdatedAt.After(deleteTime)
275+
}, testutil.WaitShort, testutil.IntervalFast)
276+
})
258277
}
259278

260279
type derpyHandler struct {

0 commit comments

Comments
 (0)