Skip to content

Commit a9670eb

Browse files
authored
fix: disable streaming by default for some clusters (#2566)
1 parent dcfca43 commit a9670eb

File tree

10 files changed

+218
-64
lines changed

10 files changed

+218
-64
lines changed

src/containers/App/App.tsx

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@ import {Helmet} from 'react-helmet-async';
66
import {connect} from 'react-redux';
77

88
import {componentsRegistry} from '../../components/ComponentsProvider/componentsRegistry';
9-
import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary';
109
import type {RootState} from '../../store';
11-
import {Navigation} from '../AsideNavigation/Navigation';
1210
import ReduxTooltip from '../ReduxTooltip/ReduxTooltip';
13-
import {getUserSettings} from '../UserSettings/settings';
1411
import type {YDBEmbeddedUISettings} from '../UserSettings/settings';
1512

1613
import ContentWrapper, {Content} from './Content';
14+
import {NavigationWrapper} from './NavigationWrapper';
1715
import {Providers} from './Providers';
1816

1917
import './App.scss';
@@ -26,25 +24,20 @@ export interface AppProps {
2624
children?: React.ReactNode;
2725
}
2826

29-
function App({
30-
store,
31-
history,
32-
singleClusterMode,
33-
children,
34-
userSettings = getUserSettings({singleClusterMode}),
35-
}: AppProps) {
27+
function App({store, history, singleClusterMode, children, userSettings}: AppProps) {
3628
const ChatPanel = componentsRegistry.get('ChatPanel');
3729

3830
return (
3931
<Providers store={store} history={history}>
4032
<Helmet defaultTitle="YDB Monitoring" titleTemplate="%s — YDB Monitoring" />
4133
<ContentWrapper>
42-
<Navigation userSettings={userSettings}>
43-
<ErrorBoundary>
44-
<Content singleClusterMode={singleClusterMode}>{children}</Content>
45-
<div id="fullscreen-root"></div>
46-
</ErrorBoundary>
47-
</Navigation>
34+
<NavigationWrapper
35+
singleClusterMode={singleClusterMode}
36+
userSettings={userSettings}
37+
>
38+
<Content singleClusterMode={singleClusterMode}>{children}</Content>
39+
<div id="fullscreen-root"></div>
40+
</NavigationWrapper>
4841
</ContentWrapper>
4942
{ChatPanel && <ChatPanel />}
5043
<ReduxTooltip />
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React from 'react';
2+
3+
import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary';
4+
import {useClusterNameFromQuery} from '../../utils/hooks/useDatabaseFromQuery';
5+
import {Navigation} from '../AsideNavigation/Navigation';
6+
import {applyClusterSpecificQueryStreamingSetting, getUserSettings} from '../UserSettings/settings';
7+
import type {YDBEmbeddedUISettings} from '../UserSettings/settings';
8+
9+
interface NavigationWrapperProps {
10+
singleClusterMode: boolean;
11+
userSettings?: YDBEmbeddedUISettings;
12+
children: React.ReactNode;
13+
}
14+
15+
export function NavigationWrapper({
16+
singleClusterMode,
17+
userSettings,
18+
children,
19+
}: NavigationWrapperProps) {
20+
const clusterName = useClusterNameFromQuery();
21+
22+
let finalUserSettings: YDBEmbeddedUISettings;
23+
24+
if (userSettings) {
25+
// Apply cluster-specific logic to externally provided settings
26+
finalUserSettings = applyClusterSpecificQueryStreamingSetting(userSettings, clusterName);
27+
} else {
28+
// Generate settings internally with cluster-specific logic
29+
finalUserSettings = getUserSettings({
30+
singleClusterMode,
31+
clusterName,
32+
});
33+
}
34+
35+
return (
36+
<Navigation userSettings={finalUserSettings}>
37+
<ErrorBoundary>{children}</ErrorBoundary>
38+
</Navigation>
39+
);
40+
}

src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ import {cn} from '../../../../utils/cn';
2828
import {
2929
DEFAULT_IS_QUERY_RESULT_COLLAPSED,
3030
DEFAULT_SIZE_RESULT_PANE_KEY,
31-
ENABLE_QUERY_STREAMING,
3231
LAST_USED_QUERY_ACTION_KEY,
3332
} from '../../../../utils/constants';
3433
import {
3534
useEventHandler,
3635
useQueryExecutionSettings,
36+
useQueryStreamingSetting,
3737
useSetting,
3838
useTypedDispatch,
3939
useTypedSelector,
@@ -92,7 +92,7 @@ export default function QueryEditor(props: QueryEditorProps) {
9292
LAST_USED_QUERY_ACTION_KEY,
9393
);
9494
const [lastExecutedQueryText, setLastExecutedQueryText] = React.useState<string>('');
95-
const [isQueryStreamingEnabled] = useSetting<boolean>(ENABLE_QUERY_STREAMING);
95+
const [isQueryStreamingEnabled] = useQueryStreamingSetting();
9696

9797
const isStreamingEnabled =
9898
useStreamingAvailable() &&

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import {HelpMark, Switch} from '@gravity-ui/uikit';
22

33
import {cn} from '../../../../utils/cn';
4-
import {ENABLE_QUERY_STREAMING} from '../../../../utils/constants';
5-
import {useSetting} from '../../../../utils/hooks';
4+
import {useQueryStreamingSetting} from '../../../../utils/hooks';
65

76
import {QUERY_SETTINGS_FIELD_SETTINGS} from './constants';
87
import i18n from './i18n';
@@ -18,7 +17,7 @@ interface TimeoutLabelProps {
1817
}
1918

2019
export function TimeoutLabel({isDisabled, isChecked, onToggle}: TimeoutLabelProps) {
21-
const [isQueryStreamingEnabled] = useSetting<boolean>(ENABLE_QUERY_STREAMING);
20+
const [isQueryStreamingEnabled] = useQueryStreamingSetting();
2221

2322
if (isQueryStreamingEnabled) {
2423
return (

src/containers/UserSettings/settings.tsx

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ import {
1212
ENABLE_CODE_ASSISTANT,
1313
ENABLE_NETWORK_TABLE_KEY,
1414
ENABLE_QUERY_STREAMING,
15+
ENABLE_QUERY_STREAMING_OLD_BACKEND,
1516
INVERTED_DISKS_KEY,
1617
LANGUAGE_KEY,
18+
OLD_BACKEND_CLUSTER_NAMES,
19+
PAGE_IDS,
20+
SECTION_IDS,
1721
SHOW_DOMAIN_DATABASE_KEY,
1822
SHOW_NETWORK_UTILIZATION,
1923
THEME_KEY,
@@ -137,6 +141,42 @@ export const enableQueryStreamingSetting: SettingProps = {
137141
description: i18n('settings.editor.queryStreaming.description'),
138142
};
139143

144+
export const enableQueryStreamingOldBackendSetting: SettingProps = {
145+
settingKey: ENABLE_QUERY_STREAMING_OLD_BACKEND,
146+
title: i18n('settings.editor.queryStreaming.title'),
147+
description: i18n('settings.editor.queryStreaming.description'),
148+
};
149+
150+
export function applyClusterSpecificQueryStreamingSetting(
151+
settings: YDBEmbeddedUISettings,
152+
clusterName?: string,
153+
): YDBEmbeddedUISettings {
154+
const isOldBackendCluster = clusterName && OLD_BACKEND_CLUSTER_NAMES.includes(clusterName);
155+
156+
const queryStreamingSetting = isOldBackendCluster
157+
? enableQueryStreamingOldBackendSetting
158+
: enableQueryStreamingSetting;
159+
160+
return settings.map((page) => {
161+
// Look for the experiments page
162+
if (page.id === PAGE_IDS.EXPERIMENTS) {
163+
return createNextState(page, (draft) => {
164+
// Find and replace the query streaming setting in experimentsSection
165+
const section = draft.sections[0]; // experimentsSection
166+
const settingIndex = section.settings.findIndex(
167+
(setting) =>
168+
'settingKey' in setting && setting.settingKey === ENABLE_QUERY_STREAMING,
169+
);
170+
171+
if (settingIndex !== -1) {
172+
section.settings[settingIndex] = queryStreamingSetting;
173+
}
174+
});
175+
}
176+
return page;
177+
});
178+
}
179+
140180
export const showNetworkUtilizationSetting: SettingProps = {
141181
settingKey: SHOW_NETWORK_UTILIZATION,
142182
title: i18n('settings.showNetworkUtilization.title'),
@@ -181,10 +221,11 @@ export const interfaceVersionInfoField: SettingsInfoFieldProps = {
181221
};
182222

183223
export const appearanceSection: SettingsSection = {
184-
id: 'appearanceSection',
224+
id: SECTION_IDS.APPEARANCE,
185225
title: i18n('section.appearance'),
186226
settings: [
187227
themeSetting,
228+
languageSetting,
188229
invertedDisksSetting,
189230
binaryDataInPlainTextDisplay,
190231
showDomainDatabase,
@@ -193,7 +234,7 @@ export const appearanceSection: SettingsSection = {
193234
};
194235

195236
export const experimentsSection: SettingsSection = {
196-
id: 'experimentsSection',
237+
id: SECTION_IDS.EXPERIMENTS,
197238
title: i18n('section.experiments'),
198239
settings: [
199240
enableNetworkTable,
@@ -204,42 +245,43 @@ export const experimentsSection: SettingsSection = {
204245
};
205246

206247
export const devSettingsSection: SettingsSection = {
207-
id: 'devSettingsSection',
248+
id: SECTION_IDS.DEV_SETTINGS,
208249
title: i18n('section.dev-setting'),
209250
settings: [enableAutocompleteSetting, autocompleteOnEnterSetting],
210251
};
211252

212253
export const aboutSettingsSection: SettingsSection = {
213-
id: 'aboutSettingsSection',
254+
id: SECTION_IDS.ABOUT,
214255
title: i18n('section.about'),
215256
settings: [interfaceVersionInfoField],
216257
};
217258

218259
export const generalPage: SettingsPage = {
219-
id: 'generalPage',
260+
id: PAGE_IDS.GENERAL,
220261
title: i18n('page.general'),
221262
icon: {data: StarFill, height: 14, width: 14},
222263
sections: [appearanceSection],
223264
hideTitle: true,
224265
};
225266

226267
export const experimentsPage: SettingsPage = {
227-
id: 'experimentsPage',
268+
id: PAGE_IDS.EXPERIMENTS,
228269
title: i18n('page.experiments'),
229270
icon: {data: Flask},
230271
sections: [experimentsSection],
231272
hideTitle: true,
232273
};
233274

234275
export const editorPage: SettingsPage = {
235-
id: 'editorPage',
276+
id: PAGE_IDS.EDITOR,
236277
title: i18n('page.editor'),
237278
icon: {data: PencilToSquare},
238279
sections: [devSettingsSection],
280+
hideTitle: true,
239281
};
240282

241283
export const aboutPage: SettingsPage = {
242-
id: 'aboutPage',
284+
id: PAGE_IDS.ABOUT,
243285
title: i18n('page.about'),
244286
icon: {data: CircleInfo},
245287
sections: [aboutSettingsSection],
@@ -249,9 +291,11 @@ export const aboutPage: SettingsPage = {
249291
export function getUserSettings({
250292
singleClusterMode,
251293
codeAssistantConfigured,
294+
clusterName,
252295
}: {
253296
singleClusterMode: boolean;
254297
codeAssistantConfigured?: boolean;
298+
clusterName?: string;
255299
}) {
256300
const experiments = singleClusterMode
257301
? experimentsPage
@@ -266,7 +310,8 @@ export function getUserSettings({
266310
})
267311
: editorPage;
268312

269-
const settings: YDBEmbeddedUISettings = [generalPage, editor, experiments, aboutPage];
313+
const baseSettings: YDBEmbeddedUISettings = [generalPage, editor, experiments, aboutPage];
270314

271-
return settings;
315+
// Apply cluster-specific query streaming logic
316+
return applyClusterSpecificQueryStreamingSetting(baseSettings, clusterName);
272317
}

src/services/settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
ENABLE_CODE_ASSISTANT,
1212
ENABLE_NETWORK_TABLE_KEY,
1313
ENABLE_QUERY_STREAMING,
14+
ENABLE_QUERY_STREAMING_OLD_BACKEND,
1415
EXPAND_CLUSTER_DASHBOARD,
1516
INVERTED_DISKS_KEY,
1617
IS_HOTKEYS_HELP_HIDDEN_KEY,
@@ -51,6 +52,7 @@ export const DEFAULT_USER_SETTINGS = {
5152
[ENABLE_AUTOCOMPLETE]: true,
5253
[ENABLE_CODE_ASSISTANT]: true,
5354
[ENABLE_QUERY_STREAMING]: true,
55+
[ENABLE_QUERY_STREAMING_OLD_BACKEND]: false,
5456
[SHOW_NETWORK_UTILIZATION]: false,
5557
[EXPAND_CLUSTER_DASHBOARD]: true,
5658
[AUTOCOMPLETE_ON_ENTER]: true,

0 commit comments

Comments
 (0)