Skip to content

Commit bee98e1

Browse files
authored
fix: race Condition on Object Browser via Websocket (#2492)
Signed-off-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
1 parent 8abbbb4 commit bee98e1

File tree

6 files changed

+37
-31
lines changed

6 files changed

+37
-31
lines changed

portal-ui/src/screens/Console/Buckets/BucketDetails/BrowserHandler.tsx

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import {
4242
setIsVersioned,
4343
setLoadingLocking,
4444
setLoadingObjectInfo,
45-
setLoadingObjectsList,
45+
setLoadingObjects,
4646
setLoadingRecords,
4747
setLoadingVersioning,
4848
setLoadingVersions,
@@ -82,12 +82,16 @@ const styles = (theme: Theme) =>
8282
let objectsWS: WebSocket;
8383
let currentRequestID: number = 0;
8484
let errorCounter: number = 0;
85+
let wsInFlight: boolean = false;
8586

8687
const initWSConnection = (
87-
onMessageCallback: (message: IMessageEvent) => void,
8888
openCallback?: () => void,
89-
notAvailableCallback?: () => void
89+
onMessageCallback?: (message: IMessageEvent) => void
9090
) => {
91+
if (wsInFlight) {
92+
return;
93+
}
94+
wsInFlight = true;
9195
const url = new URL(window.location.toString());
9296
const isDev = process.env.NODE_ENV === "development";
9397
const port = isDev ? "9090" : url.port;
@@ -103,41 +107,43 @@ const initWSConnection = (
103107
);
104108

105109
objectsWS.onopen = () => {
110+
wsInFlight = false;
106111
if (openCallback) {
107112
openCallback();
108113
}
109114
errorCounter = 0;
110115
};
111116

117+
if (onMessageCallback) {
118+
objectsWS.onmessage = onMessageCallback;
119+
}
120+
112121
const reconnectFn = () => {
113122
if (errorCounter <= 5) {
114-
initWSConnection(onMessageCallback, openCallback);
123+
initWSConnection(openCallback, onMessageCallback);
115124
errorCounter += 1;
116125
} else {
117126
console.error("Websocket not available.");
118-
if (notAvailableCallback) {
119-
notAvailableCallback();
120-
}
121127
}
122128
};
123129

124130
objectsWS.onclose = () => {
131+
wsInFlight = false;
125132
console.warn("Websocket Disconnected. Attempting Reconnection...");
126133

127134
// We reconnect after 3 seconds
128135
setTimeout(reconnectFn, 3000);
129136
};
130137

131138
objectsWS.onerror = () => {
139+
wsInFlight = false;
132140
console.error("Error in websocket connection. Attempting reconnection...");
133141

134142
// We reconnect after 3 seconds
135143
setTimeout(reconnectFn, 3000);
136144
};
137145
};
138146

139-
initWSConnection(() => {});
140-
141147
const BrowserHandler = () => {
142148
const dispatch = useAppDispatch();
143149
const navigate = useNavigate();
@@ -201,10 +207,10 @@ const BrowserHandler = () => {
201207
const obOnly = !!features?.includes("object-browser-only");
202208

203209
/*WS Request Handlers*/
204-
objectsWS.onmessage = useCallback(
210+
const onMessageCallBack = useCallback(
205211
(message: IMessageEvent) => {
206212
// reset start status
207-
dispatch(setLoadingObjectsList(false));
213+
dispatch(setLoadingObjects(false));
208214

209215
const response: WebsocketResponse = JSON.parse(message.data.toString());
210216
if (currentRequestID === response.request_id) {
@@ -250,7 +256,7 @@ const BrowserHandler = () => {
250256

251257
// This indicates final messages is received.
252258
if (response.request_end) {
253-
dispatch(setLoadingObjectsList(false));
259+
dispatch(setLoadingObjects(false));
254260
dispatch(setLoadingRecords(false));
255261
return;
256262
}
@@ -283,18 +289,18 @@ const BrowserHandler = () => {
283289
// We store the new ID for the requestID
284290
currentRequestID = newRequestID;
285291
} catch (e) {
286-
console.log(e);
292+
console.error(e);
287293
}
288294
} else {
289295
// Socket is disconnected, we request reconnection but will need to recreate call
290296
const dupRequest = () => {
291297
initWSRequest(path, date);
292298
};
293299

294-
initWSConnection(dupRequest);
300+
initWSConnection(dupRequest, onMessageCallBack);
295301
}
296302
},
297-
[bucketName, rewindEnabled, showDeleted, dispatch]
303+
[bucketName, rewindEnabled, showDeleted, dispatch, onMessageCallBack]
298304
);
299305

300306
useEffect(() => {
@@ -394,7 +400,7 @@ const BrowserHandler = () => {
394400

395401
initWSRequest(pathPrefix, requestDate);
396402
} else {
397-
dispatch(setLoadingObjectsList(false));
403+
dispatch(setLoadingObjects(false));
398404
}
399405
// eslint-disable-next-line react-hooks/exhaustive-deps
400406
}, [

portal-ui/src/screens/Console/Buckets/ListBuckets/ListBuckets.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import { selFeatures } from "../../consoleSlice";
6464
import AutoColorIcon from "../../Common/Components/AutoColorIcon";
6565
import TooltipWrapper from "../../Common/TooltipWrapper/TooltipWrapper";
6666
import AButton from "../../Common/AButton/AButton";
67-
import { setLoadingObjectsList } from "../../ObjectBrowser/objectBrowserSlice";
67+
import { setLoadingObjects } from "../../ObjectBrowser/objectBrowserSlice";
6868

6969
const styles = (theme: Theme) =>
7070
createStyles({
@@ -124,7 +124,7 @@ const ListBuckets = ({ classes }: IListBucketsProps) => {
124124
.then((res: BucketList) => {
125125
setLoading(false);
126126
setRecords(res.buckets || []);
127-
dispatch(setLoadingObjectsList(true));
127+
dispatch(setLoadingObjects(true));
128128
})
129129
.catch((err: ErrorResponseHandler) => {
130130
setLoading(false);

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ import {
9696
resetMessages,
9797
resetRewind,
9898
setDownloadRenameModal,
99-
setLoadingObjectsList,
99+
setLoadingObjects,
100100
setLoadingRecords,
101101
setLoadingVersions,
102102
setNewObject,
@@ -317,7 +317,7 @@ const ListObjects = () => {
317317

318318
useEffect(() => {
319319
dispatch(setSearchObjects(""));
320-
dispatch(setLoadingObjectsList(true));
320+
dispatch(setLoadingObjects(true));
321321
dispatch(setSelectedObjects([]));
322322
}, [simplePath, dispatch]);
323323

@@ -424,7 +424,7 @@ const ListObjects = () => {
424424
if (refresh) {
425425
dispatch(setSnackBarMessage(`Objects deleted successfully.`));
426426
dispatch(setSelectedObjects([]));
427-
dispatch(setLoadingObjectsList(true));
427+
dispatch(setLoadingObjects(true));
428428
}
429429
};
430430

@@ -595,7 +595,7 @@ const ListObjects = () => {
595595
};
596596
xhr.onloadend = () => {
597597
if (files.length === 0) {
598-
dispatch(setLoadingObjectsList(true));
598+
dispatch(setLoadingObjects(true));
599599
}
600600
};
601601
xhr.onabort = () => {
@@ -650,7 +650,7 @@ const ListObjects = () => {
650650
dispatch(setErrorSnackMessage(err));
651651
}
652652
// We force objects list reload after all promises were handled
653-
dispatch(setLoadingObjectsList(true));
653+
dispatch(setLoadingObjects(true));
654654
dispatch(setSelectedObjects([]));
655655
});
656656
};
@@ -736,7 +736,7 @@ const ListObjects = () => {
736736
dispatch(setSelectedObjects([]));
737737

738738
if (forceRefresh) {
739-
dispatch(setLoadingObjectsList(true));
739+
dispatch(setLoadingObjects(true));
740740
}
741741
};
742742

@@ -949,7 +949,7 @@ const ListObjects = () => {
949949
} else {
950950
dispatch(resetMessages());
951951
dispatch(setLoadingRecords(true));
952-
dispatch(setLoadingObjectsList(true));
952+
dispatch(setLoadingObjects(true));
953953
}
954954
}}
955955
disabled={

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjectsTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { AppState, useAppDispatch } from "../../../../../../store";
2727
import { selFeatures } from "../../../../consoleSlice";
2828
import { encodeURLString } from "../../../../../../common/utils";
2929
import {
30-
setLoadingObjectsList,
30+
setLoadingObjects,
3131
setLoadingVersions,
3232
setObjectDetailsView,
3333
setSelectedObjects,
@@ -168,7 +168,7 @@ const ListObjectsTable = () => {
168168
const newSortDirection = get(sortData, "sortDirection", "DESC");
169169
setCurrentSortField(sortData.sortBy);
170170
setSortDirection(newSortDirection);
171-
dispatch(setLoadingObjectsList(true));
171+
dispatch(setLoadingObjects(true));
172172
};
173173

174174
const selectAllItems = () => {

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/RewindEnable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import FormSwitchWrapper from "../../../../Common/FormComponents/FormSwitchWrapp
2525
import { AppState, useAppDispatch } from "../../../../../../store";
2626
import {
2727
resetRewind,
28-
setLoadingObjectsList,
28+
setLoadingObjects,
2929
setRewindEnable,
3030
} from "../../../../ObjectBrowser/objectBrowserSlice";
3131

@@ -73,7 +73,7 @@ const RewindEnable = ({
7373
})
7474
);
7575
}
76-
dispatch(setLoadingObjectsList(true));
76+
dispatch(setLoadingObjects(true));
7777

7878
closeModalAndRefresh();
7979
};

portal-ui/src/screens/Console/ObjectBrowser/objectBrowserSlice.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ export const objectBrowserSlice = createSlice({
233233
setSearchObjects: (state, action: PayloadAction<string>) => {
234234
state.searchObjects = action.payload;
235235
},
236-
setLoadingObjectsList: (state, action: PayloadAction<boolean>) => {
236+
setLoadingObjects: (state, action: PayloadAction<boolean>) => {
237237
state.loadingObjects = action.payload;
238238
},
239239
setSearchVersions: (state, action: PayloadAction<string>) => {
@@ -352,7 +352,7 @@ export const {
352352
openList,
353353
closeList,
354354
setSearchObjects,
355-
setLoadingObjectsList,
355+
setLoadingObjects,
356356
cancelObjectInList,
357357
setSearchVersions,
358358
setSelectedVersion,

0 commit comments

Comments
 (0)