Skip to content

Commit afb6e95

Browse files
authored
fix(VDiskPage): use vdisk_id for api requests if possible (#3001)
1 parent 34e428a commit afb6e95

File tree

8 files changed

+80
-65
lines changed

8 files changed

+80
-65
lines changed

src/containers/Header/breadcrumbs.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Database as DatabaseIcon,
55
HardDrive as StorageNodeIcon,
66
} from '@gravity-ui/icons';
7+
import {isNil} from 'lodash';
78

89
import {TabletIcon} from '../../components/TabletIcon/TabletIcon';
910
import routes, {getPDiskPagePath, getStorageGroupPath} from '../../routes';
@@ -172,13 +173,13 @@ const getStorageGroupBreadcrumbs: GetBreadcrumbs<StorageGroupBreadcrumbsOptions>
172173
: getClusterBreadcrumbs(options, query);
173174

174175
let text = headerKeyset('breadcrumbs.storageGroup');
175-
if (groupId) {
176+
if (!isNil(groupId)) {
176177
text += ` ${groupId}`;
177178
}
178179

179180
const lastItem = {
180181
text,
181-
link: groupId ? getStorageGroupPath(groupId, {database}) : undefined,
182+
link: isNil(groupId) ? undefined : getStorageGroupPath(groupId, {database}),
182183
};
183184
breadcrumbs.push(lastItem);
184185

src/containers/VDiskPage/VDiskPage.tsx

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,12 @@ export function VDiskPage() {
6565
const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges();
6666
const newDiskApiAvailable = useDiskPagesAvailable();
6767

68-
const [{nodeId, pDiskId, vDiskId: vDiskIdParam, activeTab, database: databaseParam}] =
69-
useQueryParams({
70-
nodeId: StringParam,
71-
pDiskId: StringParam,
72-
vDiskId: StringParam,
73-
activeTab: StringParam,
74-
database: StringParam,
75-
});
68+
const [{nodeId, vDiskId: vDiskIdParam, activeTab, database: databaseParam}] = useQueryParams({
69+
nodeId: StringParam,
70+
vDiskId: StringParam,
71+
activeTab: StringParam,
72+
database: StringParam,
73+
});
7674
const database = databaseParam ?? undefined;
7775

7876
const vDiskTab = vDiskTabSchema.parse(activeTab);
@@ -107,8 +105,17 @@ export function VDiskPage() {
107105
}, [dispatch, database, vDiskData?.VDiskId?.GroupID, vDiskData?.StringifiedId]);
108106

109107
const loading = isFetching && vDiskData === undefined;
110-
const {NodeHost, NodeId, NodeType, NodeDC, PDiskId, PDiskType, Severity, VDiskId} =
111-
vDiskData || {};
108+
const {
109+
NodeHost,
110+
NodeId,
111+
NodeType,
112+
NodeDC,
113+
PDiskId,
114+
PDiskType,
115+
Severity,
116+
VDiskId,
117+
StringifiedId,
118+
} = vDiskData || {};
112119

113120
const {GroupID, GroupGeneration, Ring, Domain, VDisk} =
114121
VDiskId || (!loading && getVDiskIdFromString(vDiskIdParam)) || {};
@@ -169,8 +176,8 @@ export function VDiskPage() {
169176
? `${vDiskPageKeyset('vdisk')} ${vDiskSlotId}`
170177
: vDiskPageKeyset('vdisk');
171178

172-
const pDiskPagePart = pDiskId
173-
? `${vDiskPageKeyset('pdisk')} ${pDiskId}`
179+
const pDiskPagePart = PDiskId
180+
? `${vDiskPageKeyset('pdisk')} ${PDiskId}`
174181
: vDiskPageKeyset('pdisk');
175182

176183
const nodePagePart = NodeHost ? NodeHost : vDiskPageKeyset('node');
@@ -275,8 +282,9 @@ export function VDiskPage() {
275282
<VDiskTablets
276283
scrollContainerRef={containerRef}
277284
nodeId={nodeId ?? undefined}
278-
pDiskId={pDiskId ?? undefined}
285+
pDiskId={PDiskId}
279286
vDiskSlotId={vDiskSlotId ?? undefined}
287+
vDiskId={StringifiedId}
280288
className={vDiskPageCn('tablets-content')}
281289
/>
282290
);
@@ -293,12 +301,12 @@ export function VDiskPage() {
293301
database={database}
294302
groupId={GroupID}
295303
nodeId={nodeId ?? undefined}
296-
pDiskId={pDiskId ?? undefined}
304+
pDiskId={PDiskId}
297305
scrollContainerRef={containerRef}
298306
viewContext={{
299307
groupId: GroupID?.toString(),
300308
nodeId: nodeId?.toString(),
301-
pDiskId: pDiskId?.toString(),
309+
pDiskId: PDiskId?.toString(),
302310
vDiskSlotId: vDiskSlotId?.toString(),
303311
}}
304312
/>

src/containers/VDiskPage/VDiskTablets/VDiskTablets.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {isNil} from 'lodash';
77
import {PageError} from '../../../components/Errors/PageError/PageError';
88
import {ResizeableDataTable} from '../../../components/ResizeableDataTable/ResizeableDataTable';
99
import {TableWithControlsLayout} from '../../../components/TableWithControlsLayout/TableWithControlsLayout';
10+
import {useBlobIndexStatWithVdiskId} from '../../../store/reducers/capabilities/hooks';
1011
import {vDiskApi} from '../../../store/reducers/vdisk/vdisk';
1112
import type {VDiskBlobIndexItem} from '../../../types/api/vdiskBlobIndex';
1213
import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants';
@@ -22,6 +23,7 @@ const columns = getColumns();
2223

2324
interface VDiskTabletsProps {
2425
nodeId?: string | number;
26+
vDiskId?: string;
2527
pDiskId?: string | number;
2628
vDiskSlotId?: string | number;
2729
className?: string;
@@ -32,19 +34,26 @@ export function VDiskTablets({
3234
nodeId,
3335
pDiskId,
3436
vDiskSlotId,
37+
vDiskId,
3538
className,
3639
scrollContainerRef,
3740
}: VDiskTabletsProps) {
3841
const [autoRefreshInterval] = useAutoRefreshInterval();
42+
const useVdiskId = useBlobIndexStatWithVdiskId();
3943

40-
const {currentData, isFetching, error} = vDiskApi.useGetVDiskBlobIndexStatQuery(
41-
!isNil(nodeId) && !isNil(pDiskId) && !isNil(vDiskSlotId)
42-
? {nodeId, pDiskId, vDiskSlotId}
43-
: skipToken,
44-
{
45-
pollingInterval: autoRefreshInterval,
46-
},
47-
);
44+
const params = React.useMemo(() => {
45+
if (useVdiskId && !isNil(vDiskId)) {
46+
return {vDiskId};
47+
}
48+
if (!isNil(nodeId) && !isNil(vDiskSlotId) && !isNil(pDiskId)) {
49+
return {nodeId, pDiskId, vDiskSlotId};
50+
}
51+
return skipToken;
52+
}, [nodeId, pDiskId, vDiskSlotId, vDiskId, useVdiskId]);
53+
54+
const {currentData, isFetching, error} = vDiskApi.useGetVDiskBlobIndexStatQuery(params, {
55+
pollingInterval: autoRefreshInterval,
56+
});
4857

4958
const loading = isFetching && currentData === undefined;
5059

src/services/api/viewer.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {PlanToSvgQueryParams} from '../../store/reducers/planToSvg';
2+
import type {VDiskBlobIndexStatParams} from '../../store/reducers/vdisk/vdisk';
23
import type {
34
AccessRightsUpdateRequest,
45
AvailablePermissionsResponse,
@@ -548,25 +549,21 @@ export class ViewerAPI extends BaseYdbAPI {
548549
}
549550

550551
getVDiskBlobIndexStat(
551-
{
552-
vDiskSlotId,
553-
pDiskId,
554-
nodeId,
555-
database,
556-
}: {
557-
vDiskSlotId: string | number;
558-
pDiskId: string | number;
559-
nodeId: string | number;
560-
database?: string;
561-
},
552+
{database, ...rest}: VDiskBlobIndexStatParams,
562553
{concurrentId, signal}: AxiosOptions = {},
563554
) {
555+
const params =
556+
'vDiskId' in rest
557+
? {vdisk_id: rest.vDiskId}
558+
: {
559+
node_id: rest.nodeId,
560+
pdisk_id: rest.pDiskId,
561+
vslot_id: rest.vDiskSlotId,
562+
};
564563
return this.get<VDiskBlobIndexResponse>(
565564
this.getPath('/vdisk/blobindexstat'),
566565
{
567-
node_id: nodeId,
568-
pdisk_id: pDiskId,
569-
vslot_id: vDiskSlotId,
566+
...params,
570567
database,
571568
},
572569
{concurrentId, requestConfig: {signal}},

src/store/reducers/capabilities/hooks.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ export const useStorageGroupsHandlerAvailable = () => {
5454
return useGetFeatureVersion('/storage/groups') > 2;
5555
};
5656

57+
export const useBlobIndexStatWithVdiskId = () => {
58+
return useGetFeatureVersion('/vdisk/blobindexstat') > 1;
59+
};
60+
5761
export const useStorageGroupsHandlerHasGrouping = () => {
5862
return useGetFeatureVersion('/storage/groups') > 4;
5963
};

src/store/reducers/vdisk/vdisk.ts

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {StorageGroupsResponse} from '../../../types/api/storage';
22
import type {TEvSystemStateResponse} from '../../../types/api/systemState';
3-
import {getVDiskSlotBasedId} from '../../../utils/disks/helpers';
3+
import {getVDiskId} from '../../../utils/disks/helpers';
44
import {api} from '../api';
55

66
import {prepareVDiskDataResponse} from './utils';
@@ -11,6 +11,14 @@ type VDiskDataRequestParams = {
1111
database?: string;
1212
};
1313

14+
type VDiskBlobIndexStatBasicParams =
15+
| {nodeId: string | number; pDiskId: string | number; vDiskSlotId: string | number}
16+
| {vDiskId: string};
17+
18+
export type VDiskBlobIndexStatParams = VDiskBlobIndexStatBasicParams & {
19+
database?: string;
20+
};
21+
1422
export const vDiskApi = api.injectEndpoints({
1523
endpoints: (build) => ({
1624
getVDiskData: build.query({
@@ -52,25 +60,11 @@ export const vDiskApi = api.injectEndpoints({
5260
],
5361
}),
5462
getVDiskBlobIndexStat: build.query({
55-
queryFn: async (
56-
{
57-
nodeId,
58-
pDiskId,
59-
vDiskSlotId,
60-
database,
61-
}: {
62-
nodeId: string | number;
63-
pDiskId: string | number;
64-
vDiskSlotId: string | number;
65-
database?: string;
66-
},
67-
{signal},
68-
) => {
63+
queryFn: async (params: VDiskBlobIndexStatParams, {signal}) => {
6964
try {
70-
const response = await window.api.viewer.getVDiskBlobIndexStat(
71-
{nodeId, pDiskId, vDiskSlotId, database},
72-
{signal},
73-
);
65+
const response = await window.api.viewer.getVDiskBlobIndexStat(params, {
66+
signal,
67+
});
7468
return {data: response};
7569
} catch (error) {
7670
return {error};
@@ -80,7 +74,7 @@ export const vDiskApi = api.injectEndpoints({
8074
'All',
8175
{
8276
type: 'VDiskBlobIndexStat',
83-
id: getVDiskSlotBasedId(arg.nodeId, arg.pDiskId, arg.vDiskSlotId),
77+
id: getVDiskId(arg),
8478
},
8579
],
8680
}),

src/types/api/capabilities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export type Capability =
2323
| '/viewer/feature_flags'
2424
| '/viewer/config'
2525
| '/viewer/cluster'
26+
| '/vdisk/blobindexstat'
2627
| '/viewer/nodes'
2728
| '/viewer/acl'
2829
| '/viewer/topic_data';

src/utils/disks/helpers.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {valueIsDefined} from '..';
2+
import type {VDiskBlobIndexStatParams} from '../../store/reducers/vdisk/vdisk';
23
import {EFlag} from '../../types/api/enums';
34
import type {TVDiskStateInfo, TVSlotId} from '../../types/api/vdisk';
45
import {generateEvaluator} from '../generateEvaluator';
@@ -47,10 +48,10 @@ export function getPDiskId({
4748
return undefined;
4849
}
4950

50-
export function getVDiskSlotBasedId(
51-
nodeId: string | number,
52-
pDiskId: string | number,
53-
vDiskSlotId: string | number,
54-
) {
55-
return [nodeId, pDiskId, vDiskSlotId].join('-');
51+
export function getVDiskId(params: VDiskBlobIndexStatParams) {
52+
const parts =
53+
'vDiskId' in params
54+
? [params.vDiskId]
55+
: [params.nodeId, params.pDiskId, params.vDiskSlotId];
56+
return parts.join('-');
5657
}

0 commit comments

Comments
 (0)