Skip to content

Commit b7f19aa

Browse files
committed
fix: better cancel
1 parent 42c46e4 commit b7f19aa

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

src/containers/Tenant/Query/CancelQueryButton/CancelQueryButton.tsx

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import React from 'react';
2-
31
import {StopFill} from '@gravity-ui/icons';
42
import {Button, Icon} from '@gravity-ui/uikit';
53

6-
import {cancelQueryApi} from '../../../../store/reducers/cancelQuery';
74
import {cn} from '../../../../utils/cn';
85
import i18n from '../i18n';
96

@@ -12,24 +9,17 @@ import './CancelQueryButton.scss';
129
const b = cn('cancel-query-button');
1310

1411
interface CancelQueryButtonProps {
15-
queryId: string;
16-
tenantName: string;
12+
isLoading: boolean;
13+
isError: boolean;
1714
onClick?: VoidFunction;
1815
}
1916

20-
export function CancelQueryButton({queryId, tenantName, onClick}: CancelQueryButtonProps) {
21-
const [sendCancelQuery, cancelQueryResponse] = cancelQueryApi.useCancelQueryMutation();
22-
23-
const onStopButtonClick = React.useCallback(() => {
24-
sendCancelQuery({queryId, database: tenantName});
25-
onClick?.();
26-
}, [onClick, queryId, sendCancelQuery, tenantName]);
27-
17+
export function CancelQueryButton({isLoading, isError, onClick}: CancelQueryButtonProps) {
2818
return (
2919
<Button
30-
loading={cancelQueryResponse.isLoading}
31-
onClick={onStopButtonClick}
32-
className={b('stop-button', {error: Boolean(cancelQueryResponse.error)})}
20+
loading={isLoading}
21+
onClick={onClick}
22+
className={b('stop-button', {error: isError})}
3323
>
3424
<Icon data={StopFill} size={16} />
3525
{i18n('action.stop')}

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {isEqual} from 'lodash';
44
import {v4 as uuidv4} from 'uuid';
55

66
import SplitPane from '../../../../components/SplitPane';
7+
import {cancelQueryApi} from '../../../../store/reducers/cancelQuery';
78
import {
89
useStreamingAvailable,
910
useTracingLevelOptionAvailable,
@@ -93,6 +94,7 @@ export default function QueryEditor(props: QueryEditorProps) {
9394

9495
const [sendQuery] = queryApi.useUseSendQueryMutation();
9596
const [streamQuery] = queryApi.useUseStreamQueryMutation();
97+
const [sendCancelQuery, cancelQueryResponse] = cancelQueryApi.useCancelQueryMutation();
9698

9799
const runningQueryRef = React.useRef<{abort: VoidFunction} | null>(null);
98100

@@ -188,10 +190,12 @@ export default function QueryEditor(props: QueryEditorProps) {
188190
});
189191

190192
const handleCancelRunningQuery = React.useCallback(() => {
191-
if (runningQueryRef.current) {
193+
if (isStreamingSupported && runningQueryRef.current) {
192194
runningQueryRef.current.abort();
195+
} else if (result?.queryId) {
196+
sendCancelQuery({queryId: result?.queryId, database: tenantName});
193197
}
194-
}, []);
198+
}, [isStreamingSupported, result?.queryId, sendCancelQuery, tenantName]);
195199

196200
const onCollapseResultHandler = () => {
197201
dispatchResultVisibilityState(PaneVisibilityActionTypes.triggerCollapse);
@@ -253,6 +257,7 @@ export default function QueryEditor(props: QueryEditorProps) {
253257
theme={theme}
254258
key={result?.queryId}
255259
result={result}
260+
cancelQueryResponse={cancelQueryResponse}
256261
tenantName={tenantName}
257262
path={path}
258263
showPreview={showPreview}
@@ -273,6 +278,7 @@ interface ResultProps {
273278
type?: EPathType;
274279
theme: string;
275280
result?: QueryResult;
281+
cancelQueryResponse?: Pick<QueryResult, 'isLoading' | 'error'>;
276282
tenantName: string;
277283
path: string;
278284
showPreview?: boolean;
@@ -281,6 +287,7 @@ interface ResultProps {
281287
}
282288
function Result({
283289
resultVisibilityState,
290+
cancelQueryResponse,
284291
onExpandResultHandler,
285292
onCollapseResultHandler,
286293
type,
@@ -304,6 +311,8 @@ function Result({
304311
theme={theme}
305312
tenantName={tenantName}
306313
isResultsCollapsed={resultVisibilityState.collapsed}
314+
isCancelError={Boolean(cancelQueryResponse?.isLoading)}
315+
isCancelling={Boolean(cancelQueryResponse?.isLoading)}
307316
onExpandResults={onExpandResultHandler}
308317
onCollapseResults={onCollapseResultHandler}
309318
queryText={queryText}

src/containers/Tenant/Query/QueryResult/QueryResultViewer.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ interface ExecuteResultProps {
8282
theme?: string;
8383
tenantName: string;
8484
queryText?: string;
85+
86+
isCancelling: boolean;
87+
isCancelError: boolean;
8588
onCancelRunningQuery?: VoidFunction;
8689
onCollapseResults: VoidFunction;
8790
onExpandResults: VoidFunction;
@@ -94,6 +97,8 @@ export function QueryResultViewer({
9497
theme,
9598
tenantName,
9699
queryText,
100+
isCancelling,
101+
isCancelError,
97102
onCancelRunningQuery,
98103
onCollapseResults,
99104
onExpandResults,
@@ -109,7 +114,7 @@ export function QueryResultViewer({
109114
});
110115
const [useShowPlanToSvg] = useSetting<boolean>(USE_SHOW_PLAN_SVG_KEY);
111116

112-
const {error, isLoading, queryId, data = {}, speedMetrics} = result;
117+
const {error, isLoading, data = {}, speedMetrics} = result;
113118
const {preparedPlan, simplifiedPlan, stats, resultSets, ast} = data;
114119

115120
React.useEffect(() => {
@@ -294,8 +299,8 @@ export function QueryResultViewer({
294299
<React.Fragment>
295300
<ElapsedTime className={b('elapsed-time')} />
296301
<CancelQueryButton
297-
queryId={queryId}
298-
tenantName={tenantName}
302+
isLoading={isCancelling}
303+
isError={isCancelError}
299304
onClick={onCancelRunningQuery}
300305
/>
301306
</React.Fragment>

0 commit comments

Comments
 (0)