This is an automated email from the ASF dual-hosted git repository.
arafat2198 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 9b713d0b65 HDDS-12395. Add Mismatched Replica tab to the Containers
Page (#8407)
9b713d0b65 is described below
commit 9b713d0b6594785872090cd78798a0931779f630
Author: Abhishek Pal <[email protected]>
AuthorDate: Mon Jul 7 14:02:56 2025 +0530
HDDS-12395. Add Mismatched Replica tab to the Containers Page (#8407)
---
.../webapps/recon/ozone-recon-web/api/db.json | 40 ++++++++++++++++++
.../src/v2/components/tables/containersTable.tsx | 48 ++++++++++++++++++----
.../src/v2/pages/containers/containers.less | 13 +++++-
.../src/v2/pages/containers/containers.tsx | 27 +++++++++++-
.../src/v2/types/container.types.ts | 2 +
5 files changed, 117 insertions(+), 13 deletions(-)
diff --git
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
index 784ee8302e..30fed20bae 100644
---
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
+++
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
@@ -2247,6 +2247,46 @@
"lastBcsId": 0
}
]
+ },
+ {
+ "containerID": 10,
+ "containerState": "REPLICA_MISMATCH",
+ "unhealthySince": 1665590446222,
+ "expectedReplicaCount": 3,
+ "actualReplicaCount": 3,
+ "replicaDeltaCount": 0,
+ "reason": null,
+ "keys": 1,
+ "pipelineID": "a10ffab6-8ed5-414a-aaf5-79890ff3e8a1",
+ "replicas": [
+ {
+ "containerId": 10,
+ "datanodeUuid": "15526f1b-76f2-4d8f-876c-c343c94ea476",
+ "datanodeHost": "ozone_datanode_2.ozone_overreplicated4",
+ "firstSeenTime": 1665588176660,
+ "lastSeenTime": 1665590397315,
+ "lastBcsId": 2,
+ "dataChecksum": 12345678
+ },
+ {
+ "containerId": 10,
+ "datanodeUuid": "f55476ab-4687-464d-a100-1c65de4366e3",
+ "datanodeHost": "ozone_datanode_3.ozone_overreplicated4",
+ "firstSeenTime": 1665588176616,
+ "lastSeenTime": 1665590392293,
+ "lastBcsId": 2,
+ "dataChecksum": 23456789
+ },
+ {
+ "containerId": 10,
+ "datanodeUuid": "7a457bcb-d63e-49cc-b3ff-8b22bf48d130",
+ "datanodeHost": "ozone_datanode_1.ozone_overreplicated4",
+ "firstSeenTime": 1665588176660,
+ "lastSeenTime": 1665590272289,
+ "lastBcsId": 0,
+ "dataChecksum": 12345678
+ }
+ ]
}
]
},
diff --git
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/tables/containersTable.tsx
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/tables/containersTable.tsx
index a68c9928ee..424d58cf24 100644
---
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/tables/containersTable.tsx
+++
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/components/tables/containersTable.tsx
@@ -18,10 +18,14 @@
import React, {useRef} from 'react';
import filesize from 'filesize';
-import {AxiosError} from 'axios';
-import {Popover, Table} from 'antd';
-import {ColumnsType, TablePaginationConfig} from 'antd/es/table';
-import {NodeIndexOutlined} from '@ant-design/icons';
+
+import { AxiosError } from 'axios';
+import { Popover, Table } from 'antd';
+import {
+ ColumnsType,
+ TablePaginationConfig
+} from 'antd/es/table';
+import { CheckCircleOutlined, NodeIndexOutlined } from '@ant-design/icons';
import {getFormattedTime} from '@/v2/utils/momentUtils';
import {showDataFetchError} from '@/utils/common';
@@ -37,6 +41,23 @@ import {
const size = filesize.partial({ standard: 'iec' });
+const getDatanodeWith = (idx: number, host: string) => {
+ return (
+ <div key={idx} className='datanode-container-v2-tr'>
+ <NodeIndexOutlined /> {host}
+ </div>
+ );
+}
+
+const getDataNodeWithChecksum = (idx: number, host: string, checksum: string)
=> {
+ return (
+ <div key={idx} className='datanode-container-v2-tr'>
+ <span className="datanode-container-v2-td"><NodeIndexOutlined />
{host}</span>
+ <span className="datanode-container-v2-td">/ {checksum}</span>
+ </div>
+ )
+}
+
export const COLUMNS: ColumnsType<Container> = [
{
title: 'Container ID',
@@ -69,17 +90,26 @@ export const COLUMNS: ColumnsType<Container> = [
key: 'replicas',
render: (replicas: ContainerReplica[]) => {
const renderDatanodes = (replicas: ContainerReplica[]) => {
- return replicas?.map((replica: any, idx: number) => (
- <div key={idx} className='datanode-container-v2'>
- <NodeIndexOutlined /> {replica.datanodeHost}
+ return (
+ <div className="datanode-container-v2-table">
+ {
+ replicas?.map((replica: any, idx: number) => (
+ (replica.dataChecksum)
+ ? getDataNodeWithChecksum(idx, replica.datanodeHost,
replica.dataChecksum)
+ : getDatanodeWith(idx, replica.datanodeHost)
+ ))}
</div>
- ))
+ )
}
return (
<Popover
content={renderDatanodes(replicas)}
- title='Datanodes'
+ title={
+ replicas.some((replica => replica.hasOwnProperty('dataChecksum')))
+ ? 'Datanodes / Checksum'
+ : 'Datanodes'
+ }
placement='bottomRight'
trigger='hover'>
<strong>{replicas.length}</strong> datanodes
diff --git
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.less
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.less
index f6328ccee6..3f4afc5fc0 100644
---
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.less
+++
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.less
@@ -45,6 +45,15 @@
}
}
-.datanode-container-v2 {
- padding: 6px 0px;
+.datanode-container-v2-table {
+ display: table;
+
+ .datanode-container-v2-tr {
+ display: table-row-group;
+
+ .datanode-container-v2-td {
+ display: table-cell;
+ padding: 2px 4px;
+ }
+ }
}
\ No newline at end of file
diff --git
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.tsx
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.tsx
index 78f6424c6e..5cdbdd5262 100644
---
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.tsx
+++
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/containers/containers.tsx
@@ -64,6 +64,7 @@ const Containers: React.FC<{}> = () => {
underReplicatedContainerData: [],
overReplicatedContainerData: [],
misReplicatedContainerData: [],
+ mismatchedReplicaContainerData: []
});
const [expandedRow, setExpandedRow] = useState<ExpandedRow>({});
@@ -100,6 +101,9 @@ const Containers: React.FC<{}> = () => {
const misReplicatedContainerData: Container[] = containers?.filter(
container => container.containerState === 'MIS_REPLICATED'
) ?? [];
+ const mismatchedReplicaContainerData: Container[] = containers?.filter(
+ container => container.containerState === 'REPLICA_MISMATCH'
+ ) ?? [];
setState({
...state,
@@ -107,6 +111,7 @@ const Containers: React.FC<{}> = () => {
underReplicatedContainerData: underReplicatedContainerData,
overReplicatedContainerData: overReplicatedContainerData,
misReplicatedContainerData: misReplicatedContainerData,
+ mismatchedReplicaContainerData: mismatchedReplicaContainerData,
lastUpdated: Number(moment())
});
setLoading(false)
@@ -135,7 +140,7 @@ const Containers: React.FC<{}> = () => {
const {
lastUpdated, columnOptions,
missingContainerData, underReplicatedContainerData,
- overReplicatedContainerData, misReplicatedContainerData
+ overReplicatedContainerData, misReplicatedContainerData,
mismatchedReplicaContainerData
} = state;
// Mapping the data to the Tab keys for enabling/disabling search
@@ -143,7 +148,8 @@ const Containers: React.FC<{}> = () => {
1: missingContainerData,
2: underReplicatedContainerData,
3: overReplicatedContainerData,
- 4: misReplicatedContainerData
+ 4: misReplicatedContainerData,
+ 5: mismatchedReplicaContainerData
}
const highlightData = (
@@ -168,6 +174,10 @@ const Containers: React.FC<{}> = () => {
Mis-Replicated <br/>
<span
className='highlight-content-value'>{misReplicatedContainerData?.length ??
'N/A'}</span>
</div>
+ <div className='highlight-content'>
+ Mismatched Replicas <br/>
+ <span
className='highlight-content-value'>{mismatchedReplicaContainerData?.length ??
'N/A'}</span>
+ </div>
</div>
)
@@ -273,6 +283,19 @@ const Containers: React.FC<{}> = () => {
expandedRowSetter={setExpandedRow}
/>
</Tabs.TabPane>
+ <Tabs.TabPane
+ key='5'
+ tab='Mismatched Replicas'>
+ <ContainerTable
+ data={mismatchedReplicaContainerData}
+ loading={loading}
+ searchColumn={searchColumn}
+ searchTerm={debouncedSearch}
+ selectedColumns={selectedColumns}
+ expandedRow={expandedRow}
+ expandedRowSetter={setExpandedRow}
+ />
+ </Tabs.TabPane>
</Tabs>
</div>
</div>
diff --git
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/container.types.ts
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/container.types.ts
index 2467a0f26f..85d542ff0c 100644
---
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/container.types.ts
+++
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/container.types.ts
@@ -25,6 +25,7 @@ export type ContainerReplica = {
firstSeenTime: number;
lastSeenTime: number;
lastBcsId: number;
+ dataChecksum?: string;
}
export type Container = {
@@ -91,4 +92,5 @@ export type ContainerState = {
underReplicatedContainerData: Container[];
overReplicatedContainerData: Container[];
misReplicatedContainerData: Container[];
+ mismatchedReplicaContainerData: Container[];
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]