From ac8c4ed5fe5a2be21b06677ce826021d64ebd188 Mon Sep 17 00:00:00 2001 From: Matt Jaffee Date: Mon, 23 Sep 2019 07:51:04 -0500 Subject: [PATCH 1/2] add concurrent field creation test --- server/server_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/server/server_test.go b/server/server_test.go index 11a026dea..d968792ff 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -318,6 +318,30 @@ func TestConfig_Parse_DataDir(t *testing.T) { } } +func TestConcurrentFieldCreation(t *testing.T) { + cluster := test.MustRunCluster(t, 3) + defer cluster.Close() + + api0 := cluster[0].API + if _, err := api0.CreateIndex(context.Background(), "i", pilosa.IndexOptions{}); err != nil { + t.Fatalf("creating index: %v", err) + } + eg := errgroup.Group{} + for i := 0; i < 100; i++ { + i := i + eg.Go(func() error { + if _, err := api0.CreateField(context.Background(), "i", fmt.Sprintf("f%d", i)); err != nil { + return err + } + return nil + }) + } + err := eg.Wait() + if err != nil { + t.Fatalf("creating concurrent field: %v", err) + } +} + func TestMain_RecalculateHashes(t *testing.T) { const clusterSize = 5 cluster := test.MustRunCluster(t, clusterSize) From 07f8f5b8e07b17efee82619ca4ce14842b10233b Mon Sep 17 00:00:00 2001 From: Matt Jaffee Date: Mon, 23 Sep 2019 07:54:01 -0500 Subject: [PATCH 2/2] fix concurrent field creation race condition --- server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.go b/server.go index 10de7fc91..c2b9d7970 100644 --- a/server.go +++ b/server.go @@ -601,7 +601,7 @@ func (s *Server) receiveMessage(m Message) error { return fmt.Errorf("local index not found: %s", obj.Index) } opt := obj.Meta - _, err := idx.createField(obj.Field, *opt) + _, err := idx.createFieldIfNotExists(obj.Field, *opt) if err != nil { return err }