Skip to content

Commit 960abbf

Browse files
committed
feat: cancel sharding
1 parent 6075f25 commit 960abbf

File tree

3 files changed

+117
-5
lines changed

3 files changed

+117
-5
lines changed

packages/compass-global-writes/src/components/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
spacing,
66
WorkspaceContainer,
77
SpinLoaderWithLabel,
8+
ConfirmationModalArea,
89
} from '@mongodb-js/compass-components';
910
import type { RootState, ShardingStatus } from '../store/reducer';
1011
import { ShardingStatuses } from '../store/reducer';
@@ -55,7 +56,10 @@ function ShardingStateView({
5556
return <UnshardedState />;
5657
}
5758

58-
if (shardingStatus === ShardingStatuses.SHARDING) {
59+
if (
60+
shardingStatus === ShardingStatuses.SHARDING ||
61+
shardingStatus === ShardingStatuses.CANCEL_SHARDING
62+
) {
5963
return <ShardingState />;
6064
}
6165

@@ -73,7 +77,9 @@ export function GlobalWrites({ shardingStatus }: GlobalWritesProps) {
7377
return (
7478
<div className={containerStyles}>
7579
<WorkspaceContainer className={workspaceContentStyles}>
76-
<ShardingStateView shardingStatus={shardingStatus} />
80+
<ConfirmationModalArea>
81+
<ShardingStateView shardingStatus={shardingStatus} />
82+
</ConfirmationModalArea>
7783
</WorkspaceContainer>
7884
</div>
7985
);

packages/compass-global-writes/src/components/states/sharding.tsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,18 @@ import {
33
Banner,
44
BannerVariant,
55
Body,
6+
Button,
67
css,
78
Link,
89
spacing,
10+
SpinLoader,
911
} from '@mongodb-js/compass-components';
1012
import { connect } from 'react-redux';
13+
import {
14+
cancelSharding,
15+
type RootState,
16+
ShardingStatuses,
17+
} from '../../store/reducer';
1118

1219
const nbsp = '\u00a0';
1320

@@ -17,7 +24,15 @@ const containerStyles = css({
1724
gap: spacing[400],
1825
});
1926

20-
export function ShardingState() {
27+
interface ShardingStateProps {
28+
isCancellingSharding: boolean;
29+
onCancelSharding: () => void;
30+
}
31+
32+
export function ShardingState({
33+
isCancellingSharding,
34+
onCancelSharding,
35+
}: ShardingStateProps) {
2136
return (
2237
<div className={containerStyles}>
2338
<Banner variant={BannerVariant.Info}>
@@ -34,9 +49,27 @@ export function ShardingState() {
3449
hideExternalIcon
3550
>
3651
You can read more about Global Writes in our documentation.
52+
<Button
53+
onClick={onCancelSharding}
54+
disabled={isCancellingSharding}
55+
leftGlyph={
56+
isCancellingSharding ? (
57+
<SpinLoader title="Cancelling Request" />
58+
) : undefined
59+
}
60+
>
61+
Cancel Request
62+
</Button>
3763
</Link>
3864
</div>
3965
);
4066
}
4167

42-
export default connect()(ShardingState);
68+
export default connect(
69+
(state: RootState) => ({
70+
isCancellingSharding: state.status === ShardingStatuses.CANCEL_SHARDING,
71+
}),
72+
{
73+
onCancelSharding: cancelSharding,
74+
}
75+
)(ShardingState);

packages/compass-global-writes/src/store/reducer.ts

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Action, Reducer } from 'redux';
22
import type { GlobalWritesThunkAction } from '.';
3-
import { openToast } from '@mongodb-js/compass-components';
3+
import { openToast, showConfirmation } from '@mongodb-js/compass-components';
44
import type { ManagedNamespace } from '../services/atlas-global-writes-service';
55

66
export function isAction<A extends Action>(
@@ -30,6 +30,10 @@ enum GlobalWritesActionTypes {
3030
SubmittingForShardingFinished = 'global-writes/SubmittingForShardingFinished',
3131
SubmittingForShardingErrored = 'global-writes/SubmittingForShardingErrored',
3232

33+
CancellingShardingStarted = 'global-writes/CancellingShardingStarted',
34+
CancellingShardingFinished = 'global-writes/CancellingShardingFinished',
35+
CancellingShardingErrored = 'global-writes/CancellingShardingErrored',
36+
3337
UnmanagingNamespaceStarted = 'global-writes/UnmanagingNamespaceStarted',
3438
UnmanagingNamespaceFinished = 'global-writes/UnmanagingNamespaceFinished',
3539
UnmanagingNamespaceErrored = 'global-writes/UnmanagingNamespaceErrored',
@@ -68,6 +72,19 @@ type SubmittingForShardingErroredAction = {
6872
type: GlobalWritesActionTypes.SubmittingForShardingErrored;
6973
};
7074

75+
type CancellingShardingStartedAction = {
76+
type: GlobalWritesActionTypes.CancellingShardingStarted;
77+
};
78+
79+
type CancellingShardingFinishedAction = {
80+
type: GlobalWritesActionTypes.CancellingShardingFinished;
81+
managedNamespace?: ManagedNamespace;
82+
};
83+
84+
type CancellingShardingErroredAction = {
85+
type: GlobalWritesActionTypes.CancellingShardingErrored;
86+
};
87+
7188
type UnmanagingNamespaceStartedAction = {
7289
type: GlobalWritesActionTypes.UnmanagingNamespaceStarted;
7390
};
@@ -102,6 +119,12 @@ export enum ShardingStatuses {
102119
*/
103120
SHARDING = 'SHARDING',
104121

122+
/**
123+
* State when user cancels the sharding and
124+
* we are waiting for server to accept the request.
125+
*/
126+
CANCEL_SHARDING = 'CANCEL_SHARDING',
127+
105128
/**
106129
* Sharding failed.
107130
*/
@@ -434,6 +457,56 @@ export const createShardKey = (
434457
};
435458
};
436459

460+
export const cancelSharding = ():
461+
| GlobalWritesThunkAction<
462+
Promise<void>,
463+
| CancellingShardingStartedAction
464+
| CancellingShardingFinishedAction
465+
| CancellingShardingErroredAction
466+
>
467+
| undefined => {
468+
return async (dispatch, getState, { atlasGlobalWritesService, logger }) => {
469+
const confirmed = await showConfirmation({
470+
title: 'Confirmation',
471+
description: 'Are you sure you want to cancel the sharding request?',
472+
});
473+
474+
if (!confirmed) return;
475+
476+
const { namespace } = getState();
477+
dispatch({
478+
type: GlobalWritesActionTypes.CancellingShardingStarted,
479+
});
480+
481+
try {
482+
await atlasGlobalWritesService.unmanageNamespace(namespace);
483+
dispatch({
484+
type: GlobalWritesActionTypes.CancellingShardingFinished,
485+
});
486+
} catch (error) {
487+
logger.log.error(
488+
logger.mongoLogId(1_001_000_331),
489+
'AtlasFetchError',
490+
'Error cancelling the sharding process',
491+
{
492+
error: (error as Error).message,
493+
}
494+
);
495+
openToast('global-writes-cancel-sharding-error', {
496+
title: `Failed to cancel the sharding process: ${
497+
(error as Error).message
498+
}`,
499+
dismissible: true,
500+
timeout: 5000,
501+
variant: 'important',
502+
});
503+
dispatch({
504+
type: GlobalWritesActionTypes.CancellingShardingErrored,
505+
});
506+
}
507+
};
508+
};
509+
437510
const setNamespaceBeingSharded = (
438511
managedNamespace?: ManagedNamespace
439512
): GlobalWritesThunkAction<void, SubmittingForShardingFinishedAction> => {

0 commit comments

Comments
 (0)