Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
alkatrivedi committed Jan 23, 2025
1 parent e8354e0 commit 1e73e06
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 18 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 0 additions & 6 deletions .kokoro/system-test.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 11 additions & 11 deletions .kokoro/trampoline_v2.sh

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .trampolinerc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ required_envvars+=(
pass_down_envvars+=(
"AUTORELEASE_PR"
"VERSION"
"GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS"
)

# Prevent unintentional override on the default image.
Expand Down
119 changes: 119 additions & 0 deletions benchmark/benchmarking-multiplexed-session.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*!
* Copyright 2025 Google LLC. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

const muxEnabledTrue = [];
const muxEnabledFalse = [];
const transaction_times = [];
async function main(instanceId, databaseId, projectId, methodName) {
async function readQuery(database) {
const startTime = Date.now();
const query = {
sql: 'SELECT * FROM Singers',
};
await database.run(query);
const operationTime = Date.now() - startTime;
transaction_times.push(operationTime);
}

async function multiplexedSession(instanceId, databaseId, projectId) {
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS = 'true';

const startTime = Date.now();
// eslint-disable-next-line
const {Spanner} = require('../build/src/index.js');
const spanner = new Spanner({
projectId,
});

// Gets a reference to a Cloud Spanner instance and database
const instance = spanner.instance(instanceId);
const database = instance.database(databaseId);

for (let i = 0; i < 1; i++) {
await readQuery(database);
}

muxEnabledTrue.push(Date.now() - startTime);
}

async function regularSession(instanceId, databaseId, projectId) {
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS = 'false';

const startTime = Date.now();
// eslint-disable-next-line
const {Spanner} = require('../build/src/index.js');
const spanner = new Spanner({
projectId,
});

// Gets a reference to a Cloud Spanner instance and database
const instance = spanner.instance(instanceId);
const database = instance.database(databaseId);

for (let i = 0; i < 1; i++) {
await readQuery(database);
}

muxEnabledFalse.push(Date.now() - startTime);
}

function calculatePercentiles(latencies) {
// Step 1: Sort the array
const sortedLatencies = latencies.slice().sort((a, b) => a - b);

// Step 2: Calculate p50 (50th percentile)
const p50Index = Math.floor(0.5 * sortedLatencies.length);
const p50Latency = sortedLatencies[p50Index];

// Step 3: Calculate p90 (90th percentile)
const p90Index = Math.floor(0.9 * sortedLatencies.length);
const p90Latency = sortedLatencies[p90Index];
// Step 3: Calculate p99 (99th percentile)
const p99Index = Math.floor(0.99 * sortedLatencies.length);
const p99Latency = sortedLatencies[p99Index];

return {
p50: p50Latency,
p90: p90Latency,
p99: p99Latency,
};
}

async function runSequentially(method) {
for (let i = 0; i < 1; i++) {
// change function and options as per requirement
await method(instanceId, databaseId, projectId);
}
}

let method = multiplexedSession;
if (methodName === 'regularSession') {
method = regularSession;
}
await runSequentially(method);
const percentiles = calculatePercentiles(transaction_times);
console.log(`p50 Latency: ${percentiles.p50}`);
console.log(`p90 Latency: ${percentiles.p90}`);
console.log(`p99 Latency: ${percentiles.p99}`);
}

process.on('unhandledRejection', err => {
console.error(err.message);
process.exitCode = 1;
});
main(...process.argv.slice(2));
2 changes: 2 additions & 0 deletions src/session-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ export class SessionFactory
process.env.GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS === 'true'
? (this.isMultiplexed = true)
: (this.isMultiplexed = false);

console.log('mux enabled?: ', this.isMultiplexed);
// Multiplexed sessions should only be created if its enabled.
if (this.isMultiplexed) {
this.multiplexedSession_.on('error', this.emit.bind(database, 'error'));
Expand Down

0 comments on commit 1e73e06

Please sign in to comment.