Skip to content

Commit 2c7bb9d

Browse files
committed
feat: cancel sharding
1 parent 33f37c2 commit 2c7bb9d

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
*/
@@ -433,6 +456,56 @@ export const createShardKey = (
433456
};
434457
};
435458

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

0 commit comments

Comments
 (0)