This is an automated email from the ASF dual-hosted git repository.
sarvekshayr pushed a commit to branch HDDS-9225-website-v2
in repository https://gitbox.apache.org/repos/asf/ozone-site.git
The following commit(s) were added to refs/heads/HDDS-9225-website-v2 by this
push:
new ccf4d9d87 HDDS-14295. [Website v2] [Docs] [Administrator Guide] Ozone
command line tools (#256)
ccf4d9d87 is described below
commit ccf4d9d87b89c534a03efb21bd2a6d480f67246e
Author: Russole <[email protected]>
AuthorDate: Thu Jan 29 16:41:42 2026 +0800
HDDS-14295. [Website v2] [Docs] [Administrator Guide] Ozone command line
tools (#256)
Co-authored-by: Wei-Chiu Chuang <[email protected]>
---
cspell.yaml | 8 +
.../03-operations/11-tools/01-ozone-repair.md | 274 ++++++++++++++++++
.../03-operations/11-tools/02-ozone-admin.md | 60 ++++
.../03-ozone-debug/01-ldb-tool.md} | 312 +++++++++++----------
.../11-tools/03-ozone-debug/02-debug-om.md | 42 +++
.../11-tools/03-ozone-debug/03-debug-datanode.md | 19 ++
.../11-tools/03-ozone-debug/04-debug-replicas.md | 101 +++++++
.../11-tools/03-ozone-debug/05-ratis-log-parser.md | 18 ++
.../03-ozone-debug/06-audit-parser-exact.md | 59 ++++
.../07-container-replica-debugger-tool.md | 250 +++++++++++++++++
.../11-tools/03-ozone-debug/README.mdx | 26 ++
.../03-operations/11-tools/README.mdx | 55 ++++
12 files changed, 1076 insertions(+), 148 deletions(-)
diff --git a/cspell.yaml b/cspell.yaml
index 15b22642e..c0ec4278c 100644
--- a/cspell.yaml
+++ b/cspell.yaml
@@ -212,6 +212,14 @@ words:
- utilisation
- utilised
- hotspots
+- activetimebyseconds
+- charindex
+- thecount
+- debugability
+- auditparser
+- checknative
+- subpages
+- analyse
# Infrastructure and hardware terms
- Chrony
- SAS
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/01-ozone-repair.md
b/docs/05-administrator-guide/03-operations/11-tools/01-ozone-repair.md
new file mode 100644
index 000000000..b687ef210
--- /dev/null
+++ b/docs/05-administrator-guide/03-operations/11-tools/01-ozone-repair.md
@@ -0,0 +1,274 @@
+# Ozone Repair
+
+Ozone Repair (`ozone repair`) is an advanced tool to repair Ozone. The nodes
being repaired must be stopped before the tool is run.
+
+:::note
+All repair commands support a `--dry-run` option which allows a user to see
what repair the command will be performing without actually making any changes
to the cluster.
+
+Use the `--force` flag to override the running service check in false-positive
cases.
+:::
+
+```bash
+Usage: ozone repair [-hV] [--verbose] [-conf=<configurationPath>]
+ [-D=<String=String>]... [COMMAND]
+Advanced tool to repair Ozone. The nodes being repaired must be stopped before
+the tool is run.
+ -conf=<configurationPath>
+
+ -D, --set=<String=String>
+
+ -h, --help Show this help message and exit.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+Commands:
+ datanode Tools to repair Datanode
+ ldb Operational tool to repair ldb.
+ om Operational tool to repair OM.
+ scm Operational tool to repair SCM.
+```
+
+For more detailed usage see the output of --help for each of the subcommands.
+
+## ozone repair Datanode
+
+Operational tool to repair Datanode.
+
+### upgrade-container-schema
+
+Upgrade all schema V2 containers to schema V3 for a Datanode in offline mode.
+Optionally takes `--volume` option to specify which volume needs the upgrade.
+
+## ozone repair ldb
+
+Operational tool to repair ldb.
+
+### compact
+
+Compact a column family in the DB to clean up tombstones while the service is
offline.
+
+```bash
+Usage: ozone repair ldb compact [-hV] [--dry-run] [--force] [--verbose]
+ --cf=<columnFamilyName> --db=<dbPath>
+CLI to compact a column-family in the DB while the service is offline.
+Note: If om.db is compacted with this tool then it will negatively impact the
+Ozone Manager's efficient snapshot diff.
+ --cf, --column-family, --column_family=<columnFamilyName>
+ Column family name
+ --db=<dbPath> Database File Path
+```
+
+## ozone repair OM
+
+Operational tool to repair OM.
+
+### Subcommands under OM
+
+- FSO-tree
+- snapshot
+- update-transaction
+- quota
+- compact
+- skip-ratis-transaction
+
+### FSO-tree
+
+Identify and repair a disconnected FSO tree by marking unreferenced entries
for deletion.
+Reports the reachable, unreachable (pending delete) and unreferenced
(orphaned) directories and files.
+OM should be stopped while this tool is run.
+
+```bash
+Usage: ozone repair om fso-tree [-hV] [--dry-run] [--force] [--verbose]
+ [-b=<bucketFilter>] --db=<omDBPath>
+ [-v=<volumeFilter>]
+Identify and repair a disconnected FSO tree by marking unreferenced entries for
+deletion. OM should be stopped while this tool is run.
+ -b, --bucket=<bucketFilter>
+ Filter by bucket name
+ --db=<omDBPath> Path to OM RocksDB
+ -v, --volume=<volumeFilter>
+ Filter by volume name. Add '/' before the volume name.
+
+```
+
+### snapshot
+
+Subcommand for all snapshot related repairs.
+
+#### chain
+
+Update global and path previous snapshot for a snapshot in case snapshot chain
is corrupted.
+
+```bash
+Usage: ozone repair om snapshot chain [-hV] [--dry-run] [--force] [--verbose]
+ --db=<dbPath>
+ --gp=<globalPreviousSnapshotId>
+ --pp=<pathPreviousSnapshotId> <value>
+ <snapshotName>
+CLI to update global and path previous snapshot for a snapshot in case snapshot
+chain is corrupted.
+ <value> URI of the bucket (format: volume/bucket).
+ <snapshotName> Snapshot name to update
+ --db=<dbPath> Database File Path
+ --gp, --global-previous=<globalPreviousSnapshotId>
+ Global previous snapshotId to set for the given snapshot
+ --pp, --path-previous=<pathPreviousSnapshotId>
+ Path previous snapshotId to set for the given snapshot
+```
+
+### update-transaction
+
+To avoid modifying Ratis logs and only update the latest applied transaction,
use `update-transaction` command.
+This updates the highest transaction index in the OM transaction info table.
+
+```bash
+Usage: ozone repair om update-transaction [-hV] [--dry-run] [--force]
+ [--verbose] --db=<dbPath> --index=<highestTransactionIndex>
+ --term=<highestTransactionTerm>
+CLI to update the highest index in transaction info table.
+ --db=<dbPath> Database File Path
+ --index=<highestTransactionIndex>
+ Highest index to set. The input should be non-zero long
+ integer.
+ --term=<highestTransactionTerm>
+ Highest term to set. The input should be non-zero long
+ integer.
+
+```
+
+### quota
+
+Operational tool to repair quota in OM DB.
+
+#### start
+
+To trigger quota repair use the `start` command.
+
+```bash
+Usage: ozone repair om quota start [-hV] [--dry-run] [--force] [--verbose]
+ [--buckets=<buckets>]
+ [--service-host=<omHost>]
+ [--service-id=<omServiceId>]
+CLI to trigger quota repair.
+ --buckets=<buckets> start quota repair for specific buckets. Input will
+ be list of uri separated by comma as
+ /<volume>/<bucket>[,...]
+ --service-host=<omHost>
+ Ozone Manager Host. If OM HA is enabled, use
+ --service-id instead. If you must use
+ --service-host with OM HA, this must point
+ directly to the leader OM. This option is
+ required when --service-id is not provided or
+ when HA is not enabled.
+ --service-id, --om-service-id=<omServiceId>
+ Ozone Manager Service ID
+
+```
+
+#### status
+
+Get the status of last triggered quota repair.
+
+```bash
+Usage: ozone repair om quota status [-hV] [--verbose]
+ [--service-host=<omHost>]
+ [--service-id=<omServiceId>]
+CLI to get the status of last trigger quota repair if available.
+ --service-host=<omHost>
+ Ozone Manager Host. If OM HA is enabled, use --service-id
+ instead. If you must use --service-host with OM HA, this
+ must point directly to the leader OM. This option is
+ required when --service-id is not provided or when HA is
+ not enabled.
+ --service-id, --om-service-id=<omServiceId>
+ Ozone Manager Service ID
+
+```
+
+#### compact
+
+Compact a column family in the OM DB to clean up tombstones. The compaction
happens asynchronously. Requires admin privileges.
+
+```bash
+Usage: ozone repair om compact [-hV] [--dry-run] [--force] [--verbose]
+ --cf=<columnFamilyName> [--node-id=<nodeId>]
+ [--service-id=<omServiceId>]
+CLI to compact a column family in the om.db. The compaction happens
+asynchronously. Requires admin privileges.
+ --cf, --column-family, --column_family=<columnFamilyName>
+ Column family name
+ --node-id=<nodeId> NodeID of the OM for which db needs to be compacted.
+ --service-id, --om-service-id=<omServiceId>
+ Ozone Manager Service ID
+
+```
+
+#### skip-ratis-transaction, srt
+
+Omit a raft log in a Ratis segment file by replacing the specified index with
a dummy EchoOM command.
+This is an offline tool meant to be used only when all 3 OMs crash on the same
transaction.
+If the issue is isolated to one OM, manually copy the DB from a healthy OM
instead.
+
+```bash
+Usage: ozone repair om skip-ratis-transaction [-hV] [--dry-run] [--force]
+ [--verbose] -b=<backupDir> --index=<index> (-s=<segmentFile> |
+ -d=<logDir>)
+CLI to omit a raft log in a ratis segment file. The raft log at the index
+specified is replaced with an EchoOM command (which is a dummy command). It is
+an offline command i.e., doesn't require OM to be running. The command should
+be run for the same transaction on all 3 OMs only when all the OMs are crashing
+while applying the same transaction. If only one OM is crashing and the other
+OMs have executed the log successfully, then the DB should be manually copied
+from one of the good OMs to the crashing OM instead.
+ -b, --backup=<backupDir> Directory to put the backup of the original
+ repaired segment file before the repair.
+ -d, --ratis-log-dir=<logDir>
+ Path of the ratis log directory
+ --index=<index> Index of the failing transaction that should be
+ removed
+ -s, --segment-path=<segmentFile>
+ Path of the input segment file
+```
+
+## ozone repair SCM
+
+Operational tool to repair SCM.
+
+### Subcommands under SCM
+
+- cert
+- update-transaction
+
+### cert
+
+Subcommand for all certificate related repairs on SCM.
+
+#### recover
+
+Recover Deleted SCM Certificate from RocksDB.
+
+```bash
+Usage: ozone repair scm cert recover [-hV] [--dry-run] [--force] [--verbose]
+ --db=<dbPath>
+Recover Deleted SCM Certificate from RocksDB
+ --db=<dbPath> SCM DB Path
+```
+
+### update-transaction
+
+To avoid modifying Ratis logs and only update the latest applied transaction,
use update-transaction command.
+This updates the highest transaction index in the SCM transaction info table.
+
+```bash
+Usage: ozone repair scm update-transaction [-hV] [--dry-run] [--force]
+ [--verbose] --db=<dbPath> --index=<highestTransactionIndex>
+ --term=<highestTransactionTerm>
+CLI to update the highest index in transaction info table.
+ --db=<dbPath> Database File Path
+ --index=<highestTransactionIndex>
+ Highest index to set. The input should be non-zero long
+ integer.
+ --term=<highestTransactionTerm>
+ Highest term to set. The input should be non-zero long
+ integer.
+
+```
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/02-ozone-admin.md
b/docs/05-administrator-guide/03-operations/11-tools/02-ozone-admin.md
new file mode 100644
index 000000000..30bddf1be
--- /dev/null
+++ b/docs/05-administrator-guide/03-operations/11-tools/02-ozone-admin.md
@@ -0,0 +1,60 @@
+# Ozone Admin
+
+`ozone admin` command is a collection of tools intended to be used only by
admins.
+
+A quick overview of the available functionalities:
+
+- `ozone admin safemode`
+ Check the safe mode status and force entering or leaving safe mode.
+ The `--verbose` option prints the validation status of all rules that
evaluate safe mode status.
+
+- `ozone admin container`
+ Containers are the unit of replication.
+ Subcommands help debug the current container state (list / get / create / …).
+
+- `ozone admin pipeline`
+ Helps check available pipelines (Datanodes sets).
+
+- `ozone admin datanode`
+ Provides information about Datanodes.
+
+- `ozone admin printTopology`
+ Displays rack-awareness related information.
+
+- `ozone admin replicationmanager`
+ Checks replication status and can start or stop replication in emergencies.
+
+- `ozone admin om`
+ Ozone Manager HA related tools to retrieve cluster information.
+
+For more detailed usage, see the output of `--help`.
+
+```bash
+$ ozone admin --help
+
+Usage: ozone admin [-hV] [--verbose] [-conf=<configurationPath>]
+ [-D=<String=String>]... [COMMAND]
+
+Developer tools for Ozone Admin operations
+
+Options:
+ -conf=<configurationPath>
+ -D, --set=<String=String>
+ -h, --help Show this help message and exit.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+
+Commands:
+ containerbalancer ContainerBalancer specific operations
+ replicationmanager ReplicationManager specific operations
+ safemode Safe mode specific operations
+ printTopology Print a tree of the network topology as reported by SCM
+ cert Certificate related operations
+ container Container specific operations
+ datanode Datanode specific operations
+ pipeline Pipeline specific operations
+ namespace Namespace Summary specific admin operations
+ om Ozone Manager specific admin operations
+ reconfig Dynamically reconfigure server without restarting it
+ scm Ozone Storage Container Manager specific admin operations
+```
diff --git a/docs/05-administrator-guide/03-operations/13-ldb.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/01-ldb-tool.md
similarity index 70%
rename from docs/05-administrator-guide/03-operations/13-ldb.md
rename to
docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/01-ldb-tool.md
index 86b98ab9b..767f3daaa 100644
--- a/docs/05-administrator-guide/03-operations/13-ldb.md
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/01-ldb-tool.md
@@ -6,7 +6,7 @@ sidebar_label: LDB Tool
Ozone heavily uses RocksDB for storing metadata.
This tool helps parse the contents of RocksDB belonging to Ozone Roles.
-Supported DB's : Ozone Manager (`om.db`) , StorageContainerManager (`scm.db`),
Datanode/Container (`container.db`)
+Supported DB's : Ozone Manager (`om.db`) , StorageContainerManager (`scm.db`),
Datanode/Container (`container.db`)
Below is the usage:
```bash
@@ -117,45 +117,50 @@ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--startkey=vol3 --endk
```
```json
-{ "/vol3": {
- "metadata" : { },
- "objectID" : -9999,
- "updateID" : 4000,
- "adminName" : "om",
- "ownerName" : "om",
- "volume" : "vol3",
- "creationTime" : 1707192335309,
- "modificationTime" : 1714057412205,
- "quotaInBytes" : 22854448694951936,
- "quotaInNamespace" : 100000000,
- "usedNamespace" : 1,
- "acls" : [ {
- "type" : "USER",
- "name" : "om",
- "aclScope" : "ACCESS"
- } ],
- "refCount" : 0
-}
-, "/vol4": {
- "metadata" : { },
- "objectID" : -888,
- "updateID" : 5000,
- "adminName" : "om",
- "ownerName" : "om",
- "volume" : "vol4",
- "creationTime" : 1696280979907,
- "modificationTime" : 1696280979907,
- "quotaInBytes" : 2251799813685250,
- "quotaInNamespace" : 100000000,
- "usedNamespace" : 2,
- "acls" : [ {
- "type" : "USER",
- "name" : "om",
- "aclScope" : "ACCESS"
- } ],
- "refCount" : 0
-}
+{
+ "/vol3": {
+ "metadata": {},
+ "objectID": -9999,
+ "updateID": 4000,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol3",
+ "creationTime": 1707192335309,
+ "modificationTime": 1714057412205,
+ "quotaInBytes": 22854448694951936,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 1,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
+ },
+ "/vol4": {
+ "metadata": {},
+ "objectID": -888,
+ "updateID": 5000,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol4",
+ "creationTime": 1696280979907,
+ "modificationTime": 1696280979907,
+ "quotaInBytes": 2251799813685250,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 2,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
}
+}
```
### `--fields`
@@ -167,21 +172,28 @@ ozone debug ldb --db=/path/to/om.db scan --cf=keyTable
-l=1 --fields="volumeName
```
```json
-{ "/vol1/ozone-legacy-bucket/10T-1-terasort-input/": {
- "keyLocationVersions" : [ {
- "version" : 0
- } ],
- "keyName" : "10T-1-terasort-input/",
- "bucketName" : "ozone-legacy-bucket",
- "acls" : [ {
- "name" : "om"
- }, {
- "name" : "scm"
- }, {
- "name" : "testuser"
- } ],
- "volumeName" : "vol1"
-}
+{
+ "/vol1/ozone-legacy-bucket/10T-1-terasort-input/": {
+ "keyLocationVersions": [
+ {
+ "version": 0
+ }
+ ],
+ "keyName": "10T-1-terasort-input/",
+ "bucketName": "ozone-legacy-bucket",
+ "acls": [
+ {
+ "name": "om"
+ },
+ {
+ "name": "scm"
+ },
+ {
+ "name": "testuser"
+ }
+ ],
+ "volumeName": "vol1"
+ }
}
```
@@ -221,27 +233,29 @@ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespac
}
],
"refCount": 0
+ },
+ "/vol5": {
+ "metadata": {},
+ "objectID": -956599,
+ "updateID": 45600,
+ "adminName": "om",
+ "ownerName": "om",
+ "volume": "vol5",
+ "creationTime": 1807192332309,
+ "modificationTime": 1914057410005,
+ "quotaInBytes": 7785494951936,
+ "quotaInNamespace": 100000000,
+ "usedNamespace": 2,
+ "acls": [
+ {
+ "type": "USER",
+ "name": "om",
+ "aclScope": "ACCESS"
+ }
+ ],
+ "refCount": 0
}
-, "/vol5": {
- "metadata" : { },
- "objectID" : -956599,
- "updateID" : 45600,
- "adminName" : "om",
- "ownerName" : "om",
- "volume" : "vol5",
- "creationTime" : 1807192332309,
- "modificationTime" : 1914057410005,
- "quotaInBytes" : 7785494951936,
- "quotaInNamespace" : 100000000,
- "usedNamespace" : 2,
- "acls" : [ {
- "type" : "USER",
- "name" : "om",
- "aclScope" : "ACCESS"
- } ],
- "refCount" : 0
}
- }
```
Using `lesser` operator (`greater` operator can also be used in the same way):
@@ -273,7 +287,7 @@ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespac
],
"refCount": 0
}
- }
+}
```
Using `regex` operator:
@@ -305,7 +319,7 @@ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="volume:regex
],
"refCount": 0
}
- }
+}
```
Using multiple filters:
@@ -337,7 +351,7 @@ ozone debug ldb --db=/path/to/om.db scan --cf=volumeTable
--filter="usedNamespac
],
"refCount": 0
}
- }
+}
```
## value-schema command
@@ -351,28 +365,28 @@ ozone debug ldb --db=/data/metadata/om.db value-schema
--cf=keyTable --depth=1
```json
{
- "OmKeyInfo" : {
- "bucketName" : "String",
- "metadata" : "struct",
- "fileName" : "String",
- "creationTime" : "long",
- "isFile" : "boolean",
- "acls" : "struct",
- "keyName" : "String",
- "replicationConfig" : "struct",
- "encInfo" : "struct",
- "dataSize" : "long",
- "tags" : "struct",
- "keyLocationVersions" : "struct",
- "updateID" : "long",
- "ownerName" : "String",
- "modificationTime" : "long",
- "parentObjectID" : "long",
- "volumeName" : "String",
- "fileChecksum" : "struct",
- "objectID" : "long"
+ "OmKeyInfo": {
+ "bucketName": "String",
+ "metadata": "struct",
+ "fileName": "String",
+ "creationTime": "long",
+ "isFile": "boolean",
+ "acls": "struct",
+ "keyName": "String",
+ "replicationConfig": "struct",
+ "encInfo": "struct",
+ "dataSize": "long",
+ "tags": "struct",
+ "keyLocationVersions": "struct",
+ "updateID": "long",
+ "ownerName": "String",
+ "modificationTime": "long",
+ "parentObjectID": "long",
+ "volumeName": "String",
+ "fileChecksum": "struct",
+ "objectID": "long"
+ }
}
- }
```
```bash
@@ -381,66 +395,66 @@ ozone debug ldb --db=/data/metadata/om.db value-schema
--cf=keyTable
```json
{
- "OmKeyInfo" : {
- "bucketName" : "String",
- "metadata" : { },
- "fileName" : "String",
- "creationTime" : "long",
- "isFile" : "boolean",
- "acls" : {
- "toStringMethod" : { },
- "hashCodeMethod" : { },
- "name" : "String",
- "type" : {
- "name" : "String",
- "value" : "String",
- "ordinal" : "int"
+ "OmKeyInfo": {
+ "bucketName": "String",
+ "metadata": {},
+ "fileName": "String",
+ "creationTime": "long",
+ "isFile": "boolean",
+ "acls": {
+ "toStringMethod": {},
+ "hashCodeMethod": {},
+ "name": "String",
+ "type": {
+ "name": "String",
+ "value": "String",
+ "ordinal": "int"
},
- "aclScope" : {
- "name" : "String",
- "ordinal" : "int"
+ "aclScope": {
+ "name": "String",
+ "ordinal": "int"
},
- "aclBits" : "int"
+ "aclBits": "int"
},
- "keyName" : "String",
- "replicationConfig" : { },
- "encInfo" : {
- "ezKeyVersionName" : "String",
- "keyName" : "String",
- "edek" : { },
- "cipherSuite" : {
- "unknownValue" : {
- "value" : "int"
+ "keyName": "String",
+ "replicationConfig": {},
+ "encInfo": {
+ "ezKeyVersionName": "String",
+ "keyName": "String",
+ "edek": {},
+ "cipherSuite": {
+ "unknownValue": {
+ "value": "int"
},
- "name" : "String",
- "algoBlockSize" : "int",
- "ordinal" : "int"
+ "name": "String",
+ "algoBlockSize": "int",
+ "ordinal": "int"
},
- "version" : {
- "unknownValue" : {
- "value" : "int"
+ "version": {
+ "unknownValue": {
+ "value": "int"
},
- "name" : "String",
- "description" : "String",
- "version" : "int",
- "ordinal" : "int"
+ "name": "String",
+ "description": "String",
+ "version": "int",
+ "ordinal": "int"
},
- "iv" : { }
+ "iv": {}
},
- "dataSize" : "long",
- "tags" : { },
- "keyLocationVersions" : {
- "isMultipartKey" : "boolean",
- "locationVersionMap" : { },
- "version" : "long"
+ "dataSize": "long",
+ "tags": {},
+ "keyLocationVersions": {
+ "isMultipartKey": "boolean",
+ "locationVersionMap": {},
+ "version": "long"
},
- "updateID" : "long",
- "ownerName" : "String",
- "modificationTime" : "long",
- "parentObjectID" : "long",
- "volumeName" : "String",
- "fileChecksum" : { },
- "objectID" : "long"
+ "updateID": "long",
+ "ownerName": "String",
+ "modificationTime": "long",
+ "parentObjectID": "long",
+ "volumeName": "String",
+ "fileChecksum": {},
+ "objectID": "long"
}
}
```
@@ -452,3 +466,5 @@ ozone debug ldb --db=/data/metadata/om.db value-schema
--cf=keyTable
```bash
ozone debug ldb --db=/data/metadata/om.db checkpoint
--output=/tmp/om-checkpoint
```
+
+[Next >>](/docs/administrator-guide/operations/tools/ozone-debug/debug-om)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/02-debug-om.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/02-debug-om.md
new file mode 100644
index 000000000..d60791a93
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/02-debug-om.md
@@ -0,0 +1,42 @@
+# Debug OM
+
+Debug commands related to OM.
+It has the following subcommands:
+
+## generate-compaction-dag
+
+Creates a DAG image of the current compaction log of an OM.db instance. It is
downloaded to the specified location.
+
+```bash
+Usage: ozone debug om generate-compaction-dag [-hV] [--verbose] --db=<dbPath>
+ -o=<imageLocation>
+Create an image of the current compaction log DAG. This command is an offline
+command. i.e., it can run on any instance of om.db and does not require OM to
+be up.
+ --db=<dbPath> Path to OM RocksDB
+ -h, --help Show this help message and exit.
+ -o, --output-file=<imageLocation>
+ Path to location at which image will be downloaded.
+ Should include the image file name with ".png"
+ extension.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+```
+
+## prefix
+
+Parses the contents of a prefix.
+
+```bash
+Usage: ozone debug om prefix [--verbose] --bucket=<bucket> --db=<dbPath>
+ --path=<filePath> --volume=<volume>
+Parse prefix contents
+ --bucket=<bucket> bucket name
+ --db=<dbPath> Path to OM RocksDB
+ --path=<filePath> prefixFile Path
+ --verbose More verbose output. Show the stack trace of the
+ errors.
+ --volume=<volume> volume name
+```
+
+[Next
>>](/docs/administrator-guide/operations/tools/ozone-debug/debug-datanode)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/03-debug-datanode.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/03-debug-datanode.md
new file mode 100644
index 000000000..75f526a42
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/03-debug-datanode.md
@@ -0,0 +1,19 @@
+# Debug Datanode
+
+Debug commands related to Datanode. Currently, only container replica related
commands are available.
+Following is the usage and the subcommands available under the `ozone debug
datanode container` command:
+
+```bash
+Usage: ozone debug datanode container [-hV] [--verbose] [COMMAND]
+Container replica specific operations to be executed on datanodes only
+ -h, --help Show this help message and exit.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+Commands:
+ list Show container info of all container replicas on datanode
+ info Show container info of a container replica on datanode
+ export Export one container to a tarball
+ inspect Check the metadata of all container replicas on this datanode.
+```
+
+[Next
>>](/docs/administrator-guide/operations/tools/ozone-debug/debug-replicas)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/04-debug-replicas.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/04-debug-replicas.md
new file mode 100644
index 000000000..7bce1c28a
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/04-debug-replicas.md
@@ -0,0 +1,101 @@
+# Debug Replicas
+
+Debug commands for retrieving information and performing various checks on the
key replicas in Datanodes.
+
+```bash
+Usage: ozone debug replicas [--verbose] [COMMAND]
+Debug commands for replica-related issues, retrieving replica information from
+the OM and performing checks over the network against a running cluster.
+ --verbose More verbose output. Show the stack trace of the errors.
+Commands:
+ chunk-info Returns chunk location information about an existing key
+ verify Run checks to verify data across replicas. By default prints only
+ the keys with failed checks.
+```
+
+## chunk-info
+
+For a given URI of a key, the command returns all the chunks’ location
information.
+
+```bash
+Usage: ozone debug replicas chunk-info [-hV] [--verbose] <value>
+Returns chunk location information about an existing key
+ <value> URI of the key (format: volume/bucket/key).
+ Ozone URI could either be a full URI or short URI.
+ Full URI should start with o3://, in case of non-HA
+ clusters it should be followed by the host name and
+ optionally the port number. In case of HA clusters
+ the service id should be used. Service id provides a
+ logical name for multiple hosts and it is defined
+ in the property ozone.om.service.ids.
+ Example of a full URI with host name and port number
+ for a key:
+ o3://omhostname:9862/vol1/bucket1/key1
+ With a service id for a volume:
+ o3://omserviceid/vol1/
+ Short URI should start from the volume.
+ Example of a short URI for a bucket:
+ vol1/bucket1
+ Any unspecified information will be identified from
+ the config files.
+
+ -h, --help Show this help message and exit.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+```
+
+## verify
+
+Verify data across replicas. There are multiple checks available, which can be
selected using the command line options:
+
+```bash
+Usage: ozone debug replicas verify [-hV] [--all-results] [--verbose]
+
[--container-cache-size=<containerCacheSize>]
+ [-id=<scmServiceId>] [--scm=<scm>]
+ ([--checksums] [--block-existence]
+ [--container-state]) <uri>
+Run checks to verify data across replicas. By default prints only the keys with
+failed checks.
+ <uri> Ozone URI could either be a full URI or short URI.
+ Full URI should start with o3://, in case of non-HA
+ clusters it should be followed by the host name and
+ optionally the port number. In case of HA clusters
+ the service id should be used. Service id provides a
+ logical name for multiple hosts and it is defined
+ in the property ozone.om.service.ids.
+ Example of a full URI with host name and port number
+ for a key:
+ o3://omhostname:9862/vol1/bucket1/key1
+ With a service id for a volume:
+ o3://omserviceid/vol1/
+ Short URI should start from the volume.
+ Example of a short URI for a bucket:
+ vol1/bucket1
+ Any unspecified information will be identified from
+ the config files.
+
+ --all-results Print results for all passing and failing keys
+ --block-existence Check for block existence on datanodes.
+ --checksums Do client side data checksum validation of all
+ replicas.
+ --container-cache-size=<containerCacheSize>
+ Size (in number of containers) of the in-memory cache
+ for container state verification
+ '--container-state'. Default is 1 million
+ containers (which takes around 43MB). Value must be
+ greater than zero, otherwise the default of 1
+ million is considered. Note: This option is ignored
+ if '--container-state' option is not used.
+ --container-state Check the container and replica states. Containers in
+ [DELETING, DELETED] states, or its replicas in
+ [DELETED, UNHEALTHY, INVALID] states fail the
check.
+ -h, --help Show this help message and exit.
+ -id, --service-id=<scmServiceId>
+ ServiceId of SCM HA Cluster
+ --scm=<scm> The destination scm (host:port)
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the
+ errors.
+```
+
+[Next
>>](/docs/administrator-guide/operations/tools/ozone-debug/ratis-log-parser)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/05-ratis-log-parser.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/05-ratis-log-parser.md
new file mode 100644
index 000000000..66074feb0
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/05-ratis-log-parser.md
@@ -0,0 +1,18 @@
+# Ratis Log Parser
+
+The Ratis log parser tool takes a segment file as input and gives a
human-readable output.
+It can be used to parse Ratis logs from different components by specifying the
corresponding role.
+
+```bash
+Usage: ozone debug ratis parse [-hV] [--verbose] [--role=<role>]
-s=<segmentFile>
+Shell for printing Ratis Log in understandable text
+ -h, --help Show this help message and exit.
+ --role=<role> Component role for parsing. Values: om, scm, datanode
+ Default: generic
+ -s, --segmentPath, --segment-path=<segmentFile>
+ Path of the segment file
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the errors.
+```
+
+[Next
>>](/docs/administrator-guide/operations/tools/ozone-debug/audit-parser-exact)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/06-audit-parser-exact.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/06-audit-parser-exact.md
new file mode 100644
index 000000000..aeb390c34
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/06-audit-parser-exact.md
@@ -0,0 +1,59 @@
+# Audit Parser
+
+Audit Parser tool can be used for querying the Ozone audit logs.
+This tool creates a sqlite database at the specified path. If the database
+already exists, it will avoid creating a database.
+
+The database contains only one table called `audit` defined as:
+
+```sql
+CREATE TABLE IF NOT EXISTS audit (
+datetime text,
+level varchar(7),
+logger varchar(7),
+user text,
+ip text,
+op text,
+params text,
+result varchar(7),
+exception text,
+UNIQUE(datetime,level,logger,user,ip,op,params,result))
+```
+
+Usage:
+
+```bash
+ozone debug auditparser <path to db file> [COMMAND] [PARAM]
+```
+
+To load an audit log to database:
+
+```bash
+ozone debug auditparser <path to db file> load <path to audit log>
+```
+
+Load command creates the audit table described above.
+
+To run a custom read-only query:
+
+```bash
+ozone debug auditparser <path to db file> query <select query enclosed within
double quotes>
+```
+
+Audit Parser comes with a set of templates(most commonly used queries).
+
+To run a template query:
+
+```bash
+ozone debug auditparser <path to db file> template <templateName>
+```
+
+Following templates are available:
+
+| Template Name | Description | SQL
|
+| ----------------------- | -------------------------------------- |
-------------------------------------------------------------------------------------------------------------------------------------
|
+| top5users | Top 5 users | select
user,count(\*) as total from audit group by user order by total DESC limit 5
|
+| top5cmds | Top 5 commands | select
op,count(\*) as total from audit group by op order by total DESC limit 5
|
+| top5activetimebyseconds | Top 5 active times, grouped by seconds | select
substr(datetime,1,charindex(',',datetime)-1) as dt,count(\*) as thecount from
audit group by dt order by thecount DESC limit 5 |
+
+[Next
>>](/docs/administrator-guide/operations/tools/ozone-debug/container-replica-debugger-tool)
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/07-container-replica-debugger-tool.md
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/07-container-replica-debugger-tool.md
new file mode 100644
index 000000000..32979a53a
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/07-container-replica-debugger-tool.md
@@ -0,0 +1,250 @@
+# Container Replica Debugger Tool
+
+The tool processes container log files from Ozone Datanodes to track state
transitions. It provides CLI commands for querying containers based on
different attributes.
+
+## Background
+
+Containers are the most important part of Ozone. Most of the Ozone operations
happen on them. Containers in Ozone go through different states in their
lifecycle.
+In the past we have seen different issues on container state. To debug
problems we always use manual steps and identify problems w.r.t containers and
this takes a lot of time. To optimize debugability we can show historical
timeline and other information w.r.t containers.
+
+## Solution Approach
+
+An offline tool that would analyse the dn-container log files and help us find
issues related to the containers across the Datanodes in the cluster.
+
+### Component 1: Parser
+
+This component is responsible for processing log files, extracting relevant
log entries, and storing them in batches to be inserted into the database.
+
+**The command is as follows:**
+
+```bash
+ozone debug log container --db=<path to db> parse --path=<path to logs folder>
--thread-count=<n>
+```
+
+#### Log File Parsing and Validation
+
+- **Directory Traversal**: It recursively scans a specified directory for
container log files,only files with names matching the pattern
`dn-container-<roll>.log.<datanodeId>` are considered.Log files are parsed
concurrently using multiple threads for efficient processing.
+- **Line-by-Line Processing**: Each log line is split using a pipe delimiter
and parsed into key-value components.
+- **Field Extraction**: Key fields include:
+ - **Timestamp**
+ - **logLevel**: INFO, WARN, ERROR.
+ - **ID, BCSID, State, and Index**: Extracted from key-value pairs.
+- **Error Message Capture**: Any remaining unstructured part of the log line
is stored as `errorMessage`, especially relevant for WARN or ERROR level logs.
+- **Replication Index Filtering**: Only log entries with Index = 0 are
processed. This limits current processing to Ratis-replicated containers.
Future improvements may support EC replication.
+
+### Component 2: Database
+
+The tool uses a temporary SQLite database to store and manage information
extracted from container logs. This helps organize the data so that both the
complete history and the latest status of each container replica on a Datanode
can be analyzed easily.
+
+#### There are 2 major tables created/maintained by the tool
+
+1. **DatanodeContainerLogTable — Detailed Log History**
+ This table stores a complete history of state changes for each container
replica on every Datanode.
+ - Container ID
+ - Datanode ID
+ - State (such as OPEN, CLOSED, etc.)
+ - BCSID (Block Commit Sequence ID)
+ - Timestamp
+ - Log Level
+ - Error Message (if any)
+ - Index Value
+
+ The data in this table shows a complete timeline of state transitions and
BCSID changes, helping to trace how each container replica evolved over time.
+
+2. **ContainerLogTable — Latest Status Summary**
+ This table contains only the most recent state and BCSID for each unique
container and Datanode pair.
+ - Container ID
+ - Datanode ID
+ - Latest State
+ - Latest BCSID
+
+ This table provides a simplified view of the current state and BCSID of all
container replicas, which helps with quick status checks and summaries.
+
+### **Component 3: CLI Commands**
+
+#### **To List Containers Having Duplicate Open States**
+
+This Ozone debug CLI command helps to identify containers that were opened
more than the required number (for Ratis, it is 3) by tracking the first three
“OPEN” states and flagging any subsequent “OPEN” state as problematic if it
occurs on the same Datanode or on a different Datanode after the initial events.
+
+This command displays the **Container ID** along with the count of replicas in
the ‘OPEN’ state for each listed container. It also provides the total number
of containers that have duplicate ‘OPEN’ state entries.
+
+**The command is as follows:**
+
+```bash
+ozone debug log container --db=<path to db> duplicate-open
+```
+
+**Sample output:**
+
+```bash
+Container ID: 2187256 - OPEN state count: 4
+.
+.
+.
+Container ID: 12377064 - OPEN state count: 5
+Container ID: 12377223 - OPEN state count: 5
+Container ID: 12377631 - OPEN state count: 4
+Container ID: 12377904 - OPEN state count: 5
+Container ID: 12378161 - OPEN state count: 4
+Container ID: 12378352 - OPEN state count: 5
+Container ID: 12378789 - OPEN state count: 5
+Container ID: 12379337 - OPEN state count: 5
+Container ID: 12379489 - OPEN state count: 5
+Container ID: 12380526 - OPEN state count: 5
+Container ID: 12380898 - OPEN state count: 5
+Container ID: 12642718 - OPEN state count: 4
+Container ID: 12644806 - OPEN state count: 4
+Total containers that might have duplicate OPEN state : 1579
+```
+
+#### **To Display Details of a Single Container Along with Analysis**
+
+This Ozone debug CLI command provides a complete state transition history for
each replica of the container whose ID is provided via the command.
+The command also provides analysis over the container such as if the container
has issues like:
+
+- Duplicate OPEN states
+- Mismatched replication
+- Under-replication or over-replication
+- Unhealthy replicas
+- Open-unhealthy
+- Quasi-closed stuck containers
+
+The command provides key details such as:
+
+- Datanode id
+- Container id
+- BCSID
+- TimeStamp
+- Index Value
+- Message (if any associated with that particular replica)
+
+**The command is as follows:**
+
+```bash
+ozone debug log container --db=<path to database> info <containerID>
+```
+
+**Sample output:**
+
+```bash
+Timestamp | Container ID | Datanode ID | Container State |
BCSID | Message | Index Value
+----------------------------------------------------------------------------------------------------------------------
+2024-06-04 15:07:55,390 | 700 | 100 | QUASI_CLOSED |
353807 | No error | 0
+2024-06-04 14:50:18,177 | 700 | 150 | QUASI_CLOSED |
353807 | No error | 0
+2024-04-04 10:32:29,026 | 700 | 250 | OPEN | 0
| No error | 0
+2024-06-04 14:44:28,126 | 700 | 250 | CLOSING |
353807 | No error | 0
+2024-06-04 14:47:59,893 | 700 | 250 | QUASI_CLOSED |
353807 | Ratis group removed | 0
+2024-06-04 14:50:17,038 | 700 | 250 | QUASI_CLOSED |
353807 | No error | 0
+2024-06-04 14:50:18,184 | 700 | 250 | QUASI_CLOSED |
353807 | No error | 0
+2024-04-04 10:32:29,026 | 700 | 400 | OPEN | 0
| No error | 0
+Container 700 might be QUASI_CLOSED_STUCK.
+```
+
+#### **To List Containers Based on Health State**
+
+This Ozone debug CLI command lists all the containers which are either
UNDER-REPLICATED, OVER-REPLICATED, UNHEALTHY, or QUASI_CLOSED stuck.
+
+This command displays the **Container ID** along with the count of replicas in
the specified health state for each listed container.
+
+**The command options used are:**
+
+- List containers by health type: this by default provides only 100 rows in
the result
+
+```bash
+ozone debug log container --db=<path to db> list --health=<type>
+```
+
+- List containers by health type with a specified row limit:
+
+```bash
+ozone debug log container --db=<path to db> list --health=<type>
--length=<limit>
+```
+
+- List all containers by health type, overriding the row limit:
+
+```bash
+ozone debug log container --db=<path to db> list --health=<type> --all
+```
+
+**Sample output:**
+
+```bash
+ozone debug log container --db=path/to/db list --health=UNHEALTHY --all
+```
+
+```bash
+Container ID = 6002 - Count = 1
+Container ID = 6201 - Count = 1
+.
+.
+.
+Container ID = 136662 - Count = 3
+Container ID = 136837 - Count = 3
+Container ID = 199954 - Count = 3
+Container ID = 237747 - Count = 3
+Container ID = 2579099 - Count = 1
+Container ID = 2626888 - Count = 1
+Container ID = 2627711 - Count = 1
+Container ID = 2627751 - Count = 2
+Number of containers listed: 25085
+```
+
+#### **To List Containers Based on Final State**
+
+This Ozone debug CLI command helps to list replicas of all the containers
which have the state provided via the CLI command as their latest state.
+
+The command provides key details such as:
+
+- Datanode id
+- Container id
+- BCSID
+- TimeStamp - The most recent timestamp associated with the container replica
state
+- Index Value
+- Message (if any associated with that particular replica)
+
+**The command options used are:**
+
+- List containers by state: this by default provides only 100 rows in the
result
+
+```bash
+ozone debug log container --db=<path to db> list --lifecycle=<state>
+```
+
+- List containers by state with a specified row limit:
+
+```bash
+ozone debug log container --db=<path to db> list --lifecycle=<state>
--length=<limit>
+```
+
+- List all containers by state, overriding the row limit:
+
+```bash
+ozone debug log container --db=<path to db> list --lifecycle=<state> --all
+```
+
+**Sample output:**
+
+```bash
+ozone debug log container --db=path/to/db list --lifecycle=CLOSED --all
+```
+
+```bash
+Timestamp | Datanode ID | Container ID | BCSID | Message
| Index Value
+---------------------------------------------------------------------------------------------------
+2024-07-23 12:02:12,981 | 360 | 1 | 75654 | No error
| 0
+2024-07-23 11:56:21,106 | 365 | 1 | 75654 | Volume
failure | 0
+2024-07-23 11:56:21,106 | 365 | 1 | 75654 | Volume
failure | 0
+2024-08-29 14:11:32,879 | 415 | 1 | 30 | No error
| 0
+2024-08-29 14:11:17,533 | 430 | 1 | 30 | No error
| 0
+2024-06-20 11:50:09,496 | 460 | 1 | 75654 | No error
| 0
+2024-07-23 12:02:11,633 | 500 | 1 | 75654 | No error
| 0
+2024-06-20 12:03:24,230 | 505 | 2 | 83751 | No error
| 0
+2024-07-10 04:00:33,131 | 540 | 2 | 83751 | No error
| 0
+2024-07-10 04:00:46,825 | 595 | 2 | 83751 | No error
| 0
+```
+
+## NOTE
+
+- This tool assumes that all dn-container log files are already extracted from
the Datanodes and placed into a directory.
+- For the parsing command, if the DB path is not provided, a new database will
be created in the current working directory with the default filename
`container_datanode.db`.
+- For all other commands, if the DB path is not provided, it will look for a
default database (`container_datanode.db`) file in the current directory. If it
doesn’t exist, it will throw an error asking to provide a valid path.
diff --git
a/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/README.mdx
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/README.mdx
new file mode 100644
index 000000000..54761fc0a
--- /dev/null
+++
b/docs/05-administrator-guide/03-operations/11-tools/03-ozone-debug/README.mdx
@@ -0,0 +1,26 @@
+---
+sidebar_label: Ozone Debug
+---
+
+import DocCardList from "@theme/DocCardList";
+
+# Debug Tools
+
+Ozone Debug command (`ozone debug`) is a collection of developer tools
intended to help in debugging and get more information of various components of
ozone.
+
+It includes the following tools:
+
+- **ldb** - Tools to debug RocksDB related issues.
+- **om** - Debug commands related to OM.
+- **datanode** - Debug commands related to Datanode.
+- **replicas** - Debug commands for key replica related issues.
+- **ratis** - Debug commands related to Ratis.
+- **auditparser** - A tool to parse and query Ozone audit logs.
+- **log** - A tool to parse and provide insights on logs, currently supports
only the datanode’s container logs.
+- **checknative** - Checks if native libraries are loaded
+- **version** - Show internal version of Ozone components
+
+For more information see the following subpages:
+
+<!-- prettier-ignore -->
+<DocCardList/>
diff --git a/docs/05-administrator-guide/03-operations/11-tools/README.mdx
b/docs/05-administrator-guide/03-operations/11-tools/README.mdx
new file mode 100644
index 000000000..a4562f274
--- /dev/null
+++ b/docs/05-administrator-guide/03-operations/11-tools/README.mdx
@@ -0,0 +1,55 @@
+---
+sidebar_label: Tools
+---
+
+import DocCardList from "@theme/DocCardList";
+
+# Tools
+
+Ozone provides a set of command-line tools that can be used to manage and
operate an Ozone cluster.
+
+All commands are invoked via the `ozone` script.
+
+---
+
+## Daemon commands
+
+Commands used to start or stop Ozone services.
+
+- **`scm`** – Storage Container Manager service
+- **`om`** – Ozone Manager service
+- **`datanode`** – HDDS DataNode service
+- **`s3g`** – S3-compatible REST gateway
+- **`recon`** – Recon Web UI service
+- **`httpfs`** – HttpFS gateway
+
+---
+
+## Client commands
+
+- **`sh`** – Manage volumes, buckets, and keys
+- **`fs`** – Ozone filesystem commands (similar to `hdfs dfs`)
+- **`version`** – Print Ozone and HDDS version information
+
+---
+
+## Admin commands
+
+- **`admin`** – Admin and developer commands for Ozone components
+- **`insight`** – Display filtered logs, metrics, or configs for debugging
+- **`classpath`** – Print Hadoop classpath
+- **`dtutil`** – Delegation token operations
+- **`envvars`** – Display computed Hadoop environment variables
+- **`getconf`** – Read Ozone configuration values
+- **`genconf`** – Generate minimal `ozone-site.xml`
+
+---
+
+## Test tools
+
+- **`freon`** – Ozone load generator
+
+---
+
+<!-- prettier-ignore -->
+<DocCardList/>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]