Skip to content

Commit 75a0d89

Browse files
authored
fix: add implicit transaction_mode to query settings (#1240)
1 parent cf5e090 commit 75a0d89

File tree

19 files changed

+102
-76
lines changed

19 files changed

+102
-76
lines changed

src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import type {QuerySettings} from '../../../../../types/store/query';
22
import {
3-
ISOLATION_LEVELS,
43
QUERY_MODES,
54
STATISTICS_MODES,
65
TRACING_LEVELS,
6+
TRANSACTION_MODES,
77
} from '../../../../../utils/query';
88

99
const DEFAULT_QUERY_SETTINGS: QuerySettings = {
1010
queryMode: QUERY_MODES.query,
11-
isolationLevel: ISOLATION_LEVELS.serializable,
11+
transactionMode: TRANSACTION_MODES.implicit,
1212
timeout: '60',
1313
statisticsMode: STATISTICS_MODES.none,
1414
tracingLevel: TRACING_LEVELS.detailed,
@@ -36,15 +36,15 @@ describe('getChangedQueryExecutionSettings', () => {
3636
it('should return all keys if all settings have changed', () => {
3737
const currentSettings: QuerySettings = {
3838
queryMode: QUERY_MODES.data,
39-
isolationLevel: ISOLATION_LEVELS.onlinero,
39+
transactionMode: TRANSACTION_MODES.onlinero,
4040
timeout: '90',
4141
statisticsMode: STATISTICS_MODES.basic,
4242
tracingLevel: TRACING_LEVELS.basic,
4343
};
4444
const result = getChangedQueryExecutionSettings(currentSettings, DEFAULT_QUERY_SETTINGS);
4545
expect(result).toEqual([
4646
'queryMode',
47-
'isolationLevel',
47+
'transactionMode',
4848
'timeout',
4949
'statisticsMode',
5050
'tracingLevel',

src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import type {QuerySettings} from '../../../../../types/store/query';
22
import {
3-
ISOLATION_LEVELS,
4-
ISOLATION_LEVELS_TITLES,
53
QUERY_MODES,
64
QUERY_MODES_TITLES,
75
STATISTICS_MODES,
86
STATISTICS_MODES_TITLES,
97
TRACING_LEVELS,
108
TRACING_LEVELS_TITLES,
9+
TRANSACTION_MODES,
10+
TRANSACTION_MODES_TITLES,
1111
} from '../../../../../utils/query';
1212
import {QUERY_SETTINGS_FIELD_SETTINGS} from '../../QuerySettingsDialog/constants';
1313

1414
import getChangedQueryExecutionSettingsDescription from './getChangedQueryExecutionSettingsDescription';
1515

1616
const DEFAULT_QUERY_SETTINGS: QuerySettings = {
1717
queryMode: QUERY_MODES.query,
18-
isolationLevel: ISOLATION_LEVELS.serializable,
18+
transactionMode: TRANSACTION_MODES.implicit,
1919
timeout: '60',
2020
statisticsMode: STATISTICS_MODES.none,
2121
tracingLevel: TRACING_LEVELS.detailed,
@@ -57,7 +57,7 @@ describe('getChangedQueryExecutionSettingsDescription', () => {
5757
it('should return the correct description for all changed settings', () => {
5858
const currentSettings: QuerySettings = {
5959
queryMode: QUERY_MODES.data,
60-
isolationLevel: ISOLATION_LEVELS.snapshot,
60+
transactionMode: TRANSACTION_MODES.snapshot,
6161
timeout: '120',
6262
statisticsMode: STATISTICS_MODES.profile,
6363
tracingLevel: TRACING_LEVELS.diagnostic,
@@ -70,8 +70,8 @@ describe('getChangedQueryExecutionSettingsDescription', () => {
7070

7171
expect(result).toEqual({
7272
[QUERY_SETTINGS_FIELD_SETTINGS.queryMode.title]: QUERY_MODES_TITLES.data,
73-
[QUERY_SETTINGS_FIELD_SETTINGS.isolationLevel.title]:
74-
ISOLATION_LEVELS_TITLES['snapshot-read-only'],
73+
[QUERY_SETTINGS_FIELD_SETTINGS.transactionMode.title]:
74+
TRANSACTION_MODES_TITLES['snapshot-read-only'],
7575
[QUERY_SETTINGS_FIELD_SETTINGS.timeout.title]: '120',
7676
[QUERY_SETTINGS_FIELD_SETTINGS.statisticsMode.title]: STATISTICS_MODES_TITLES.profile,
7777
[QUERY_SETTINGS_FIELD_SETTINGS.tracingLevel.title]: TRACING_LEVELS_TITLES.diagnostic,

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,19 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
140140
</Flex>
141141
)}
142142
<Flex direction="row" alignItems="flex-start" className={b('dialog-row')}>
143-
<label htmlFor="isolationLevel" className={b('field-title')}>
144-
{QUERY_SETTINGS_FIELD_SETTINGS.isolationLevel.title}
143+
<label htmlFor="transactionMode" className={b('field-title')}>
144+
{QUERY_SETTINGS_FIELD_SETTINGS.transactionMode.title}
145145
</label>
146-
<div className={b('control-wrapper', {isolationLevel: true})}>
146+
<div className={b('control-wrapper', {transactionMode: true})}>
147147
<Controller
148-
name="isolationLevel"
148+
name="transactionMode"
149149
control={control}
150150
render={({field}) => (
151151
<QuerySettingsSelect
152152
setting={field.value}
153153
onUpdateSetting={field.onChange}
154154
settingOptions={
155-
QUERY_SETTINGS_FIELD_SETTINGS.isolationLevel.options
155+
QUERY_SETTINGS_FIELD_SETTINGS.transactionMode.options
156156
}
157157
/>
158158
)}

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsSelect.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import type {SelectOption} from '@gravity-ui/uikit';
22
import {Select} from '@gravity-ui/uikit';
33

44
import type {
5-
IsolationLevel,
65
QueryMode,
76
StatisticsMode,
87
TracingLevel,
8+
TransactionMode,
99
} from '../../../../types/store/query';
1010
import {cn} from '../../../../utils/cn';
1111

@@ -19,7 +19,7 @@ export const getOptionHeight = () => -1;
1919

2020
const b = cn('ydb-query-settings-select');
2121

22-
type SelectType = QueryMode | IsolationLevel | StatisticsMode | TracingLevel;
22+
type SelectType = QueryMode | TransactionMode | StatisticsMode | TracingLevel;
2323
type QuerySettingSelectOption<T> = SelectOption<T> & {isDefault?: boolean};
2424

2525
interface QuerySettingsSelectProps<T extends SelectType> {

src/containers/Tenant/Query/QuerySettingsDialog/constants.ts

+23-18
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,43 @@
11
import {
2-
ISOLATION_LEVELS,
3-
ISOLATION_LEVELS_TITLES,
42
QUERY_MODES,
53
QUERY_MODES_TITLES,
64
STATISTICS_MODES,
75
STATISTICS_MODES_TITLES,
86
TRACING_LEVELS,
97
TRACING_LEVELS_TITLES,
8+
TRANSACTION_MODES,
9+
TRANSACTION_MODES_TITLES,
1010
} from '../../../../utils/query';
1111
import i18n from '../i18n';
1212

1313
import formI18n from './i18n';
1414

15-
export const ISOLATION_LEVEL_SELECT_OPTIONS = [
15+
export const TRANSACTION_MODE_SELECT_OPTIONS = [
1616
{
17-
value: ISOLATION_LEVELS.serializable,
18-
content: ISOLATION_LEVELS_TITLES[ISOLATION_LEVELS.serializable],
19-
text: i18n('isolation-level-description.serializable'),
17+
value: TRANSACTION_MODES.implicit,
18+
content: TRANSACTION_MODES_TITLES[TRANSACTION_MODES.implicit],
19+
text: i18n('transaction-mode-description.implicit'),
2020
isDefault: true,
2121
},
2222
{
23-
value: ISOLATION_LEVELS.onlinero,
24-
content: ISOLATION_LEVELS_TITLES[ISOLATION_LEVELS.onlinero],
25-
text: i18n('isolation-level-description.onlinero'),
23+
value: TRANSACTION_MODES.serializable,
24+
content: TRANSACTION_MODES_TITLES[TRANSACTION_MODES.serializable],
25+
text: i18n('transaction-mode-description.serializable'),
2626
},
2727
{
28-
value: ISOLATION_LEVELS.stalero,
29-
content: ISOLATION_LEVELS_TITLES[ISOLATION_LEVELS.stalero],
30-
text: i18n('isolation-level-description.stalero'),
28+
value: TRANSACTION_MODES.onlinero,
29+
content: TRANSACTION_MODES_TITLES[TRANSACTION_MODES.onlinero],
30+
text: i18n('transaction-mode-description.onlinero'),
3131
},
3232
{
33-
value: ISOLATION_LEVELS.snapshot,
34-
content: ISOLATION_LEVELS_TITLES[ISOLATION_LEVELS.snapshot],
35-
text: i18n('isolation-level-description.snapshot'),
33+
value: TRANSACTION_MODES.stalero,
34+
content: TRANSACTION_MODES_TITLES[TRANSACTION_MODES.stalero],
35+
text: i18n('transaction-mode-description.stalero'),
36+
},
37+
{
38+
value: TRANSACTION_MODES.snapshot,
39+
content: TRANSACTION_MODES_TITLES[TRANSACTION_MODES.snapshot],
40+
text: i18n('transaction-mode-description.snapshot'),
3641
},
3742
];
3843

@@ -124,9 +129,9 @@ export const TRACING_LEVEL_SELECT_OPTIONS = [
124129
];
125130

126131
export const QUERY_SETTINGS_FIELD_SETTINGS = {
127-
isolationLevel: {
128-
title: formI18n('form.isolation-level'),
129-
options: ISOLATION_LEVEL_SELECT_OPTIONS,
132+
transactionMode: {
133+
title: formI18n('form.transaction-mode'),
134+
options: TRANSACTION_MODE_SELECT_OPTIONS,
130135
},
131136
queryMode: {
132137
title: formI18n('form.query-mode'),

src/containers/Tenant/Query/QuerySettingsDialog/i18n/en.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"action.settings": "Query settings",
33
"form.query-mode": "Query type",
44
"form.timeout": "Timeout",
5-
"form.isolation-level": "Isolation level",
5+
"form.transaction-mode": "Transaction mode",
66
"form.statistics-mode": "Statistics collection mode",
77
"form.tracing-level": "Tracing level",
88
"button-done": "Save",

src/containers/Tenant/Query/QuerySettingsDialog/i18n/ru.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"action.settings": "Настройки запроса",
33
"form.query-mode": "Тип запроса",
44
"form.timeout": "Таймаут",
5-
"form.isolation-level": "Уровень изоляции",
5+
"form.transaction-mode": "Уровень изоляции",
66
"form.statistics-mode": "Режим сбора статистики",
77
"form.tracing-level": "Tracing level",
88
"button-done": "Готово",

src/containers/Tenant/Query/i18n/en.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
"method-description.query": "Any query. An experimental API call supposed to replace all existing methods.\nAPI Call: query.ExecuteScript",
2525
"method-description.pg": "Queries in postgresql syntax.\nAPI call: query.ExecuteScript",
2626

27-
"isolation-level-description.serializable": "Provides the strictest isolation level for custom transactions",
28-
"isolation-level-description.onlinero": "Each read operation in the transaction is reading the data that is most recent at execution time",
29-
"isolation-level-description.stalero": "Read operations within a transaction may return results that are slightly out-of-date (lagging by fractions of a second)",
30-
"isolation-level-description.snapshot": "All the read operations within a transaction access the database snapshot. All the data reads are consistent",
27+
"transaction-mode-description.serializable": "Provides the strictest isolation level for custom transactions",
28+
"transaction-mode-description.onlinero": "Each read operation in the transaction is reading the data that is most recent at execution time",
29+
"transaction-mode-description.stalero": "Read operations within a transaction may return results that are slightly out-of-date (lagging by fractions of a second)",
30+
"transaction-mode-description.snapshot": "All the read operations within a transaction access the database snapshot. All the data reads are consistent",
31+
"transaction-mode-description.implicit": "No transaction",
3132

3233
"tracing-level-description.basic": "Spans of main component operations",
3334
"tracing-level-description.detailed": "Highest detail applicable for diagnosing problems in production",

src/services/api.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import type {
2929
Stats,
3030
Timeout,
3131
TracingLevel,
32-
TransactionMode,
3332
} from '../types/api/query';
3433
import type {JsonRenderRequestParams, JsonRenderResponse} from '../types/api/render';
3534
import type {TEvDescribeSchemeResult} from '../types/api/schema';
@@ -45,7 +44,7 @@ import type {TTenantInfo, TTenants} from '../types/api/tenant';
4544
import type {DescribeTopicResult} from '../types/api/topic';
4645
import type {TEvVDiskStateResponse} from '../types/api/vdisk';
4746
import type {TUserToken} from '../types/api/whoami';
48-
import type {QuerySyntax} from '../types/store/query';
47+
import type {QuerySyntax, TransactionMode} from '../types/store/query';
4948
import {
5049
BINARY_DATA_IN_PLAIN_TEXT_DISPLAY,
5150
DEV_ENABLE_TRACING_FOR_ALL_REQUESTS,

src/store/reducers/executeQuery.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,10 @@ export const executeQueryApi = api.injectEndpoints({
226226
querySettings.tracingLevel && enableTracingLevel
227227
? TracingLevelNumber[querySettings.tracingLevel]
228228
: undefined,
229-
transaction_mode: querySettings.isolationLevel,
229+
transaction_mode:
230+
querySettings.transactionMode === 'implicit'
231+
? undefined
232+
: querySettings.transactionMode,
230233
timeout: isNumeric(querySettings.timeout)
231234
? Number(querySettings.timeout) * 1000
232235
: undefined,

src/store/reducers/explainQuery/explainQuery.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ export const explainQueryApi = api.injectEndpoints({
4545
querySettings?.tracingLevel && enableTracingLevel
4646
? TracingLevelNumber[querySettings?.tracingLevel]
4747
: undefined,
48-
transaction_mode: querySettings?.isolationLevel,
48+
transaction_mode:
49+
querySettings?.transactionMode === 'implicit'
50+
? undefined
51+
: querySettings?.transactionMode,
4952
timeout: isNumeric(querySettings?.timeout)
5053
? Number(querySettings?.timeout) * 1000
5154
: undefined,

src/types/api/query.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {TRACING_LEVELS} from '../../utils/query';
2-
import type {IsolationLevel, StatisticsMode} from '../store/query';
2+
import type {StatisticsMode} from '../store/query';
33

44
// ==== types from backend protos ====
55
interface Position {
@@ -218,9 +218,6 @@ export type Stats = StatisticsMode;
218218
/** undefined = '60000' */
219219
export type Timeout = number;
220220

221-
/** undefined = 'serializable-read-write' */
222-
export type TransactionMode = IsolationLevel;
223-
224221
/** undefined = '15' */
225222
export type TracingLevel = number;
226223

src/types/store/query.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import type {
2-
ISOLATION_LEVELS,
32
QUERY_ACTIONS,
43
QUERY_MODES,
54
QUERY_SYNTAX,
65
STATISTICS_MODES,
76
TRACING_LEVELS,
7+
TRANSACTION_MODES,
88
} from '../../utils/query';
99
import type {IResponseError, NetworkError} from '../api/error';
1010
import type {
@@ -38,7 +38,7 @@ export interface QueryRequestParams {
3838

3939
export interface QuerySettings {
4040
queryMode: QueryMode;
41-
isolationLevel: IsolationLevel;
41+
transactionMode: TransactionMode;
4242
timeout?: string;
4343
statisticsMode?: StatisticsMode;
4444
tracingLevel?: TracingLevel;
@@ -51,7 +51,7 @@ export type QueryAction = ValueOf<typeof QUERY_ACTIONS>;
5151
export type QueryMode = ValueOf<typeof QUERY_MODES>;
5252
export type QuerySyntax = ValueOf<typeof QUERY_SYNTAX>;
5353

54-
export type IsolationLevel = ValueOf<typeof ISOLATION_LEVELS>;
54+
export type TransactionMode = ValueOf<typeof TRANSACTION_MODES>;
5555
export type StatisticsMode = ValueOf<typeof STATISTICS_MODES>;
5656
export type TracingLevel = ValueOf<typeof TRACING_LEVELS>;
5757

src/utils/constants.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type {Settings} from '@gravity-ui/react-data-table';
44
import {EType} from '../types/api/tablet';
55
import type {QuerySettings} from '../types/store/query';
66

7-
import {ISOLATION_LEVELS, QUERY_MODES, STATISTICS_MODES, TRACING_LEVELS} from './query';
7+
import {QUERY_MODES, STATISTICS_MODES, TRACING_LEVELS, TRANSACTION_MODES} from './query';
88

99
const SECOND = 1000;
1010

@@ -125,7 +125,7 @@ export const TENANT_OVERVIEW_TABLES_SETTINGS = {
125125

126126
export const DEFAULT_QUERY_SETTINGS = {
127127
queryMode: QUERY_MODES.query,
128-
isolationLevel: ISOLATION_LEVELS.serializable,
128+
transactionMode: TRANSACTION_MODES.implicit,
129129
timeout: '60',
130130
statisticsMode: STATISTICS_MODES.none,
131131
tracingLevel: TRACING_LEVELS.detailed,

src/utils/hooks/useLastQueryExecutionSettings.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,19 @@ import {LAST_QUERY_EXECUTION_SETTINGS_KEY} from '../constants';
44
import {useSetting} from './useSetting';
55

66
export const useLastQueryExecutionSettings = () => {
7-
return useSetting<QuerySettings | undefined>(LAST_QUERY_EXECUTION_SETTINGS_KEY);
7+
const [lastStorageSettings, setLastSettings] = useSetting<QuerySettings | undefined>(
8+
LAST_QUERY_EXECUTION_SETTINGS_KEY,
9+
);
10+
11+
const lastSettings: QuerySettings | undefined = lastStorageSettings
12+
? {
13+
transactionMode: lastStorageSettings.transactionMode,
14+
queryMode: lastStorageSettings.queryMode,
15+
statisticsMode: lastStorageSettings.statisticsMode,
16+
tracingLevel: lastStorageSettings.tracingLevel,
17+
timeout: lastStorageSettings.timeout,
18+
}
19+
: undefined;
20+
21+
return [lastSettings, setLastSettings] as const;
822
};

src/utils/hooks/useQueryExecutionSettings.ts

+12-10
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@ import {useSetting} from './useSetting';
66

77
export const useQueryExecutionSettings = () => {
88
const enableTracingLevel = useTracingLevelOptionAvailable();
9-
const [setting, setSetting] = useSetting<QuerySettings>(QUERY_EXECUTION_SETTINGS_KEY);
9+
const [storageSettings, setSettings] = useSetting<QuerySettings>(QUERY_EXECUTION_SETTINGS_KEY);
1010

11-
return [
12-
{
13-
...setting,
14-
tracingLevel: enableTracingLevel
15-
? setting.tracingLevel
16-
: DEFAULT_QUERY_SETTINGS.tracingLevel,
17-
},
18-
setSetting,
19-
] as const;
11+
const settings: QuerySettings = {
12+
queryMode: storageSettings.queryMode ?? DEFAULT_QUERY_SETTINGS.queryMode,
13+
timeout: storageSettings.timeout ?? DEFAULT_QUERY_SETTINGS.timeout,
14+
statisticsMode: storageSettings.statisticsMode ?? DEFAULT_QUERY_SETTINGS.statisticsMode,
15+
transactionMode: storageSettings.transactionMode ?? DEFAULT_QUERY_SETTINGS.transactionMode,
16+
tracingLevel: enableTracingLevel
17+
? storageSettings.tracingLevel
18+
: DEFAULT_QUERY_SETTINGS.tracingLevel,
19+
};
20+
21+
return [settings, setSettings] as const;
2022
};

0 commit comments

Comments
 (0)