Catch query timeout exceptions (#5680)

Query read timeouts happen when a remote server is not available. It
breaks:
- the remote server show page
- the record table page of imported remote tables

This PR will catch the exception so it does not go to Sentry in both
cases.

Also did 2 renaming.
This commit is contained in:
Thomas Trompette
2024-05-31 10:39:35 +02:00
committed by GitHub
parent 5e1dfde3e4
commit c60a3e49cd
11 changed files with 101 additions and 63 deletions

View File

@ -3,6 +3,7 @@ import {
Inject,
Injectable,
Logger,
RequestTimeoutException,
} from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
@ -49,7 +50,8 @@ import { QueryRunnerArgsFactory } from 'src/engine/api/graphql/workspace-query-r
import { QueryResultGettersFactory } from 'src/engine/api/graphql/workspace-query-runner/factories/query-result-getters.factory';
import { assertMutationNotOnRemoteObject } from 'src/engine/metadata-modules/object-metadata/utils/assert-mutation-not-on-remote-object.util';
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
import { assertIsValidUuid } from 'src/engine/api/graphql/workspace-query-runner/utils/assertIsValidUuid.util';
import { assertIsValidUuid } from 'src/engine/api/graphql/workspace-query-runner/utils/assert-is-valid-uuid.util';
import { isQueryTimeoutError } from 'src/engine/utils/query-timeout.util';
import { WorkspaceQueryRunnerOptions } from './interfaces/query-runner-option.interface';
import {
@ -577,28 +579,30 @@ export class WorkspaceQueryRunnerService {
workspaceId,
);
await workspaceDataSource?.query(`
SET search_path TO ${this.workspaceDataSourceService.getSchemaName(
workspaceId,
)};
`);
try {
return await workspaceDataSource?.transaction(
async (transactionManager) => {
await transactionManager.query(`
SET search_path TO ${this.workspaceDataSourceService.getSchemaName(
workspaceId,
)};
`);
return await workspaceDataSource?.transaction(
async (transactionManager) => {
await transactionManager.query(`
SET search_path TO ${this.workspaceDataSourceService.getSchemaName(
workspaceId,
)};
`);
const results = transactionManager.query<PGGraphQLResult>(
`SELECT graphql.resolve($1);`,
[query],
);
const results = transactionManager.query<PGGraphQLResult>(
`SELECT graphql.resolve($1);`,
[query],
);
return results;
},
);
} catch (error) {
if (isQueryTimeoutError(error)) {
throw new RequestTimeoutException(error.message);
}
return results;
},
);
throw error;
}
}
private async parseResult<Result>(