diff --git a/test/concurrency_test.go b/test/concurrency_test.go index 3a5db3cf..6af0d484 100644 --- a/test/concurrency_test.go +++ b/test/concurrency_test.go @@ -26,6 +26,7 @@ import ( "context" "crypto/rand" "encoding/hex" + "os" "strconv" "sync" "testing" @@ -40,71 +41,81 @@ func TestConcurrentCreateSmallDocuments(t *testing.T) { t.Skip("Skip on short tests") } c := createClientFromEnv(t, true) - db := ensureDatabase(nil, c, "document_test", nil, t) - col := ensureCollection(nil, db, "TestConcurrentCreateSmallDocuments", nil, t) - docChan := make(chan driver.DocumentMeta, 16*1024) + version, err := c.Version(nil) + if err != nil { + t.Fatalf("Version failed: %s", describe(err)) + } + isv33p := version.Version.CompareTo("3.3") >= 0 + if !isv33p && os.Getenv("TEST_CONNECTION") == "vst" { + t.Skip("Skipping VST load test on 3.2") + } else { + db := ensureDatabase(nil, c, "document_test", nil, t) + col := ensureCollection(nil, db, "TestConcurrentCreateSmallDocuments", nil, t) - creator := func(limit, interval int) { - for i := 0; i < limit; i++ { - ctx := context.Background() - doc := UserDoc{ - "Jan", - i * interval, - } - meta, err := col.CreateDocument(ctx, doc) - if err != nil { - t.Fatalf("Failed to create new document: %s", describe(err)) + docChan := make(chan driver.DocumentMeta, 16*1024) + + creator := func(limit, interval int) { + for i := 0; i < limit; i++ { + ctx := context.Background() + doc := UserDoc{ + "Jan", + i * interval, + } + meta, err := col.CreateDocument(ctx, doc) + if err != nil { + t.Fatalf("Failed to create new document: %s", describe(err)) + } + docChan <- meta } - docChan <- meta } - } - reader := func() { - for { - meta, ok := <-docChan - if !ok { - return - } - // Document must exists now - if found, err := col.DocumentExists(nil, meta.Key); err != nil { - t.Fatalf("DocumentExists failed for '%s': %s", meta.Key, describe(err)) - } else if !found { - t.Errorf("DocumentExists returned false for '%s', expected true", meta.Key) - } - // Read document - var readDoc UserDoc - if _, err := col.ReadDocument(nil, meta.Key, &readDoc); err != nil { - t.Fatalf("Failed to read document '%s': %s", meta.Key, describe(err)) + reader := func() { + for { + meta, ok := <-docChan + if !ok { + return + } + // Document must exists now + if found, err := col.DocumentExists(nil, meta.Key); err != nil { + t.Fatalf("DocumentExists failed for '%s': %s", meta.Key, describe(err)) + } else if !found { + t.Errorf("DocumentExists returned false for '%s', expected true", meta.Key) + } + // Read document + var readDoc UserDoc + if _, err := col.ReadDocument(nil, meta.Key, &readDoc); err != nil { + t.Fatalf("Failed to read document '%s': %s", meta.Key, describe(err)) + } } } - } - noCreators := getIntFromEnv("NOCREATORS", 25) - noReaders := getIntFromEnv("NOREADERS", 50) - noDocuments := getIntFromEnv("NODOCUMENTS", 1000) // per creator - - wgCreators := sync.WaitGroup{} - // Run N concurrent creators - for i := 0; i < noCreators; i++ { - wgCreators.Add(1) - go func() { - defer wgCreators.Done() - creator(noDocuments, noCreators) - }() - } - wgReaders := sync.WaitGroup{} - // Run M readers - for i := 0; i < noReaders; i++ { - wgReaders.Add(1) - go func() { - defer wgReaders.Done() - reader() - }() + noCreators := getIntFromEnv("NOCREATORS", 25) + noReaders := getIntFromEnv("NOREADERS", 50) + noDocuments := getIntFromEnv("NODOCUMENTS", 1000) // per creator + + wgCreators := sync.WaitGroup{} + // Run N concurrent creators + for i := 0; i < noCreators; i++ { + wgCreators.Add(1) + go func() { + defer wgCreators.Done() + creator(noDocuments, noCreators) + }() + } + wgReaders := sync.WaitGroup{} + // Run M readers + for i := 0; i < noReaders; i++ { + wgReaders.Add(1) + go func() { + defer wgReaders.Done() + reader() + }() + } + wgCreators.Wait() + close(docChan) + wgReaders.Wait() } - wgCreators.Wait() - close(docChan) - wgReaders.Wait() } // TestConcurrentCreateBigDocuments make a lot of concurrent CreateDocument calls. @@ -114,71 +125,81 @@ func TestConcurrentCreateBigDocuments(t *testing.T) { t.Skip("Skip on short tests") } c := createClientFromEnv(t, true) - db := ensureDatabase(nil, c, "document_test", nil, t) - col := ensureCollection(nil, db, "TestConcurrentCreateBigDocuments", nil, t) - - docChan := make(chan driver.DocumentMeta, 16*1024) - - creator := func(limit, interval int) { - data := make([]byte, 1024) - for i := 0; i < limit; i++ { - rand.Read(data) - ctx := context.Background() - doc := UserDoc{ - "Jan" + strconv.Itoa(i) + hex.EncodeToString(data), - i * interval, - } - meta, err := col.CreateDocument(ctx, doc) - if err != nil { - t.Fatalf("Failed to create new document: %s", describe(err)) - } - docChan <- meta - } + + version, err := c.Version(nil) + if err != nil { + t.Fatalf("Version failed: %s", describe(err)) } + isv33p := version.Version.CompareTo("3.3") >= 0 + if !isv33p && os.Getenv("TEST_CONNECTION") == "vst" { + t.Skip("Skipping VST load test on 3.2") + } else { + db := ensureDatabase(nil, c, "document_test", nil, t) + col := ensureCollection(nil, db, "TestConcurrentCreateBigDocuments", nil, t) - reader := func() { - for { - meta, ok := <-docChan - if !ok { - return - } - // Document must exists now - if found, err := col.DocumentExists(nil, meta.Key); err != nil { - t.Fatalf("DocumentExists failed for '%s': %s", meta.Key, describe(err)) - } else if !found { - t.Errorf("DocumentExists returned false for '%s', expected true", meta.Key) + docChan := make(chan driver.DocumentMeta, 16*1024) + + creator := func(limit, interval int) { + data := make([]byte, 1024) + for i := 0; i < limit; i++ { + rand.Read(data) + ctx := context.Background() + doc := UserDoc{ + "Jan" + strconv.Itoa(i) + hex.EncodeToString(data), + i * interval, + } + meta, err := col.CreateDocument(ctx, doc) + if err != nil { + t.Fatalf("Failed to create new document: %s", describe(err)) + } + docChan <- meta } - // Read document - var readDoc UserDoc - if _, err := col.ReadDocument(nil, meta.Key, &readDoc); err != nil { - t.Fatalf("Failed to read document '%s': %s", meta.Key, describe(err)) + } + + reader := func() { + for { + meta, ok := <-docChan + if !ok { + return + } + // Document must exists now + if found, err := col.DocumentExists(nil, meta.Key); err != nil { + t.Fatalf("DocumentExists failed for '%s': %s", meta.Key, describe(err)) + } else if !found { + t.Errorf("DocumentExists returned false for '%s', expected true", meta.Key) + } + // Read document + var readDoc UserDoc + if _, err := col.ReadDocument(nil, meta.Key, &readDoc); err != nil { + t.Fatalf("Failed to read document '%s': %s", meta.Key, describe(err)) + } } } - } - noCreators := getIntFromEnv("NOCREATORS", 25) - noReaders := getIntFromEnv("NOREADERS", 50) - noDocuments := getIntFromEnv("NODOCUMENTS", 100) // per creator - - wgCreators := sync.WaitGroup{} - // Run N concurrent creators - for i := 0; i < noCreators; i++ { - wgCreators.Add(1) - go func() { - defer wgCreators.Done() - creator(noDocuments, noCreators) - }() - } - wgReaders := sync.WaitGroup{} - // Run M readers - for i := 0; i < noReaders; i++ { - wgReaders.Add(1) - go func() { - defer wgReaders.Done() - reader() - }() + noCreators := getIntFromEnv("NOCREATORS", 25) + noReaders := getIntFromEnv("NOREADERS", 50) + noDocuments := getIntFromEnv("NODOCUMENTS", 100) // per creator + + wgCreators := sync.WaitGroup{} + // Run N concurrent creators + for i := 0; i < noCreators; i++ { + wgCreators.Add(1) + go func() { + defer wgCreators.Done() + creator(noDocuments, noCreators) + }() + } + wgReaders := sync.WaitGroup{} + // Run M readers + for i := 0; i < noReaders; i++ { + wgReaders.Add(1) + go func() { + defer wgReaders.Done() + reader() + }() + } + wgCreators.Wait() + close(docChan) + wgReaders.Wait() } - wgCreators.Wait() - close(docChan) - wgReaders.Wait() }