Storage: GuaranteedUpdate fix & other improvements (#85206)

make GuaranteedUpdate work when ignoring not found errors, increase poll frequency, fix Delete
This commit is contained in:
Dan Cech
2024-03-27 10:38:49 -04:00
committed by GitHub
parent 2ecc1bb646
commit ef26fe95dc
3 changed files with 47 additions and 10 deletions

View File

@@ -511,9 +511,14 @@ func (s *Storage) GuaranteedUpdate(
Subresource: requestInfo.Subresource, Subresource: requestInfo.Subresource,
} }
err := s.Get(ctx, k.String(), storage.GetOptions{}, destination) getErr := s.Get(ctx, k.String(), storage.GetOptions{}, destination)
if err != nil { if getErr != nil {
return err if ignoreNotFound && apierrors.IsNotFound(getErr) {
// destination is already set to zero value
// we'll create the resource
} else {
return getErr
}
} }
accessor, err := meta.Accessor(destination) accessor, err := meta.Accessor(destination)
@@ -544,6 +549,27 @@ func (s *Storage) GuaranteedUpdate(
return err return err
} }
// if we have a non-nil getErr, then we've ignored a not found error
if getErr != nil {
// object does not exist, create it
req := &entityStore.CreateEntityRequest{
Entity: e,
}
rsp, err := s.store.Create(ctx, req)
if err != nil {
return err
}
err = entityToResource(rsp.Entity, destination, s.codec)
if err != nil {
return apierrors.NewInternalError(err)
}
return nil
}
// update the existing object
req := &entityStore.UpdateEntityRequest{ req := &entityStore.UpdateEntityRequest{
Entity: e, Entity: e,
PreviousVersion: previousVersion, PreviousVersion: previousVersion,

View File

@@ -453,6 +453,8 @@ func (s *sqlEntityServer) Create(ctx context.Context, r *entity.CreateEntityRequ
// Update resource version // Update resource version
current.ResourceVersion = s.snowflake.Generate().Int64() current.ResourceVersion = s.snowflake.Generate().Int64()
current.Action = entity.Entity_CREATED
values := map[string]any{ values := map[string]any{
"guid": current.Guid, "guid": current.Guid,
"key": current.Key, "key": current.Key,
@@ -482,7 +484,7 @@ func (s *sqlEntityServer) Create(ctx context.Context, r *entity.CreateEntityRequ
"origin_key": current.Origin.Key, "origin_key": current.Origin.Key,
"origin_ts": current.Origin.Time, "origin_ts": current.Origin.Time,
"message": current.Message, "message": current.Message,
"action": entity.Entity_CREATED, "action": current.Action,
} }
// 1. Add row to the `entity_history` values // 1. Add row to the `entity_history` values
@@ -658,6 +660,8 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ
// Update resource version // Update resource version
current.ResourceVersion = s.snowflake.Generate().Int64() current.ResourceVersion = s.snowflake.Generate().Int64()
current.Action = entity.Entity_UPDATED
values := map[string]any{ values := map[string]any{
// below are only set in history table // below are only set in history table
"guid": current.Guid, "guid": current.Guid,
@@ -689,7 +693,7 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ
"origin_key": current.Origin.Key, "origin_key": current.Origin.Key,
"origin_ts": current.Origin.Time, "origin_ts": current.Origin.Time,
"message": current.Message, "message": current.Message,
"action": entity.Entity_UPDATED, "action": current.Action,
} }
// 1. Add the `entity_history` values // 1. Add the `entity_history` values
@@ -709,7 +713,6 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ
delete(values, "name") delete(values, "name")
delete(values, "created_at") delete(values, "created_at")
delete(values, "created_by") delete(values, "created_by")
delete(values, "action")
err = s.dialect.Update( err = s.dialect.Update(
ctx, ctx,
@@ -825,6 +828,8 @@ func (s *sqlEntityServer) doDelete(ctx context.Context, tx *session.SessionTx, e
// Update resource version // Update resource version
ent.ResourceVersion = s.snowflake.Generate().Int64() ent.ResourceVersion = s.snowflake.Generate().Int64()
ent.Action = entity.Entity_DELETED
// Set updated at/by // Set updated at/by
ent.UpdatedAt = time.Now().UnixMilli() ent.UpdatedAt = time.Now().UnixMilli()
modifier, err := appcontext.User(ctx) modifier, err := appcontext.User(ctx)
@@ -854,6 +859,10 @@ func (s *sqlEntityServer) doDelete(ctx context.Context, tx *session.SessionTx, e
return err return err
} }
if ent.Origin == nil {
ent.Origin = &entity.EntityOriginInfo{}
}
values := map[string]any{ values := map[string]any{
// below are only set in history table // below are only set in history table
"guid": ent.Guid, "guid": ent.Guid,
@@ -885,7 +894,7 @@ func (s *sqlEntityServer) doDelete(ctx context.Context, tx *session.SessionTx, e
"origin_key": ent.Origin.Key, "origin_key": ent.Origin.Key,
"origin_ts": ent.Origin.Time, "origin_ts": ent.Origin.Time,
"message": ent.Message, "message": ent.Message,
"action": entity.Entity_DELETED, "action": ent.Action,
} }
// 1. Add the `entity_history` values // 1. Add the `entity_history` values
@@ -1429,7 +1438,7 @@ func (s *sqlEntityServer) poller(stream chan *entity.Entity) {
var err error var err error
since := s.snowflake.Generate().Int64() since := s.snowflake.Generate().Int64()
t := time.NewTicker(5 * time.Second) t := time.NewTicker(1 * time.Second)
defer t.Stop() defer t.Stop()
for range t.C { for range t.C {

View File

@@ -58,7 +58,7 @@ func createServiceAccountAdminToken(t *testing.T, env *server.TestEnv) (string,
type testContext struct { type testContext struct {
authToken string authToken string
client entity.EntityStoreServer client entity.EntityStoreClient
user *user.SignedInUser user *user.SignedInUser
ctx context.Context ctx context.Context
} }
@@ -88,9 +88,11 @@ func createTestContext(t *testing.T) testContext {
store, err := sqlstash.ProvideSQLEntityServer(eDB) store, err := sqlstash.ProvideSQLEntityServer(eDB)
require.NoError(t, err) require.NoError(t, err)
client := entity.NewEntityStoreClientLocal(store)
return testContext{ return testContext{
authToken: authToken, authToken: authToken,
client: store, client: client,
user: serviceAccountUser, user: serviceAccountUser,
ctx: appcontext.WithUser(context.Background(), serviceAccountUser), ctx: appcontext.WithUser(context.Background(), serviceAccountUser),
} }