From a9532a3b78c4aabed4230c004413dac2df4732e2 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Wed, 30 Jul 2025 13:09:08 +0530 Subject: [PATCH 01/10] chore: test backups systes tests --- system-test/spanner.ts | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index 9f9c26f98..f1fad3dd0 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3358,12 +3358,13 @@ describe('Spanner', () => { const backupExpiryPreciseDate = Spanner.timestamp(backupExpiryDate); before(async function () { + console.log('Current time:', new Date().toISOString()); if (IS_EMULATOR_ENABLED) { this.skip(); } - if (SKIP_BACKUPS === 'true' || KOKORO_JOB_NAME?.includes('presubmit')) { - this.skip(); - } + // if (SKIP_BACKUPS === 'true' || KOKORO_JOB_NAME?.includes('presubmit')) { + // this.skip(); + // } googleSqlDatabase1 = DATABASE; postgreSqlDatabase1 = PG_DATABASE; @@ -3391,18 +3392,28 @@ describe('Spanner', () => { RESOURCES_TO_CLEAN.push(postgreSqlDatabase2); } + console.log('Databases created'); + console.log('Current time:', new Date().toISOString()); + // Create backups. await createBackup( googleSqlDatabase1, googleSqlBackup1Name, backupExpiryDate, ); + + console.log('backup 1 created'); + console.log('Current time:', new Date().toISOString()); + await createBackup( googleSqlDatabase2, googleSqlBackup2Name, backupExpiryDate, ); + console.log('backup 2 created'); + console.log('Current time:', new Date().toISOString()); + googleSqlBackup1 = instance.backup(googleSqlBackup1Name); googleSqlBackup2 = instance.backup(googleSqlBackup2Name); @@ -3414,16 +3425,22 @@ describe('Spanner', () => { postgreSqlBackup1Name, backupExpiryDate, ); + + console.log('Postgres backup 1 created'); await createBackup( postgreSqlDatabase2, postgreSqlBackup2Name, backupExpiryDate, ); + console.log('Postgres backup 2 created'); + postgreSqlBackup1 = instance.backup(postgreSqlBackup1Name); postgreSqlBackup2 = instance.backup(postgreSqlBackup2Name); RESOURCES_TO_CLEAN.push(...[postgreSqlBackup1, postgreSqlBackup2]); + + console.log('Completed before'); } }); From cf02fcd78565e2106a05ed8e2d2a074146d1f910 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Mon, 4 Aug 2025 11:56:33 +0530 Subject: [PATCH 02/10] refactor backup tests --- system-test/spanner.ts | 121 +++++++++-------------------------------- 1 file changed, 26 insertions(+), 95 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index f1fad3dd0..8255a8625 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3336,29 +3336,19 @@ describe('Spanner', () => { const SKIP_POSTGRESQL_BACKUP_TESTS = true; let googleSqlDatabase1: Database; - let googleSqlDatabase2: Database; let restoreDatabase: Database; - let postgreSqlDatabase1: Database; - let postgreSqlDatabase2: Database; - let googleSqlBackup1: Backup; - let googleSqlBackup2: Backup; - let postgreSqlBackup1: Backup; - let postgreSqlBackup2: Backup; - const googleSqlBackup1Name = generateName('backup'); - const googleSqlBackup2Name = generateName('backup'); - const postgreSqlBackup1Name = generateName('pg-backup'); - const postgreSqlBackup2Name = generateName('pg-backup'); - const backupExpiryDate = futureDateByHours(12); const backupExpiryPreciseDate = Spanner.timestamp(backupExpiryDate); + let googleSqlBackupCreated = false; + let postgreSqlBackupCreated = false; + before(async function () { - console.log('Current time:', new Date().toISOString()); if (IS_EMULATOR_ENABLED) { this.skip(); } @@ -3373,74 +3363,17 @@ describe('Spanner', () => { Name: generateName('name'), }); - await postgreSqlDatabase1.table(TABLE_NAME).insert({ - SingerId: generateName('id'), - Name: generateName('name'), - }); - - // Create a second database since only one pending backup can be created - // per database. - const googleSqlDatabase2Id = generateName('database'); - await creategSQLDatabase(googleSqlDatabase2Id, null); - googleSqlDatabase2 = instance.database(googleSqlDatabase2Id); - RESOURCES_TO_CLEAN.push(googleSqlDatabase2); - - if (!SKIP_POSTGRESQL_BACKUP_TESTS) { - const postgreSqlDatabase2Id = generateName('pg-db'); - await createPostgresDatabase(postgreSqlDatabase2Id); - postgreSqlDatabase2 = instance.database(postgreSqlDatabase2Id); - RESOURCES_TO_CLEAN.push(postgreSqlDatabase2); - } - - console.log('Databases created'); - console.log('Current time:', new Date().toISOString()); - - // Create backups. - await createBackup( - googleSqlDatabase1, - googleSqlBackup1Name, - backupExpiryDate, - ); - - console.log('backup 1 created'); - console.log('Current time:', new Date().toISOString()); - - await createBackup( - googleSqlDatabase2, - googleSqlBackup2Name, - backupExpiryDate, - ); - - console.log('backup 2 created'); - console.log('Current time:', new Date().toISOString()); - googleSqlBackup1 = instance.backup(googleSqlBackup1Name); - googleSqlBackup2 = instance.backup(googleSqlBackup2Name); - RESOURCES_TO_CLEAN.push(...[googleSqlBackup1, googleSqlBackup2]); + RESOURCES_TO_CLEAN.push(...[googleSqlBackup1]); if (!SKIP_POSTGRESQL_BACKUP_TESTS) { - await createBackup( - postgreSqlDatabase1, - postgreSqlBackup1Name, - backupExpiryDate, - ); - - console.log('Postgres backup 1 created'); - await createBackup( - postgreSqlDatabase2, - postgreSqlBackup2Name, - backupExpiryDate, - ); - - console.log('Postgres backup 2 created'); - + await postgreSqlDatabase1.table(TABLE_NAME).insert({ + SingerId: generateName('id'), + Name: generateName('name'), + }); postgreSqlBackup1 = instance.backup(postgreSqlBackup1Name); - postgreSqlBackup2 = instance.backup(postgreSqlBackup2Name); - - RESOURCES_TO_CLEAN.push(...[postgreSqlBackup1, postgreSqlBackup2]); - - console.log('Completed before'); + RESOURCES_TO_CLEAN.push(...[postgreSqlBackup1]); } }); @@ -3477,6 +3410,13 @@ describe('Spanner', () => { }; it('GOOGLE_STANDARD_SQL should have completed a backup', async () => { + // Create backups. + await createBackup( + googleSqlDatabase1, + googleSqlBackup1Name, + backupExpiryDate, + ); + googleSqlBackupCreated = true; await completedBackup( googleSqlBackup1, googleSqlBackup1Name, @@ -3485,6 +3425,12 @@ describe('Spanner', () => { }); it.skip('POSTGRESQL should have completed a backup', async () => { + await createBackup( + postgreSqlDatabase1, + postgreSqlBackup1Name, + backupExpiryDate, + ); + postgreSqlBackupCreated = true; await completedBackup( postgreSqlBackup1, postgreSqlBackup1Name, @@ -3515,10 +3461,12 @@ describe('Spanner', () => { }; it('GOOGLE_STANDARD_SQL should return error for backup expiration time in the past', async () => { + assert.ok(googleSqlBackupCreated); await pastBackupExpirationTimeError(googleSqlDatabase1); }); it.skip('POSTGRESQL should return error for backup expiration time in the past', async () => { + assert.ok(postgreSqlBackupCreated); await pastBackupExpirationTimeError(postgreSqlDatabase1); }); @@ -3577,11 +3525,6 @@ describe('Spanner', () => { backup => backup.formattedName_ === googleSqlBackup1.formattedName_, ), ); - assert.ok( - page3.find( - backup => backup.formattedName_ === googleSqlBackup2.formattedName_, - ), - ); if (!IS_EMULATOR_ENABLED && !SKIP_POSTGRESQL_BACKUP_TESTS) { assert.ok( page3.find( @@ -3589,12 +3532,6 @@ describe('Spanner', () => { backup.formattedName_ === postgreSqlBackup1.formattedName_, ), ); - assert.ok( - page3.find( - backup => - backup.formattedName_ === postgreSqlBackup2.formattedName_, - ), - ); } }); @@ -3760,14 +3697,6 @@ describe('Spanner', () => { } }; - it('GOOGLE_STANDARD_SQL should delete backup', async () => { - await deleteBackup(googleSqlBackup2); - }); - - it.skip('POSTGRESQL should delete backup', async () => { - await deleteBackup(postgreSqlBackup2); - }); - const listBackupOperations = async (backup1, database1) => { // List operations and ensure operation for current backup exists. // Without a filter. @@ -3805,10 +3734,12 @@ describe('Spanner', () => { it('GOOGLE_STANDARD_SQL should delete backup', async () => { await listBackupOperations(googleSqlBackup1, googleSqlDatabase1); + await deleteBackup(googleSqlBackup1); }); it.skip('POSTGRESQL should delete backup', async () => { await listBackupOperations(postgreSqlBackup1, postgreSqlDatabase1); + await deleteBackup(postgreSqlBackup1); }); }); From 318fb56f2551ecb4d9ae7ffa78366e94254348a6 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Tue, 19 Aug 2025 11:21:32 +0530 Subject: [PATCH 03/10] review comments --- system-test/spanner.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index 8255a8625..80efbbbef 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3732,14 +3732,12 @@ describe('Spanner', () => { ); }; - it('GOOGLE_STANDARD_SQL should delete backup', async () => { + it('GOOGLE_STANDARD_SQL should list backup operations', async () => { await listBackupOperations(googleSqlBackup1, googleSqlDatabase1); - await deleteBackup(googleSqlBackup1); }); - it.skip('POSTGRESQL should delete backup', async () => { + it.skip('POSTGRESQL should list backup operations', async () => { await listBackupOperations(postgreSqlBackup1, postgreSqlDatabase1); - await deleteBackup(postgreSqlBackup1); }); }); From e0e19dcdcaf287db334909a5ecdbce58731960f7 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Wed, 20 Aug 2025 11:43:40 +0530 Subject: [PATCH 04/10] review comments --- system-test/spanner.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index 80efbbbef..d10cd8adf 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3345,9 +3345,6 @@ describe('Spanner', () => { const backupExpiryDate = futureDateByHours(12); const backupExpiryPreciseDate = Spanner.timestamp(backupExpiryDate); - let googleSqlBackupCreated = false; - let postgreSqlBackupCreated = false; - before(async function () { if (IS_EMULATOR_ENABLED) { this.skip(); @@ -3416,7 +3413,6 @@ describe('Spanner', () => { googleSqlBackup1Name, backupExpiryDate, ); - googleSqlBackupCreated = true; await completedBackup( googleSqlBackup1, googleSqlBackup1Name, @@ -3430,7 +3426,6 @@ describe('Spanner', () => { postgreSqlBackup1Name, backupExpiryDate, ); - postgreSqlBackupCreated = true; await completedBackup( postgreSqlBackup1, postgreSqlBackup1Name, @@ -3461,12 +3456,10 @@ describe('Spanner', () => { }; it('GOOGLE_STANDARD_SQL should return error for backup expiration time in the past', async () => { - assert.ok(googleSqlBackupCreated); await pastBackupExpirationTimeError(googleSqlDatabase1); }); it.skip('POSTGRESQL should return error for backup expiration time in the past', async () => { - assert.ok(postgreSqlBackupCreated); await pastBackupExpirationTimeError(postgreSqlDatabase1); }); From 68776dad13b2602a89c9c5ca645ad71cd5690d02 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Wed, 20 Aug 2025 11:49:45 +0530 Subject: [PATCH 05/10] review comments --- system-test/spanner.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index d10cd8adf..e1876e697 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3349,9 +3349,9 @@ describe('Spanner', () => { if (IS_EMULATOR_ENABLED) { this.skip(); } - // if (SKIP_BACKUPS === 'true' || KOKORO_JOB_NAME?.includes('presubmit')) { - // this.skip(); - // } + if (SKIP_BACKUPS === 'true' || KOKORO_JOB_NAME?.includes('presubmit')) { + this.skip(); + } googleSqlDatabase1 = DATABASE; postgreSqlDatabase1 = PG_DATABASE; @@ -3480,7 +3480,7 @@ describe('Spanner', () => { backup => backup.formattedName_ === googleSqlBackup1.formattedName_, ), ); - if (!IS_EMULATOR_ENABLED && !SKIP_POSTGRESQL_BACKUP_TESTS) { + if (!SKIP_POSTGRESQL_BACKUP_TESTS) { assert.ok( backups.find( backup => @@ -3502,7 +3502,7 @@ describe('Spanner', () => { }); let page3size = 2; - if (!IS_EMULATOR_ENABLED && !SKIP_POSTGRESQL_BACKUP_TESTS) { + if (!SKIP_POSTGRESQL_BACKUP_TESTS) { page3size = 4; } const [page3] = await instance.getBackups({ @@ -3518,7 +3518,7 @@ describe('Spanner', () => { backup => backup.formattedName_ === googleSqlBackup1.formattedName_, ), ); - if (!IS_EMULATOR_ENABLED && !SKIP_POSTGRESQL_BACKUP_TESTS) { + if (!SKIP_POSTGRESQL_BACKUP_TESTS) { assert.ok( page3.find( backup => From ffda651c5f73db5ab9a84968c8591375e5f6ca70 Mon Sep 17 00:00:00 2001 From: alkatrivedi <58396306+alkatrivedi@users.noreply.github.com> Date: Wed, 20 Aug 2025 08:30:46 +0000 Subject: [PATCH 06/10] chore: add mux env for r/w to enable kokoro pipeline (#2390) --- .kokoro/presubmit/node18/system-test-multiplexed-session.cfg | 5 +++++ .kokoro/trampoline_v2.sh | 1 + system-test/spanner.ts | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.kokoro/presubmit/node18/system-test-multiplexed-session.cfg b/.kokoro/presubmit/node18/system-test-multiplexed-session.cfg index fdc5433c0..a2d946b3c 100644 --- a/.kokoro/presubmit/node18/system-test-multiplexed-session.cfg +++ b/.kokoro/presubmit/node18/system-test-multiplexed-session.cfg @@ -19,4 +19,9 @@ env_vars: { env_vars: { key: "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS" value: "true" +} + +env_vars: { + key: "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW" + value: "true" } \ No newline at end of file diff --git a/.kokoro/trampoline_v2.sh b/.kokoro/trampoline_v2.sh index a290b491b..b2fd6d24d 100755 --- a/.kokoro/trampoline_v2.sh +++ b/.kokoro/trampoline_v2.sh @@ -167,6 +167,7 @@ if [[ -n "${KOKORO_BUILD_ID:-}" ]]; then "KOKORO_GITHUB_PULL_REQUEST_URL" "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS" "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_PARTITIONED_OPS" + "GOOGLE_CLOUD_SPANNER_MULTIPLEXED_SESSIONS_FOR_RW" ) elif [[ "${TRAVIS:-}" == "true" ]]; then RUNNING_IN_CI="true" diff --git a/system-test/spanner.ts b/system-test/spanner.ts index e1876e697..19492b12a 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -1245,7 +1245,9 @@ describe('Spanner', () => { const numericInsertOutOfBounds = (done, dialect, value) => { insert({NumericValue: value}, dialect, err => { - assert.strictEqual(err.code, grpc.status.FAILED_PRECONDITION); + KOKORO_JOB_NAME?.includes('system-test-multiplexed-session') + ? assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT) + : assert.strictEqual(err.code, grpc.status.FAILED_PRECONDITION); done(); }); }; From 26a6023cd093526afb1e0046ef303d8c6f67c906 Mon Sep 17 00:00:00 2001 From: alkatrivedi <58396306+alkatrivedi@users.noreply.github.com> Date: Wed, 20 Aug 2025 09:10:54 +0000 Subject: [PATCH 07/10] chore: enable integration test against mux as required (#2391) --- .github/sync-repo-settings.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/sync-repo-settings.yaml b/.github/sync-repo-settings.yaml index 776e601e3..bd2862b92 100644 --- a/.github/sync-repo-settings.yaml +++ b/.github/sync-repo-settings.yaml @@ -7,6 +7,7 @@ branchProtectionRules: requiredStatusCheckContexts: - "ci/kokoro: Samples test" - "ci/kokoro: System test" + - "ci/kokoro: System test with Multiplexed Session" - lint - test (18) - test (20) From e86ae244617c5b4466754cdb49c39aa8b4093947 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Thu, 21 Aug 2025 15:35:13 +0530 Subject: [PATCH 08/10] review comments --- samples/benchmark.js | 0 system-test/spanner.ts | 32 ++++++++++++++++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 samples/benchmark.js diff --git a/samples/benchmark.js b/samples/benchmark.js new file mode 100644 index 000000000..e69de29bb diff --git a/system-test/spanner.ts b/system-test/spanner.ts index 19492b12a..211ef000b 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3497,32 +3497,25 @@ describe('Spanner', () => { pageSize: 1, gaxOptions: {autoPaginate: false}, }); - const [page2] = await instance.getBackups({ - pageSize: 1, - pageToken: resp1!.nextPageToken!, - gaxOptions: {autoPaginate: false}, - }); - let page3size = 2; + let totalPageSize = 1; if (!SKIP_POSTGRESQL_BACKUP_TESTS) { - page3size = 4; + totalPageSize = 2; } - const [page3] = await instance.getBackups({ - pageSize: page3size, + const [totalPages] = await instance.getBackups({ + pageSize: totalPageSize, gaxOptions: {autoPaginate: false}, }); assert.strictEqual(page1.length, 1); - assert.strictEqual(page2.length, 1); - assert.strictEqual(page3.length, page3size); - assert.notStrictEqual(page2[0].formattedName_, page1[0].formattedName_); + assert.strictEqual(totalPages.length, totalPageSize); assert.ok( - page3.find( + totalPages.find( backup => backup.formattedName_ === googleSqlBackup1.formattedName_, ), ); if (!SKIP_POSTGRESQL_BACKUP_TESTS) { assert.ok( - page3.find( + totalPages.find( backup => backup.formattedName_ === postgreSqlBackup1.formattedName_, ), @@ -3544,8 +3537,6 @@ describe('Spanner', () => { restoreDatabase = instance.database(restoreDatabaseId); - RESOURCES_TO_CLEAN.push(restoreDatabase); - const [databaseMetadata] = await restoreDatabase.getMetadata(); assert.ok( databaseMetadata.state === 'READY' || @@ -3734,6 +3725,15 @@ describe('Spanner', () => { it.skip('POSTGRESQL should list backup operations', async () => { await listBackupOperations(postgreSqlBackup1, postgreSqlDatabase1); }); + + it('GOOGLE_STANDARD_SQL should delete backups', async () => { + await restoreDatabase.delete(); + await deleteBackup(googleSqlBackup1); + }); + + it.skip('POSTGRESQL should delete backups', async () => { + await deleteBackup(postgreSqlBackup1); + }); }); describe('Sessions', () => { From 8d572245588e0531eaa30fe330850b22843de500 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Mon, 25 Aug 2025 11:43:28 +0000 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- .github/workflows/ci.yaml | 8 ++++---- .github/workflows/issues-no-repro.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ce3a6919b..ba80cb2c9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -32,7 +32,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 18 - run: node --version - run: npm install --engine-strict working-directory: .github/scripts @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 18 - run: npm install --engine-strict - run: npm test env: @@ -57,7 +57,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 18 - run: npm install - run: npm run lint docs: @@ -66,7 +66,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 18 - run: npm install - run: npm run docs - uses: JustinBeckwith/linkinator-action@v1 diff --git a/.github/workflows/issues-no-repro.yaml b/.github/workflows/issues-no-repro.yaml index 6b836e01c..816d9a709 100644 --- a/.github/workflows/issues-no-repro.yaml +++ b/.github/workflows/issues-no-repro.yaml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 18 - run: npm install working-directory: ./.github/scripts - uses: actions/github-script@v7 From 76024b800997a80ec0fbc346971f9d86297fccc7 Mon Sep 17 00:00:00 2001 From: Surbhi Garg Date: Mon, 25 Aug 2025 18:18:49 +0530 Subject: [PATCH 10/10] review --- system-test/spanner.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/system-test/spanner.ts b/system-test/spanner.ts index 85cdebee3..5a54093d8 100644 --- a/system-test/spanner.ts +++ b/system-test/spanner.ts @@ -3366,15 +3366,12 @@ describe('Spanner', () => { googleSqlBackup1 = instance.backup(googleSqlBackup1Name); - RESOURCES_TO_CLEAN.push(...[googleSqlBackup1]); - if (!SKIP_POSTGRESQL_BACKUP_TESTS) { await postgreSqlDatabase1.table(TABLE_NAME).insert({ SingerId: generateName('id'), Name: generateName('name'), }); postgreSqlBackup1 = instance.backup(postgreSqlBackup1Name); - RESOURCES_TO_CLEAN.push(...[postgreSqlBackup1]); } });