diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ce9eaa63b..29ba9491da7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ 1. [18331](https://github.com/influxdata/influxdb/pull/18331): Support organization name in addition to ID in DBRP operations 1. [18335](https://github.com/influxdata/influxdb/pull/18335): Disable failing when providing an unexpected error to influx CLI 1. [18345](https://github.com/influxdata/influxdb/pull/18345): Have influx delete cmd respect the config +1. [18385](https://github.com/influxdata/influxdb/pull/18385): Store initialization for pkger enforced on reads ### UI Improvements diff --git a/cmd/influxd/launcher/pkger_test.go b/cmd/influxd/launcher/pkger_test.go index bfed7336b6f..2811e33c073 100644 --- a/cmd/influxd/launcher/pkger_test.go +++ b/cmd/influxd/launcher/pkger_test.go @@ -193,17 +193,11 @@ func TestLauncher_Pkger(t *testing.T) { } t.Run("managing pkg state with stacks", func(t *testing.T) { - t.Run("creating a stack", func(t *testing.T) { - _, cleanup := newStackFn(t, pkger.Stack{ - OrgID: l.Org.ID, - Name: "first stack", - Description: "desc", - URLs: []string{"http://example.com"}, - }) - cleanup() - }) - t.Run("list stacks", func(t *testing.T) { + stacks, err := svc.ListStacks(ctx, l.Org.ID, pkger.ListFilter{}) + require.NoError(t, err) + require.Empty(t, stacks) + newStack1, cleanup1 := newStackFn(t, pkger.Stack{ Name: "first stack", }) @@ -251,6 +245,16 @@ func TestLauncher_Pkger(t *testing.T) { }) }) + t.Run("creating a stack", func(t *testing.T) { + _, cleanup := newStackFn(t, pkger.Stack{ + OrgID: l.Org.ID, + Name: "first stack", + Description: "desc", + URLs: []string{"http://example.com"}, + }) + cleanup() + }) + t.Run("delete a stack", func(t *testing.T) { t.Run("should delete the stack and all resources associated with it", func(t *testing.T) { newStack, cleanup := newStackFn(t, pkger.Stack{}) diff --git a/pkger/store.go b/pkger/store.go index 756fd7e9d43..2ab1acfe64c 100644 --- a/pkger/store.go +++ b/pkger/store.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/json" + "sync" "time" "github.com/influxdata/influxdb/v2" @@ -42,6 +43,8 @@ type ( type StoreKV struct { kvStore kv.Store indexBase *kv.IndexStore + + once sync.Once } var _ Store = (*StoreKV)(nil) @@ -88,7 +91,7 @@ func (s *StoreKV) ListStacks(ctx context.Context, orgID influxdb.ID, f ListFilte } var stacks []Stack - err = s.kvStore.View(ctx, func(tx kv.Tx) error { + err = s.view(ctx, func(tx kv.Tx) error { return s.indexBase.Find(ctx, tx, kv.FindOpts{ CaptureFn: func(key []byte, decodedVal interface{}) error { stack, err := convertStackEntToStack(decodedVal.(*entStack)) @@ -165,7 +168,7 @@ func (s *StoreKV) listStacksByID(ctx context.Context, orgID influxdb.ID, stackID // ReadStackByID reads a stack by the provided ID. func (s *StoreKV) ReadStackByID(ctx context.Context, id influxdb.ID) (Stack, error) { var stack Stack - err := s.kvStore.View(ctx, func(tx kv.Tx) error { + err := s.view(ctx, func(tx kv.Tx) error { decodedEnt, err := s.indexBase.FindEnt(ctx, tx, kv.Entity{PK: kv.EncID(id)}) if err != nil { return err @@ -256,6 +259,21 @@ func (s *StoreKV) indexStoreBase(resource string) *kv.StoreBase { return kv.NewStoreBase(resource, indexBucket, kv.EncUniqKey, kv.EncIDKey, kv.DecIndexID, decValToEntFn) } +func (s *StoreKV) view(ctx context.Context, fn func(tx kv.Tx) error) error { + if err := s.lazyInit(ctx); err != nil { + return err + } + return s.kvStore.View(ctx, fn) +} + +func (s *StoreKV) lazyInit(ctx context.Context) error { + var err error + s.once.Do(func() { + err = s.Init(ctx) + }) + return err +} + func convertStackToEnt(stack Stack) (kv.Entity, error) { idBytes, err := stack.ID.Encode() if err != nil {