Simplify Holder's logic

This commit is contained in:
Kuba Podgórski 2020-02-03 18:12:15 +01:00
parent 7a032e62f0
commit b9fa6da5d2
2 changed files with 33 additions and 19 deletions

View file

@ -398,7 +398,7 @@ func (h *Holder) CreateIndex(name string, opt IndexOptions) (*Index, error) {
defer h.mu.Unlock()
// Ensure index doesn't already exist.
if h.indexes[name] != nil {
if h.index(name) != nil {
return nil, newConflictError(ErrIndexExists)
}
return h.createIndex(name, opt)
@ -407,21 +407,15 @@ func (h *Holder) CreateIndex(name string, opt IndexOptions) (*Index, error) {
// CreateIndexIfNotExists returns an index by name.
// The index is created if it does not already exist.
func (h *Holder) CreateIndexIfNotExists(name string, opt IndexOptions) (*Index, error) {
h.mu.RLock()
h.mu.Lock()
defer h.mu.Unlock()
// Find index in cache first.
if index := h.indexes[name]; index != nil {
h.mu.RUnlock()
// Return index if it exists.
if index := h.index(name); index != nil {
return index, nil
}
h.mu.RUnlock()
index, err := h.CreateIndex(name, opt)
if _, ok := err.(ConflictError); err != nil && !ok {
return nil, err
}
return index, nil
return h.createIndex(name, opt)
}
func (h *Holder) createIndex(name string, opt IndexOptions) (*Index, error) {
@ -429,11 +423,6 @@ func (h *Holder) createIndex(name string, opt IndexOptions) (*Index, error) {
return nil, errors.New("index name required")
}
// Return index if it exists.
if index := h.index(name); index != nil {
return index, nil
}
// Otherwise create a new index.
index, err := h.newIndex(h.IndexPath(name), name)
if err != nil {
@ -443,9 +432,10 @@ func (h *Holder) createIndex(name string, opt IndexOptions) (*Index, error) {
index.keys = opt.Keys
index.trackExistence = opt.TrackExistence
if err := index.Open(); err != nil {
if err = index.Open(); err != nil {
return nil, errors.Wrap(err, "opening")
} else if err := index.saveMeta(); err != nil {
}
if err = index.saveMeta(); err != nil {
return nil, errors.Wrap(err, "meta")
}

View file

@ -197,7 +197,31 @@ func TestHolder_Open(t *testing.T) {
t.Fatalf("unexpected error: %s", err)
}
})
// Try to re-create existing index
t.Run("CreateIndexIfNotExists", func(t *testing.T) {
h := test.MustOpenHolder()
defer h.Close()
idx1, err := h.CreateIndexIfNotExists("aaa", pilosa.IndexOptions{})
if err != nil {
t.Fatal(err)
}
if _, err = h.CreateIndex("aaa", pilosa.IndexOptions{}); err == nil {
t.Fatalf("expected: ConflictError, got: nil")
} else if _, ok := err.(pilosa.ConflictError); !ok {
t.Fatalf("expected: ConflictError, got: %s", err)
}
idx2, err := h.CreateIndexIfNotExists("aaa", pilosa.IndexOptions{})
if err != nil {
t.Fatal(err)
}
if idx1 != idx2 {
t.Fatalf("expected the same indexes, got: %s and %s", idx1.Name(), idx2.Name())
}
})
}
func TestHolder_HasData(t *testing.T) {