From ec09582f44da6df9fe2c706bccb6502149a829e8 Mon Sep 17 00:00:00 2001 From: Matt Jaffee Date: Wed, 10 Jul 2019 09:39:02 -0500 Subject: [PATCH] get read lock only where possible in Holder --- holder.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/holder.go b/holder.go index 692868efe..ad26838d1 100644 --- a/holder.go +++ b/holder.go @@ -234,8 +234,8 @@ func (h *Holder) Close() error { // This is used to determine if the rebalancing of data is necessary // when a node joins the cluster. func (h *Holder) HasData() (bool, error) { - h.mu.Lock() - defer h.mu.Unlock() + h.mu.RLock() + defer h.mu.RUnlock() if len(h.indexes) > 0 { return true, nil } @@ -385,15 +385,21 @@ 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.Lock() - defer h.mu.Unlock() + h.mu.RLock() // Find index in cache first. if index := h.indexes[name]; index != nil { + h.mu.RUnlock() return index, nil } - return h.createIndex(name, opt) + h.mu.RUnlock() + + index, err := h.CreateIndex(name, opt) + if _, ok := err.(ConflictError); err != nil && !ok { + return nil, err + } + return index, nil } func (h *Holder) createIndex(name string, opt IndexOptions) (*Index, error) {