Skip to content

Commit 0af72a4

Browse files
feat(Storage,Nodes): request only needed fields from backend (#1491)
1 parent dbe83b2 commit 0af72a4

File tree

23 files changed

+144
-64
lines changed

23 files changed

+144
-64
lines changed

src/components/PaginatedTable/TableChunk.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ export const TableChunk = <T, F>({
4747
const [isTimeoutActive, setIsTimeoutActive] = React.useState(true);
4848
const [autoRefreshInterval] = useAutoRefreshInterval();
4949

50+
const columnsIds = columns.map((column) => column.name);
51+
5052
const queryParams = {
5153
offset: id * limit,
5254
limit,
5355
fetchData: fetchData as FetchData<T, unknown>,
5456
filters,
5557
sortParams,
58+
columnsIds,
5659
tableName,
5760
};
5861

src/components/PaginatedTable/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ type FetchDataParams<F, E = {}> = {
4747
offset: number;
4848
filters?: F;
4949
sortParams?: SortParams;
50+
columnsIds: string[];
5051
signal?: AbortSignal;
5152
} & E;
5253

src/components/nodesColumns/columns.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {valueIsDefined} from '../../utils';
77
import {EMPTY_DATA_PLACEHOLDER} from '../../utils/constants';
88
import {formatStorageValuesToGb} from '../../utils/dataFormatters/dataFormatters';
99
import {getSpaceUsageSeverity} from '../../utils/storage';
10+
import type {Column} from '../../utils/tableUtils/types';
1011
import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
1112
import {NodeHostWrapper} from '../NodeHostWrapper/NodeHostWrapper';
1213
import type {NodeHostData} from '../NodeHostWrapper/NodeHostWrapper';
@@ -16,7 +17,7 @@ import {TabletsStatistic} from '../TabletsStatistic';
1617
import {UsageLabel} from '../UsageLabel/UsageLabel';
1718

1819
import {NODES_COLUMNS_IDS, NODES_COLUMNS_TITLES} from './constants';
19-
import type {Column, GetNodesColumnsParams} from './types';
20+
import type {GetNodesColumnsParams} from './types';
2021

2122
export function getNodeIdColumn<T extends {NodeId?: string | number}>(): Column<T> {
2223
return {

src/components/nodesColumns/constants.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type {NodesRequiredField} from '../../types/api/nodes';
12
import type {ValueOf} from '../../types/common';
23

34
import i18n from './i18n';
@@ -21,6 +22,7 @@ export const NODES_COLUMNS_IDS = {
2122
TotalSessions: 'TotalSessions',
2223
Missing: 'Missing',
2324
Tablets: 'Tablets',
25+
PDisks: 'PDisks',
2426
} as const;
2527

2628
export type NodesColumnId = ValueOf<typeof NODES_COLUMNS_IDS>;
@@ -76,4 +78,29 @@ export const NODES_COLUMNS_TITLES = {
7678
get Tablets() {
7779
return i18n('tablets');
7880
},
81+
get PDisks() {
82+
return i18n('pdisks');
83+
},
7984
} as const satisfies Record<NodesColumnId, string>;
85+
86+
// Although columns ids mostly similar to backend fields, there might be some difference
87+
// Also for some columns we may use more than one field
88+
export const NODES_COLUMNS_TO_DATA_FIELDS: Record<NodesColumnId, NodesRequiredField[]> = {
89+
NodeId: ['NodeId'],
90+
Host: ['Host', 'Rack', 'Database', 'SystemState'],
91+
NodeName: ['NodeName'],
92+
DC: ['DC'],
93+
Rack: ['Rack'],
94+
Version: ['Version'],
95+
Uptime: ['Uptime'],
96+
Memory: ['Memory'],
97+
CPU: ['CPU'],
98+
LoadAverage: ['LoadAverage'],
99+
Load: ['LoadAverage'],
100+
DiskSpaceUsage: ['DiskSpaceUsage'],
101+
SharedCacheUsage: ['SystemState'],
102+
TotalSessions: ['SystemState'],
103+
Missing: ['Missing'],
104+
Tablets: ['Tablets', 'Database'],
105+
PDisks: ['PDisks'],
106+
};

src/components/nodesColumns/i18n/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
"load": "Load",
1515
"caches": "Caches",
1616
"sessions": "Sessions",
17-
"missing": "Missing"
17+
"missing": "Missing",
18+
"pdisks": "PDisks"
1819
}

src/components/nodesColumns/types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import type {Column as DataTableColumn} from '@gravity-ui/react-data-table';
2-
31
import type {GetNodeRefFunc} from '../../types/additionalProps';
4-
import type {Column as PaginatedTableColumn} from '../PaginatedTable';
5-
6-
export type Column<T> = PaginatedTableColumn<T> & DataTableColumn<T>;
72

83
export interface GetNodesColumnsParams {
94
getNodeRef?: GetNodeRefFunc;

src/containers/Nodes/columns/columns.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ import {
1111
getUptimeColumn,
1212
getVersionColumn,
1313
} from '../../../components/nodesColumns/columns';
14-
import type {Column, GetNodesColumnsParams} from '../../../components/nodesColumns/types';
14+
import type {GetNodesColumnsParams} from '../../../components/nodesColumns/types';
1515
import type {NodesPreparedEntity} from '../../../store/reducers/nodes/types';
1616
import {isSortableNodesProperty} from '../../../utils/nodes';
17+
import type {Column} from '../../../utils/tableUtils/types';
1718

1819
export function getNodesColumns(params: GetNodesColumnsParams): Column<NodesPreparedEntity>[] {
1920
const columns = [

src/containers/Nodes/getNodes.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {FetchData} from '../../components/PaginatedTable';
2+
import {NODES_COLUMNS_TO_DATA_FIELDS} from '../../components/nodesColumns/constants';
23
import type {NodesFilters, NodesPreparedEntity} from '../../store/reducers/nodes/types';
34
import {prepareNodesData} from '../../store/reducers/nodes/utils';
45
import type {NodesRequestParams} from '../../types/api/nodes';
@@ -8,6 +9,7 @@ import {
89
getUptimeParamValue,
910
isSortableNodesProperty,
1011
} from '../../utils/nodes';
12+
import {getRequiredDataFields} from '../../utils/tableUtils/getRequiredDataFields';
1113

1214
const getConcurrentId = (limit?: number, offset?: number) => {
1315
return `getNodes|offset${offset}|limit${limit}`;
@@ -26,6 +28,7 @@ export const getNodes: FetchData<
2628
offset,
2729
sortParams,
2830
filters,
31+
columnsIds,
2932
} = params;
3033

3134
const {sortOrder, columnId} = sortParams ?? {};
@@ -35,6 +38,8 @@ export const getNodes: FetchData<
3538
? prepareSortValue(columnId, sortOrder)
3639
: undefined;
3740

41+
const dataFieldsRequired = getRequiredDataFields(columnsIds, NODES_COLUMNS_TO_DATA_FIELDS);
42+
3843
const response = await window.api.getNodes(
3944
{
4045
type,
@@ -48,6 +53,7 @@ export const getNodes: FetchData<
4853
filter: searchValue,
4954
problems_only: getProblemParamValue(problemFilter),
5055
uptime: getUptimeParamValue(uptimeFilter),
56+
fieldsRequired: dataFieldsRequired,
5157
},
5258
{concurrentId: getConcurrentId(limit, offset), signal: params.signal},
5359
);

src/containers/Storage/StorageGroups/columns/constants.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type {SelectOption} from '@gravity-ui/uikit';
22
import {z} from 'zod';
33

4-
import type {GroupsGroupByField} from '../../../../types/api/storage';
4+
import type {GroupsGroupByField, GroupsRequiredField} from '../../../../types/api/storage';
55
import type {ValueOf} from '../../../../types/common';
66

77
import i18n from './i18n';
@@ -31,7 +31,7 @@ export const STORAGE_GROUPS_COLUMNS_IDS = {
3131
State: 'State',
3232
} as const;
3333

34-
type StorageGroupsColumnId = ValueOf<typeof STORAGE_GROUPS_COLUMNS_IDS>;
34+
export type StorageGroupsColumnId = ValueOf<typeof STORAGE_GROUPS_COLUMNS_IDS>;
3535

3636
export const DEFAULT_STORAGE_GROUPS_COLUMNS: StorageGroupsColumnId[] = [
3737
'GroupId',
@@ -136,3 +136,29 @@ export const storageGroupsGroupByParamSchema = z
136136
GroupsGroupByField | undefined
137137
>((value) => STORAGE_GROUPS_GROUP_BY_PARAMS.includes(value))
138138
.catch(undefined);
139+
140+
// Although columns ids mostly similar to backend fields, there might be some difference
141+
// Also for some columns we may use more than one field
142+
export const GROUPS_COLUMNS_TO_DATA_FIELDS: Record<StorageGroupsColumnId, GroupsRequiredField[]> = {
143+
GroupId: ['GroupId'],
144+
PoolName: ['PoolName'],
145+
// We display MediaType and Encryption in one Type column
146+
MediaType: ['MediaType', 'Encryption'],
147+
Encryption: ['Encryption'],
148+
Erasure: ['Erasure'],
149+
Used: ['Used'],
150+
Limit: ['Limit'],
151+
Usage: ['Usage'],
152+
DiskSpaceUsage: ['DiskSpaceUsage'],
153+
DiskSpace: ['State'],
154+
Read: ['Read'],
155+
Write: ['Write'],
156+
Latency: ['Latency'],
157+
AllocationUnits: ['AllocationUnits'],
158+
// Read and Write fields make backend to return Whiteboard data
159+
VDisks: ['VDisk', 'PDisk', 'Read', 'Write'],
160+
VDisksPDisks: ['VDisk', 'PDisk', 'Read', 'Write'],
161+
MissingDisks: ['MissingDisks'],
162+
Degraded: ['MissingDisks'],
163+
State: ['State'],
164+
};

src/containers/Storage/StorageGroups/columns/types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import type {Column as DataTableColumn} from '@gravity-ui/react-data-table';
2-
3-
import type {Column as PaginatedTableColumn} from '../../../../components/PaginatedTable';
41
import type {PreparedStorageGroup, VisibleEntities} from '../../../../store/reducers/storage/types';
2+
import type {Column} from '../../../../utils/tableUtils/types';
53
import type {StorageViewContext} from '../../types';
64

7-
export type StorageGroupsColumn = PaginatedTableColumn<PreparedStorageGroup> &
8-
DataTableColumn<PreparedStorageGroup>;
5+
export type StorageGroupsColumn = Column<PreparedStorageGroup>;
96

107
export interface GetStorageColumnsData {
118
viewContext: StorageViewContext;

0 commit comments

Comments
 (0)