mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
fix: insert replica when removed by cleanup (#10917)
This commit is contained in:
@@ -331,7 +331,26 @@ func (m *Manager) syncReplicas(ctx context.Context) error {
|
||||
Primary: m.self.Primary,
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update replica: %w", err)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
return xerrors.Errorf("update replica: %w", err)
|
||||
}
|
||||
// self replica has been cleaned up, we must reinsert
|
||||
// nolint:gocritic // Updating a replica is a system function.
|
||||
replica, err = m.db.InsertReplica(dbauthz.AsSystemRestricted(ctx), database.InsertReplicaParams{
|
||||
ID: m.self.ID,
|
||||
CreatedAt: dbtime.Now(),
|
||||
UpdatedAt: dbtime.Now(),
|
||||
StartedAt: m.self.StartedAt,
|
||||
RelayAddress: m.self.RelayAddress,
|
||||
RegionID: m.self.RegionID,
|
||||
Hostname: m.self.Hostname,
|
||||
Version: m.self.Version,
|
||||
DatabaseLatency: int32(databaseLatency.Microseconds()),
|
||||
Primary: m.self.Primary,
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update replica: %w", err)
|
||||
}
|
||||
}
|
||||
if m.self.Error != replica.Error {
|
||||
// Publish an update occurred!
|
||||
|
||||
@@ -255,6 +255,25 @@ func TestReplica(t *testing.T) {
|
||||
}
|
||||
wg.Wait()
|
||||
})
|
||||
t.Run("UpsertAfterDelete", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
db, pubsub := dbtestutil.NewDB(t)
|
||||
ctx, cancelCtx := context.WithCancel(context.Background())
|
||||
defer cancelCtx()
|
||||
server, err := replicasync.New(ctx, slogtest.Make(t, nil), db, pubsub, &replicasync.Options{
|
||||
RelayAddress: "google.com",
|
||||
CleanupInterval: time.Millisecond,
|
||||
UpdateInterval: time.Millisecond,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer server.Close()
|
||||
err = db.DeleteReplicasUpdatedBefore(ctx, dbtime.Now())
|
||||
require.NoError(t, err)
|
||||
deleteTime := dbtime.Now()
|
||||
require.Eventually(t, func() bool {
|
||||
return server.Self().UpdatedAt.After(deleteTime)
|
||||
}, testutil.WaitShort, testutil.IntervalFast)
|
||||
})
|
||||
}
|
||||
|
||||
type derpyHandler struct {
|
||||
|
||||
Reference in New Issue
Block a user