Skip to content

Commit ce5c5ad

Browse files
PYTHON-4578 Benchmark collection and client bulk write (mongodb#1796)
1 parent 8b44bc4 commit ce5c5ad

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

.evergreen/config.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,17 @@ tasks:
20312031
- func: "attach benchmark test results"
20322032
- func: "send dashboard data"
20332033

2034+
- name: "perf-8.0-standalone"
2035+
tags: ["perf"]
2036+
commands:
2037+
- func: "bootstrap mongo-orchestration"
2038+
vars:
2039+
VERSION: "8.0"
2040+
TOPOLOGY: "server"
2041+
- func: "run perf tests"
2042+
- func: "attach benchmark test results"
2043+
- func: "send dashboard data"
2044+
20342045
- name: "assign-pr-reviewer"
20352046
tags: ["pr"]
20362047
allowed_requesters: ["patch", "github_pr"]
@@ -3041,6 +3052,7 @@ buildvariants:
30413052
tasks:
30423053
- name: "perf-6.0-standalone"
30433054
- name: "perf-6.0-standalone-ssl"
3055+
- name: "perf-8.0-standalone"
30443056

30453057
# Platform notes
30463058
# i386 builds of OpenSSL or Cyrus SASL are not available

test/performance/perf_test.py

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import threading
4747
import time
4848
import warnings
49-
from typing import Any, List, Optional
49+
from typing import Any, List, Optional, Union
5050

5151
import pytest
5252

@@ -61,7 +61,12 @@
6161

6262
from bson import decode, encode, json_util
6363
from gridfs import GridFSBucket
64-
from pymongo import MongoClient
64+
from pymongo import (
65+
DeleteOne,
66+
InsertOne,
67+
MongoClient,
68+
ReplaceOne,
69+
)
6570

6671
pytestmark = pytest.mark.perf
6772

@@ -390,6 +395,15 @@ def setUp(self):
390395
self.documents = [self.document.copy() for _ in range(NUM_DOCS)]
391396

392397

398+
class SmallDocMixedTest(TestDocument):
399+
dataset = "small_doc.json"
400+
401+
def setUp(self):
402+
super().setUp()
403+
self.data_size = len(encode(self.document)) * NUM_DOCS * 2
404+
self.documents = [self.document.copy() for _ in range(NUM_DOCS)]
405+
406+
393407
class TestSmallDocInsertOne(SmallDocInsertTest, unittest.TestCase):
394408
def do_task(self):
395409
insert_one = self.corpus.insert_one
@@ -429,11 +443,69 @@ def do_task(self):
429443
self.corpus.insert_many(self.documents, ordered=True)
430444

431445

446+
class TestSmallDocClientBulkInsert(SmallDocInsertTest, unittest.TestCase):
447+
@client_context.require_version_min(8, 0, 0, -24)
448+
def setUp(self):
449+
super().setUp()
450+
self.models = []
451+
for doc in self.documents:
452+
self.models.append(InsertOne(namespace="perftest.corpus", document=doc.copy()))
453+
454+
@client_context.require_version_min(8, 0, 0, -24)
455+
def do_task(self):
456+
self.client.bulk_write(self.models, ordered=True)
457+
458+
459+
class TestSmallDocBulkMixedOps(SmallDocMixedTest, unittest.TestCase):
460+
def setUp(self):
461+
super().setUp()
462+
self.models: list[Union[InsertOne, ReplaceOne, DeleteOne]] = []
463+
for doc in self.documents:
464+
self.models.append(InsertOne(document=doc.copy()))
465+
self.models.append(ReplaceOne(filter={}, replacement=doc.copy(), upsert=True))
466+
self.models.append(DeleteOne(filter={}))
467+
468+
def do_task(self):
469+
self.corpus.bulk_write(self.models, ordered=True)
470+
471+
472+
class TestSmallDocClientBulkMixedOps(SmallDocMixedTest, unittest.TestCase):
473+
@client_context.require_version_min(8, 0, 0, -24)
474+
def setUp(self):
475+
super().setUp()
476+
self.models: list[Union[InsertOne, ReplaceOne, DeleteOne]] = []
477+
for doc in self.documents:
478+
self.models.append(InsertOne(namespace="perftest.corpus", document=doc.copy()))
479+
self.models.append(
480+
ReplaceOne(
481+
namespace="perftest.corpus", filter={}, replacement=doc.copy(), upsert=True
482+
)
483+
)
484+
self.models.append(DeleteOne(namespace="perftest.corpus", filter={}))
485+
486+
@client_context.require_version_min(8, 0, 0, -24)
487+
def do_task(self):
488+
self.client.bulk_write(self.models, ordered=True)
489+
490+
432491
class TestLargeDocBulkInsert(LargeDocInsertTest, unittest.TestCase):
433492
def do_task(self):
434493
self.corpus.insert_many(self.documents, ordered=True)
435494

436495

496+
class TestLargeDocClientBulkInsert(LargeDocInsertTest, unittest.TestCase):
497+
@client_context.require_version_min(8, 0, 0, -24)
498+
def setUp(self):
499+
super().setUp()
500+
self.models = []
501+
for doc in self.documents:
502+
self.models.append(InsertOne(namespace="perftest.corpus", document=doc.copy()))
503+
504+
@client_context.require_version_min(8, 0, 0, -24)
505+
def do_task(self):
506+
self.client.bulk_write(self.models, ordered=True)
507+
508+
437509
class GridFsTest(PerformanceTest):
438510
def setUp(self):
439511
super().setUp()

0 commit comments

Comments
 (0)