fix: insert replica when removed by cleanup (#10917)

This commit is contained in:
Garrett Delfosse
2023-11-28 14:15:09 -05:00
committed by GitHub
parent 52901e1219
commit afbda2235c
2 changed files with 39 additions and 1 deletions
+20 -1
View File
@@ -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 {