From 1f7a3551446d4c685b782f4afcddeb58d1a55136 Mon Sep 17 00:00:00 2001 From: Divya Rani Date: Wed, 5 Nov 2025 23:21:38 +0530 Subject: [PATCH] Add Mutator RPCs that operate on objects This commit adds two object database mutator RPCs to the benchmark, we didn't include other mutator RPCs as they invoke pre-receive/post-receive hooks that would require GitLab Rails API for authorization. --- .../experiments/master/k6-benchmark.js | 85 ++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/_support/benchmarking/experiments/master/k6-benchmark.js b/_support/benchmarking/experiments/master/k6-benchmark.js index 7863023961..35016004c2 100644 --- a/_support/benchmarking/experiments/master/k6-benchmark.js +++ b/_support/benchmarking/experiments/master/k6-benchmark.js @@ -27,7 +27,9 @@ const optionsStatic = () => { getTreeEntries: { ...SCENARIO_DEFAULTS, rate: 200, exec: 'getTreeEntries' }, treeEntry: { ...SCENARIO_DEFAULTS, rate: 100, exec: 'treeEntry' }, listCommitsByOid: { ...SCENARIO_DEFAULTS, rate: 200, exec: 'listCommitsByOid' }, - writeAndDeleteRefs: { ...SCENARIO_DEFAULTS, rate: 100, exec: 'writeAndDeleteRefs' } + writeAndDeleteRefs: { ...SCENARIO_DEFAULTS, rate: 100, exec: 'writeAndDeleteRefs' }, + userMergeToRef: { ...SCENARIO_DEFAULTS, rate: 100, exec: 'userMergeToRef' }, + userSquash: { ...SCENARIO_DEFAULTS, rate: 100, exec: 'userSquash' } }, setupTimeout: '5m' } @@ -75,6 +77,16 @@ const optionsRamping = () => { ...SCENARIO_DEFAULTS, stages: stages_write, exec: 'writeAndDeleteRefs' + }, + userMergeToRef: { + ...SCENARIO_DEFAULTS, + stages: stages_write, + exec: 'userMergeToRef' + }, + userSquash: { + ...SCENARIO_DEFAULTS, + stages: stages_write, + exec: 'userSquash' } }, setupTimeout: '5m' @@ -97,6 +109,7 @@ const selectTestRepo = () => { glRepository: repo.name, // irrelevant but mandatory glProjectPath: `foo/bar/${repo.name}`, // irrelevant but mandatory }, + testdata: repo.testdata, commit: repo.testdata.commits[Math.floor(Math.random() * repo.testdata.commits.length)], ref: repo.testdata.refs[Math.floor(Math.random() * repo.testdata.refs.length)], file: repo.testdata.files[Math.floor(Math.random() * repo.testdata.files.length)], @@ -122,7 +135,7 @@ export function teardown (context) { const client = new Client() // k6 provides no easy way to list directory contents. -client.load([gitalyProtoDir], 'commit.proto', 'blob.proto', 'ref.proto', 'repository.proto') +client.load([gitalyProtoDir], 'commit.proto', 'blob.proto', 'ref.proto', 'repository.proto', 'operations.proto') export function findCommit () { client.connect(gitalyAddress, { @@ -298,3 +311,71 @@ export function writeAndDeleteRefs () { client.close() } + +export function userMergeToRef () { + client.connect(gitalyAddress, { + plaintext: true + }) + + const testRepo = selectTestRepo(); + + const generatedRef = 'refs/merge-requests/benchmark-merge-' + generateRandom() + const sourceCommit = testRepo.commit + const parentCommit = testRepo.testdata.commits[Math.floor(Math.random() * testRepo.testdata.commits.length)] + + const req = { + repository: testRepo.repository, + user: { + glId: 'user-1', + name: encoding.b64encode('Benchmark User'), + email: encoding.b64encode('benchmark@example.com'), + glUsername: 'benchmark' + }, + sourceSha: sourceCommit, + firstParentRef: encoding.b64encode(parentCommit), + targetRef: encoding.b64encode(generatedRef), + message: encoding.b64encode('Benchmark merge commit') + } + + const res = client.invoke('gitaly.OperationService/UserMergeToRef', req) + check(res, { + 'UserMergeToRef - StatusOK': r => r && r.status === StatusOK, + 'UserMergeToRef - commit_id returned': r => r && r.message && r.message.commitId + }) + + client.close() +} + +export function userSquash () { + client.connect(gitalyAddress, { + plaintext: true + }) + + const testRepo = selectTestRepo(); + + const req = { + repository: testRepo.repository, + user: { + glId: 'user-1', + name: encoding.b64encode('Benchmark User'), + email: encoding.b64encode('benchmark@example.com'), + glUsername: 'benchmark' + }, + startSha: testRepo.testdata.commits[Math.floor(Math.random() * testRepo.testdata.commits.length)], + endSha: testRepo.commit, + author: { + name: encoding.b64encode('Benchmark User'), + email: encoding.b64encode('benchmark@example.com') + }, + commitMessage: encoding.b64encode('Benchmark squashed commit') + } + + const res = client.invoke('gitaly.OperationService/UserSquash', req) + check(res, { + 'UserSquash - StatusOK': r => r && r.status === StatusOK, + 'UserSquash - squash_sha returned': r => r && r.message && r.message.squashSha + }) + + client.close() +} + -- GitLab