Skip to content

Commit

Permalink
[dagit] Feature flag for disabling WebSocket usage (#7557)
Browse files Browse the repository at this point in the history
  • Loading branch information
hellendag committed Apr 25, 2022
1 parent a141905 commit 5480b04
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 5 deletions.
1 change: 1 addition & 0 deletions js_modules/dagit/packages/core/src/app/Flags.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const DAGIT_FLAGS_KEY = 'DAGIT_FLAGS';
export enum FeatureFlag {
flagDebugConsoleLogging = 'flagDebugConsoleLogging',
flagAlwaysCollapseNavigation = 'flagAlwaysCollapseNavigation',
flagDisableWebsockets = 'flagDisableWebsockets',
}

export const getFeatureFlags: () => FeatureFlag[] = memoize(
Expand Down
10 changes: 10 additions & 0 deletions js_modules/dagit/packages/core/src/app/SettingsRoot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,16 @@ const SettingsRoot = () => {
/>
),
},
{
key: 'Disable WebSockets',
value: (
<Checkbox
format="switch"
checked={flags.includes(FeatureFlag.flagDisableWebsockets)}
onChange={() => toggleFlag(FeatureFlag.flagDisableWebsockets)}
/>
),
},
]}
/>
</Box>
Expand Down
9 changes: 8 additions & 1 deletion js_modules/dagit/packages/core/src/app/WebSocketProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ import * as React from 'react';
import styled from 'styled-components/macro';
import {SubscriptionClient} from 'subscriptions-transport-ws';

import {useFeatureFlags} from './Flags';

type Availability = 'attempting-to-connect' | 'unavailable' | 'available';

export type WebSocketContextType = {
availability: Availability;
status: number;
disabled?: boolean;
websocketClient?: SubscriptionClient;
};

export const WebSocketContext = React.createContext<WebSocketContextType>({
availability: 'attempting-to-connect',
status: WebSocket.CONNECTING,
disabled: false,
});

const WS_EVENTS = [
Expand All @@ -36,6 +40,8 @@ interface Props {
export const WebSocketProvider: React.FC<Props> = (props) => {
const {children, websocketClient} = props;
const [status, setStatus] = React.useState(websocketClient.status);
const {flagDisableWebsockets: disabled} = useFeatureFlags();

const [availability, setAvailability] = React.useState<Availability>(
websocketClient.status === WebSocket.OPEN
? 'available'
Expand All @@ -49,8 +55,9 @@ export const WebSocketProvider: React.FC<Props> = (props) => {
availability,
status,
websocketClient,
disabled,
}),
[availability, status, websocketClient],
[availability, disabled, status, websocketClient],
);

const debouncedSetter = React.useMemo(() => debounce(setStatus, DEBOUNCE_TIME), []);
Expand Down
4 changes: 2 additions & 2 deletions js_modules/dagit/packages/core/src/gantt/GanttChart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -230,8 +230,8 @@ const GanttChartInner = (props: GanttChartInnerProps) => {

const {rootServerURI} = React.useContext(AppContext);

const {availability, status} = React.useContext(WebSocketContext);
const lostWebsocket = availability === 'available' && status === WebSocket.CLOSED;
const {availability, disabled, status} = React.useContext(WebSocketContext);
const lostWebsocket = !disabled && availability === 'available' && status === WebSocket.CLOSED;

// The slider in the UI updates `options.zoom` from 1-100. We convert that value
// into a px-per-ms "scale", where the minimum is the value required to zoom-to-fit.
Expand Down
4 changes: 2 additions & 2 deletions js_modules/dagit/packages/core/src/runs/LogsProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -264,13 +264,13 @@ const LogsProviderWithQuery = (props: LogsProviderWithQueryProps) => {

export const LogsProvider: React.FC<LogsProviderProps> = (props) => {
const {children, runId} = props;
const {availability} = React.useContext(WebSocketContext);
const {availability, disabled} = React.useContext(WebSocketContext);

if (availability === 'attempting-to-connect') {
return <>{children({allNodes: [], loading: true})}</>;
}

if (availability === 'unavailable') {
if (availability === 'unavailable' || disabled) {
return <LogsProviderWithQuery runId={runId}>{children}</LogsProviderWithQuery>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const testValue: AppContextValue = {
const websocketValue: WebSocketContextType = {
availability: 'available',
status: WebSocket.OPEN,
disabled: false,
};

interface Props {
Expand Down

0 comments on commit 5480b04

Please sign in to comment.