Skip to content

Commit

Permalink
Merge branch 'googleapis:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
kevkim-codes authored Jan 8, 2025
2 parents 3a8f2f1 + 2fdf98f commit d0036dc
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 42 deletions.
2 changes: 1 addition & 1 deletion protos/protos.d.ts

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

2 changes: 1 addition & 1 deletion protos/protos.js

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

17 changes: 16 additions & 1 deletion src/tabular-api-surface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -902,8 +902,23 @@ Please use the format 'prezzy' or '${instance.name}/tables/prezzy'.`);
typeof optionsOrCallback === 'function' ? optionsOrCallback : cb!;
const gaxOptions =
typeof optionsOrCallback === 'object' ? optionsOrCallback : {};

/*
The following line of code sets the timeout if it was provided while
creating the client. This will be used to determine if the client should
retry on DEADLINE_EXCEEDED errors. Eventually, this will be handled
downstream in google-gax.
*/
const timeout = gaxOptions?.timeout;
const callTimeMillis = new Date().getTime();

this.sampleRowKeysStream(gaxOptions)
.on('error', callback)
.on('error', (error: grpc.ServiceError) => {
if (timeout && timeout > new Date().getTime() - callTimeMillis) {
error.code = grpc.status.DEADLINE_EXCEEDED;
}
callback(error);
})
.pipe(
concat((keys: string[]) => {
callback(null, keys);
Expand Down
25 changes: 25 additions & 0 deletions test/test-proxy/checkAndMutateRowService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,31 @@ describe('TestProxy/CheckAndMutateRow', () => {
},
],
},
{
tableName: 'projects/projectId/instances/instance/tables/test-table',
appProfileId: 'test-app-profile',
rowKey: Buffer.from('test-row-key'),
predicateFilter: null,
trueMutations: [
{
setCell: {
familyName: '',
timestampMicros: 1000007,
columnQualifier: Buffer.from(''),
value: Buffer.from(''),
},
},
{
setCell: {
familyName: '',
timestampMicros: 1000007,
columnQualifier: Buffer.from(''),
value: Buffer.from(''),
},
},
],
falseMutations: [],
},
];
describe('Ensure the proper request is passed to the Gapic Layer', () => {
const clientId = 'TestCheckAndMutateRow_NoRetry_TransientError';
Expand Down
4 changes: 0 additions & 4 deletions testproxy/known_failures.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
TestMutateRow_Generic_DeadlineExceeded\|
TestMutateRow_Generic_CloseClient\|
TestMutateRows_Generic_CloseClient\|
TestMutateRows_Retry_WithRoutingCookie\|
TestReadRow_Generic_DeadlineExceeded\|
TestReadRow_Retry_WithRoutingCookie\|
Expand All @@ -12,8 +11,5 @@ TestReadRows_Retry_WithRoutingCookie\|
TestReadRows_Retry_WithRoutingCookie_MultipleErrorResponses\|
TestReadRows_Retry_WithRetryInfo\|
TestReadRows_Retry_WithRetryInfo_MultipleErrorResponse\|
TestCheckAndMutateRow_NoRetry_TrueMutations\|
TestCheckAndMutateRow_NoRetry_FalseMutations\|
TestSampleRowKeys_Generic_DeadlineExceeded\|
TestSampleRowKeys_Retry_WithRoutingCookie\|
TestSampleRowKeys_Generic_CloseClient
2 changes: 1 addition & 1 deletion testproxy/services/bulk-mutate-rows.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ const bulkMutateRows = ({clientMap}) =>
: [];
return {
status: {
code: error.code,
code: error.code ? error.code : grpc.status.UNKNOWN,
details: [],
message: error.message,
},
Expand Down
22 changes: 13 additions & 9 deletions testproxy/services/check-and-mutate-row.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,19 @@ const {
* @returns {FilterConfigOption[]} An array of mutations in the handwritten layer format.
*/
function handwrittenLayerMutations(gapicLayerMutations) {
return createFlatMutationsListWithFnInverse(
[
{
mutations: gapicLayerMutations,
},
],
mutationParseInverse,
1
);
return gapicLayerMutations
.map(mutation =>
createFlatMutationsListWithFnInverse(
[
{
mutations: [mutation],
},
],
mutationParseInverse,
1
)
)
.flat();
}

/**
Expand Down
46 changes: 21 additions & 25 deletions testproxy/services/sample-row-keys.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,38 +14,34 @@
'use strict';

const grpc = require('@grpc/grpc-js');

const {
getSRKRequest,
} = require('../../build/testproxy/services/utils/request/sampleRowKeys.js');
const normalizeCallback = require('./utils/normalize-callback.js');

const v2 = Symbol.for('v2');

const sampleRowKeys = ({clientMap}) =>
normalizeCallback(async rawRequest => {
const {request} = rawRequest;
const {request: sampleRowKeysRequest} = request;
const {tableName} = sampleRowKeysRequest;
const {clientId} = request;
const {clientId, request: sampleRowKeysRequest} = request;
const {appProfileId, tableName} = sampleRowKeysRequest;

const bigtable = clientMap.get(clientId);
bigtable.appProfileId = appProfileId;

try {
const response = await getSRKRequest(bigtable, {appProfileId, tableName});

const appProfileId = clientMap.get(clientId).appProfileId;
const client = clientMap.get(clientId)[v2];
const samples = await new Promise((res, rej) => {
const response = [];
client
.sampleRowKeys({
appProfileId,
tableName,
})
.on('data', data => {
response.push(data);
})
.on('error', rej)
.on('end', () => res(response));
});
return {
status: {code: grpc.status.OK, details: []},
response,
};
} catch (error) {
console.error('Error:', error.code);

return {
status: {code: grpc.status.OK, details: []},
samples,
};
return {
status: {code: error.code, details: []},
};
}
});

module.exports = sampleRowKeys;
48 changes: 48 additions & 0 deletions testproxy/services/utils/request/sampleRowKeys.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright 2025 Google LLC
//
// 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
//
// https://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.

import * as protos from '../../../../protos/protos';

type SRKRequest = protos.google.bigtable.v2.ISampleRowKeysRequest;
type SRKResponse = protos.google.bigtable.v2.ISampleRowKeysResponse;

/**
* This function will create a request that can be passed into the
* handwritten ßsampleRowKeys method and calls the Gapic layer under the hood.
*
* @param {any} client Bigtable client
* @param {SRKRequest} request The sampleRowKeys request information
* that can be sent to the Gapic layer.
* @returns {Promise<SRKResponse>} A reponse that can be passed into the
* sampleRowKeys Gapic layer.
*/
export function getSRKRequest(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
client: any,
request: SRKRequest
): Promise<SRKResponse> {
const {tableName} = request;

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const getTableInfo = (bigtable: any, tableName: any) => {
const [, , , instanceId, , tableId] = tableName.split('/');
const instance = bigtable.instance(instanceId);
return instance.table(tableId);
};

const table = getTableInfo(client, tableName);
const sampleRowKeysResponse = table.sampleRowKeys();

return sampleRowKeysResponse;
}

0 comments on commit d0036dc

Please sign in to comment.