From 268f81a444a0bc2085f8046109214a3935eeafb6 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Wed, 6 Aug 2025 09:09:42 +0530 Subject: [PATCH 01/23] HDDS-13177. Adding design doc for storage capacity distribution. --- .../content/design/storage-distribution.md | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 hadoop-hdds/docs/content/design/storage-distribution.md diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md new file mode 100644 index 000000000000..24135f5bf6dc --- /dev/null +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -0,0 +1,148 @@ +--- +title: Storage Capacity Distribution Dashboard +summary: Proposal for introducing a comprehensive storage distribution dashboard in Recon for enhanced cluster monitoring and debugging capabilities. +date: 2025-08-05 +jira: HDDS-13177 +status: Under Review +author: Priyesh Karatha +--- + + + +# Abstract + +Ozone currently lacks a unified interface to monitor and analyze storage distribution across its cluster components. This makes it difficult to: + +- Understand data distribution across the cluster +- Debug storage reclamation issues +- Monitor pending deletion progress +- Analyze utilization patterns +- Identify potential bottlenecks and imbalances + +This proposal introduces a comprehensive **Storage Capacity Distribution Dashboard** in Recon to address these challenges. + +--- + +# Key Features + +## 1. Storage Distribution Analysis + +Detailed breakdown of storage usage across components: + +- **Global Used Space** +- **Global Namespace Space** +- **Open Keys and Open Files**: Data held in open keys and files +- **Committed Keys**: Space used by committed key-value pairs +- **Component-wise Distribution**: Metrics segregated by OM, SCM, and DataNodes + +## 2. Deletion Progress Monitoring + +Track pending deletions at various stages: + +- **OM Pending Deletions**: Keys marked for deletion at OM +- **SCM Pending Deletions**: Container-level deletions managed by SCM +- **DataNode Pending Deletions**: Block-level deletion metrics on each DataNode + +## 3. Cluster Overview Metrics + +Summarized cluster statistics: + +- Total capacity and used space +- Free space distribution across components + +--- + +# Implementation Approaches + +## Approach 1: Recon-based Implementation + +Leverage the existing Recon service to build the dashboard with centralized and efficient data collection. + +### Benefits + +- **Unified Data Source**: All metrics aggregated centrally in Recon +- **Performance Optimization**: Incremental sync reduces load +- **Reduced Overhead**: Avoids redundant calculations across services +- **Code Reusability**: Built on top of existing Recon infrastructure and endpoints + +### Component-wise Enhancements + +#### **DataNodes (DN)** + +- **Current State**: DNs expose storage metrics in their reports +- **Enhancement**: + - Add `pending deletion byte counters` in container metadata + - Include these in DN’s storage reports +- **Responsibilities**: + - Report actual and pending deletion usage per container + +#### **Storage Container Manager (SCM)** + +- **Current Gap**: No block size tracking in block deletion process +- **Enhancement**: + - Track block sizes when OM issues deletion request + - Send deletion command to DN along with block size and replication factor + + ``` + OM → SCM: block deletion request + block size + SCM → DN: delete command + block size + replication factor + ``` + +- **Responsibilities**: + - Serve as the metadata bridge between logical keys and physical blocks + +#### **Ozone Manager (OM)** + +- **Enhancement**: + - Compute block sizes during deletion + - Extend Recon sync process to extract logical metrics +- **Responsibilities**: + - Expose logical storage metrics: committed keys, open keys, namespace usage + +#### **Recon** + +- **Enhancement**: + - Add a new dashboard aggregating: + - Logical metrics from OM + - Deletion progress from SCM + - Container-level reports from DNs +- **Data Sources**: + - OM DB (via Insight Sync) + - SCM Client API + - DN storage reports + +--- + +## Approach 2: CLI-based (Not Proceeding) + +A CLI-based approach was evaluated to compute detailed usage and pending deletion breakdown by analyzing offline OM and SCM database checkpoints and querying DataNodes. +While it offers precise, up-to-date results and independence from Recon, it introduces significant operational overhead. + +This approach requires generating and processing large metadata snapshots, which can take hours in large-scale clusters. +Given its complexity, dependency on manual execution, and high resource consumption, we have chosen not to proceed with the CLI-based solution and instead focus on enhancing Recon for better usability and integration. + +--- + +# Summary + +The proposed dashboard enhances visibility into cluster storage dynamics, enabling better debugging and decision-making. Recon is the ideal location for this feature due to its existing role as the observability hub in Ozone. + +This enhancement lays the foundation for future innovations like: + +- Storage heatmaps +- Auto-balancing recommendations +- UI-based debugging for deletion backlogs + +--- From 0275b54820714a33d1477adb12a1e05f88b3f5d0 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 9 Sep 2025 10:51:02 +0530 Subject: [PATCH 02/23] updating design doc --- .../docs/content/design/storage-distribution.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 24135f5bf6dc..0fbf10321906 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -41,11 +41,11 @@ This proposal introduces a comprehensive **Storage Capacity Distribution Dashboa Detailed breakdown of storage usage across components: -- **Global Used Space** -- **Global Namespace Space** -- **Open Keys and Open Files**: Data held in open keys and files -- **Committed Keys**: Space used by committed key-value pairs -- **Component-wise Distribution**: Metrics segregated by OM, SCM, and DataNodes +- **Global Used Space**: Represents the actual physical storage consumed on the DataNodes. +- **Global Namespace Space**: Logical size of the namespace, calculated as the sum of pendingDirectorySize + pendingKeySize + totalOpenKeySize + totalCommittedSize, multiplied by the replication factor. +- **Open Keys and Open Files**: Space occupied by data in open keys and files that are not yet finalized. +- **Committed Keys**: Space utilized by fully committed key–value pairs. +- **Component-wise Distribution**: Breakdown of metrics across OM, SCM, and DataNodes. ## 2. Deletion Progress Monitoring @@ -84,7 +84,7 @@ Leverage the existing Recon service to build the dashboard with centralized and - **Current State**: DNs expose storage metrics in their reports - **Enhancement**: - Add `pending deletion byte counters` in container metadata - - Include these in DN’s storage reports + - Calculate total pending per DN from these container metadata and publish metrics. - **Responsibilities**: - Report actual and pending deletion usage per container @@ -117,11 +117,11 @@ Leverage the existing Recon service to build the dashboard with centralized and - Add a new dashboard aggregating: - Logical metrics from OM - Deletion progress from SCM - - Container-level reports from DNs + - Container-level metadata from DNs - **Data Sources**: - OM DB (via Insight Sync) - SCM Client API - - DN storage reports + - DN BlockDeletingService metrics. --- From 937bac611c55fdb2bba74c1cac9f3d56854682e4 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Sun, 14 Sep 2025 13:07:07 +0530 Subject: [PATCH 03/23] why we are not using prometheus/grafana --- .../content/design/storage-distribution.md | 55 ++++++++++++++----- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 0fbf10321906..0b0cd8c68d8a 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -69,11 +69,16 @@ Summarized cluster statistics: ## Approach 1: Recon-based Implementation Leverage the existing Recon service to build the dashboard with centralized and efficient data collection. +Recon currently maintains synchronization with the OM database and constructs the NSSummary tree, providing established calculation logic for metrics such as openKeysBytes and committedBytes. +Additionally, Recon already possesses a comprehensive physical and logical capacity to break down information through its OM DB insights component. +These existing capabilities can be effectively leveraged to minimize development effort and ensure consistency. +While certain enhancements to OM are required regardless of the chosen implementation approach—whether CLI-based or Prometheus-driven—the foundational data processing infrastructure is already in place. +The modifications outlined for OM, SCM, and DataNode components remain mandatory across all proposed approaches to ensure complete and accurate storage distribution reporting. ### Benefits -- **Unified Data Source**: All metrics aggregated centrally in Recon -- **Performance Optimization**: Incremental sync reduces load +- **Unified Data Source**: All metrics aggregated centrally in Recon. +- **Performance Optimization**: Incremental sync reduces a load - **Reduced Overhead**: Avoids redundant calculations across services - **Code Reusability**: Built on top of existing Recon infrastructure and endpoints @@ -90,10 +95,10 @@ Leverage the existing Recon service to build the dashboard with centralized and #### **Storage Container Manager (SCM)** -- **Current Gap**: No block size tracking in block deletion process +- **Current Gap**: No block size tracking in a block deletion process - **Enhancement**: - - Track block sizes when OM issues deletion request - - Send deletion command to DN along with block size and replication factor + - Track block sizes when OM issues a deletion request + - Send a deletion command to DN along with block size and replication factor ``` OM → SCM: block deletion request + block size @@ -107,7 +112,6 @@ Leverage the existing Recon service to build the dashboard with centralized and - **Enhancement**: - Compute block sizes during deletion - - Extend Recon sync process to extract logical metrics - **Responsibilities**: - Expose logical storage metrics: committed keys, open keys, namespace usage @@ -124,8 +128,36 @@ Leverage the existing Recon service to build the dashboard with centralized and - DN BlockDeletingService metrics. --- +## Approach 2: Prometheus + Grafana Implementation (Not Recommended) -## Approach 2: CLI-based (Not Proceeding) +### Overview + +This approach would involve publishing storage distribution metrics directly from individual components (OM, SCM, DataNodes) to Prometheus, with visualization handled entirely through Grafana dashboards. + +### Why This Approach Is Not Recommended + +#### **1. Customer Adoption and User Experience** +- **Current Reality**: Customers are already actively using Recon for storage analysis and monitoring +- **Existing Feedback**: Users have specifically identified gaps in Recon's current calculations and requested improvements within the existing interface +- **User Workflow Disruption**: Introducing a completely separate monitoring stack would fragment the user experience +- **Training and Adoption Overhead**: Teams would need to learn new tools and workflows, creating adoption barriers + +#### **2. Incomplete Current State** +The primary driver for this enhancement is that **customers have identified that Recon's existing calculations are incomplete or incorrect**. Key issues include: +- Inconsistent storage usage calculations across different views +- Missing pending deletion visibility at granular levels +- Lack of real-time correlation between logical and physical storage metrics +- Incomplete breakdown of storage distribution across cluster components + +Moving to Prometheus/Grafana would not address these calculation issues. It would simply relocate them to a different platform while requiring significant additional implementation effort. + +#### **3. Recon's Existing Infrastructure Advantages** +- **Data Access**: Recon already has optimized access to OM DB, SCM metadata, and DN reports +- **Calculation Engine**: Existing framework for cross-component metric aggregation and correlation +- **Web Interface**: Established a UI framework for complex data visualization and drill-down capabilities +- **User Base**: Active user community familiar with Recon's interface and capabilities + +## Approach 3: CLI-based (Not Proceeding) A CLI-based approach was evaluated to compute detailed usage and pending deletion breakdown by analyzing offline OM and SCM database checkpoints and querying DataNodes. While it offers precise, up-to-date results and independence from Recon, it introduces significant operational overhead. @@ -137,12 +169,7 @@ Given its complexity, dependency on manual execution, and high resource consumpt # Summary -The proposed dashboard enhances visibility into cluster storage dynamics, enabling better debugging and decision-making. Recon is the ideal location for this feature due to its existing role as the observability hub in Ozone. - -This enhancement lays the foundation for future innovations like: - -- Storage heatmaps -- Auto-balancing recommendations -- UI-based debugging for deletion backlogs +The proposed dashboard improves visibility into cluster storage dynamics, providing deeper insights for effective debugging and informed decision-making. +Recon is the ideal place to host this feature, given its established role as the central storage overview in Ozone. --- From 48bc8db1615df48666fc0cba20a70c8e7390527c Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Mon, 22 Sep 2025 19:30:33 +0530 Subject: [PATCH 04/23] addressing review comments --- .../content/design/storage-distribution.md | 87 ++++++++++--------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 0b0cd8c68d8a..615c1c4f273f 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -1,6 +1,6 @@ --- title: Storage Capacity Distribution Dashboard -summary: Proposal for introducing a comprehensive storage distribution dashboard in Recon for enhanced cluster monitoring and debugging capabilities. +summary: Proposal for introducing a comprehensive storage distribution dashboard in Recon. date: 2025-08-05 jira: HDDS-13177 status: Under Review @@ -44,7 +44,7 @@ Detailed breakdown of storage usage across components: - **Global Used Space**: Represents the actual physical storage consumed on the DataNodes. - **Global Namespace Space**: Logical size of the namespace, calculated as the sum of pendingDirectorySize + pendingKeySize + totalOpenKeySize + totalCommittedSize, multiplied by the replication factor. - **Open Keys and Open Files**: Space occupied by data in open keys and files that are not yet finalized. -- **Committed Keys**: Space utilized by fully committed key–value pairs. +- **Committed Keys**: Space used by fully committed key–value pairs. - **Component-wise Distribution**: Breakdown of metrics across OM, SCM, and DataNodes. ## 2. Deletion Progress Monitoring @@ -68,17 +68,14 @@ Summarized cluster statistics: ## Approach 1: Recon-based Implementation -Leverage the existing Recon service to build the dashboard with centralized and efficient data collection. -Recon currently maintains synchronization with the OM database and constructs the NSSummary tree, providing established calculation logic for metrics such as openKeysBytes and committedBytes. -Additionally, Recon already possesses a comprehensive physical and logical capacity to break down information through its OM DB insights component. -These existing capabilities can be effectively leveraged to minimize development effort and ensure consistency. -While certain enhancements to OM are required regardless of the chosen implementation approach—whether CLI-based or Prometheus-driven—the foundational data processing infrastructure is already in place. -The modifications outlined for OM, SCM, and DataNode components remain mandatory across all proposed approaches to ensure complete and accurate storage distribution reporting. +Leverage the existing Recon service to build the dashboard with centralized and efficient data collection. +Recon currently maintains synchronization with the OM database and constructs the NSSummary tree, providing established calculation logic for metrics such as openKeysBytes and committedBytes. +Additionally, Recon already possesses a comprehensive physical and logical capacity breakdown through its OM DB insights component. ### Benefits -- **Unified Data Source**: All metrics aggregated centrally in Recon. -- **Performance Optimization**: Incremental sync reduces a load +- **Unified Data Source**: All metrics aggregated centrally in Recon +- **Performance Optimization**: Incremental sync reduces the load - **Reduced Overhead**: Avoids redundant calculations across services - **Code Reusability**: Built on top of existing Recon infrastructure and endpoints @@ -89,13 +86,13 @@ The modifications outlined for OM, SCM, and DataNode components remain mandatory - **Current State**: DNs expose storage metrics in their reports - **Enhancement**: - Add `pending deletion byte counters` in container metadata - - Calculate total pending per DN from these container metadata and publish metrics. + - Calculate total pending per DN from container metadata and publish metrics - **Responsibilities**: - Report actual and pending deletion usage per container #### **Storage Container Manager (SCM)** -- **Current Gap**: No block size tracking in a block deletion process +- **Current Gap**: No block size tracking in the block deletion process - **Enhancement**: - Track block sizes when OM issues a deletion request - Send a deletion command to DN along with block size and replication factor @@ -125,51 +122,59 @@ The modifications outlined for OM, SCM, and DataNode components remain mandatory - **Data Sources**: - OM DB (via Insight Sync) - SCM Client API - - DN BlockDeletingService metrics. + - DN BlockDeletingService metrics --- -## Approach 2: Prometheus + Grafana Implementation (Not Recommended) +## Approach 2: CLI-based (Not Proceeding) -### Overview +A CLI-based approach was evaluated to compute detailed usage and pending deletion breakdown by analyzing offline OM and SCM database checkpoints and querying DataNodes. +While it offers precise, up-to-date results and independence from Recon, it introduces significant operational overhead. -This approach would involve publishing storage distribution metrics directly from individual components (OM, SCM, DataNodes) to Prometheus, with visualization handled entirely through Grafana dashboards. +This approach requires generating and processing large metadata snapshots, which can take hours in large-scale clusters. +Given its complexity, dependency on manual execution, and high resource consumption, we have chosen not to proceed with the CLI-based solution and instead focus on enhancing Recon for better usability and integration. -### Why This Approach Is Not Recommended +## Metrics Exposure and Time-Series Tracking -#### **1. Customer Adoption and User Experience** -- **Current Reality**: Customers are already actively using Recon for storage analysis and monitoring -- **Existing Feedback**: Users have specifically identified gaps in Recon's current calculations and requested improvements within the existing interface -- **User Workflow Disruption**: Introducing a completely separate monitoring stack would fragment the user experience -- **Training and Adoption Overhead**: Teams would need to learn new tools and workflows, creating adoption barriers +While Recon provides a point-in-time view of pending deletions and storage distribution, it is equally important to track these metrics over time to understand trends and validate reclamation progress. +To enable this, components should expose metrics that can be scraped by Prometheus and visualized in Grafana. -#### **2. Incomplete Current State** -The primary driver for this enhancement is that **customers have identified that Recon's existing calculations are incomplete or incorrect**. Key issues include: -- Inconsistent storage usage calculations across different views -- Missing pending deletion visibility at granular levels -- Lack of real-time correlation between logical and physical storage metrics -- Incomplete breakdown of storage distribution across cluster components +### Component-wise Metrics -Moving to Prometheus/Grafana would not address these calculation issues. It would simply relocate them to a different platform while requiring significant additional implementation effort. +- **Ozone Manager (OM)** + - Recon has already methods that are available to calculate the following information. + - open key used space + - committed key used space + - containerPreAllocated space + - pending deletion + - In every OM db syncing, we can update these metrics values. -#### **3. Recon's Existing Infrastructure Advantages** -- **Data Access**: Recon already has optimized access to OM DB, SCM metadata, and DN reports -- **Calculation Engine**: Existing framework for cross-component metric aggregation and correlation -- **Web Interface**: Established a UI framework for complex data visualization and drill-down capabilities -- **User Base**: Active user community familiar with Recon's interface and capabilities +- **Storage Container Manager (SCM)** + - Block sizes associated with deletion requests and its caching in scm. + - This can be accessed by Recon using scmClient and can be exposed as metrics. + - This can also be updated along with OM db syncing so that we will get proper time series data. -## Approach 3: CLI-based (Not Proceeding) +- **DataNodes (DN)** + - Pending deletion bytes per node. This can be exposed as metrics in BlockDeletingService of DataNode + - Pending deletion count per node. This can be exposed as metrics in BlockDeletingService of DataNode -A CLI-based approach was evaluated to compute detailed usage and pending deletion breakdown by analyzing offline OM and SCM database checkpoints and querying DataNodes. -While it offers precise, up-to-date results and independence from Recon, it introduces significant operational overhead. +### Dashboard -This approach requires generating and processing large metadata snapshots, which can take hours in large-scale clusters. -Given its complexity, dependency on manual execution, and high resource consumption, we have chosen not to proceed with the CLI-based solution and instead focus on enhancing Recon for better usability and integration. +- **Recon UI** → Point-in-time snapshot for immediate debugging +- **Grafana** → Time-series visualization of trends such as: + - Pending deletion backlog reduction + - Growth of open key space + - Utilization vs reclamation rates over time + +By combining both, operators gain: +- **Real-time visibility** (via Recon) +- **Historical context** (via Grafana) --- # Summary -The proposed dashboard improves visibility into cluster storage dynamics, providing deeper insights for effective debugging and informed decision-making. -Recon is the ideal place to host this feature, given its established role as the central storage overview in Ozone. +The proposed dashboard improves visibility into cluster storage dynamics, providing deeper insights for effective debugging and informed decision-making. +Recon is the ideal place to host the point-in-time overview, while exposing metrics enables Prometheus and Grafana to track long-term trends. +Together, these complementary approaches give operators a unified and powerful view of both current cluster state and historical storage patterns. --- From 063de2706dd897d15f8bd67a185f813f8d76dd52 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 14 Oct 2025 22:44:16 +0530 Subject: [PATCH 05/23] addressing review comments --- .../docs/content/design/storage-distribution.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 615c1c4f273f..613c325fb64e 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -110,7 +110,8 @@ Additionally, Recon already possesses a comprehensive physical and logical capac - **Enhancement**: - Compute block sizes during deletion - **Responsibilities**: - - Expose logical storage metrics: committed keys, open keys, namespace usage + - Expose logical storage metrics — committed keys, open keys, and namespace usage.(All calculations will be performed in Recon using the synchronized OM database.) + #### **Recon** @@ -122,7 +123,12 @@ Additionally, Recon already possesses a comprehensive physical and logical capac - **Data Sources**: - OM DB (via Insight Sync) - SCM Client API - - DN BlockDeletingService metrics + - DN BlockDeletingService metrics (This is done via scrapping jmx metrics from DN in Recon) + +#### **Upgrade Path for Data Distribution Feature** + +A new SCM upgrade action (ScmOnFinalizeActionForDataDistribution) is introduced. +This action is part of the finalization process for the DATA_DISTRIBUTION layout feature, which enables the new block size tracking capabilities. --- ## Approach 2: CLI-based (Not Proceeding) @@ -149,9 +155,9 @@ To enable this, components should expose metrics that can be scraped by Promethe - In every OM db syncing, we can update these metrics values. - **Storage Container Manager (SCM)** - - Block sizes associated with deletion requests and its caching in scm. - - This can be accessed by Recon using scmClient and can be exposed as metrics. - - This can also be updated along with OM db syncing so that we will get proper time series data. + - The DeletedBlockLogStateManager is enhanced to aggregate these block sizes in-memory, providing a DeletedBlocksTransactionSummary that includes total transaction count, total block count, total block size, and total replicated block size for pending deletions. + - This summary is rebuilt from persisted transaction data upon SCM startup or leader election. + - New metrics are introduced in ScmBlockDeletingServiceMetrics to expose the aggregated deletion statistics (transaction count, block count, total size, total replicated size). This provides better operational visibility into the SCM's block deletion queue. - **DataNodes (DN)** - Pending deletion bytes per node. This can be exposed as metrics in BlockDeletingService of DataNode From 8ff8c4a6e85a3c63bbd5dc457b51374fd121c4aa Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Wed, 15 Oct 2025 15:35:53 +0530 Subject: [PATCH 06/23] adding design diagram --- .../design/storage-distribution-design.jpg | Bin 0 -> 69109 bytes .../docs/content/design/storage-distribution.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 hadoop-hdds/docs/content/design/storage-distribution-design.jpg diff --git a/hadoop-hdds/docs/content/design/storage-distribution-design.jpg b/hadoop-hdds/docs/content/design/storage-distribution-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d43bf6416f59ee4eb5370afb7e6b00f838b96dd GIT binary patch literal 69109 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 literal 0 HcmV?d00001 diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 613c325fb64e..0d4b9b8fd388 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -79,6 +79,8 @@ Additionally, Recon already possesses a comprehensive physical and logical capac - **Reduced Overhead**: Avoids redundant calculations across services - **Code Reusability**: Built on top of existing Recon infrastructure and endpoints +![](storage-distribution-design.jpg) + ### Component-wise Enhancements #### **DataNodes (DN)** From da5efcba5b98632efe950a9a98a74f770a4e5389 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Thu, 16 Oct 2025 08:01:51 +0530 Subject: [PATCH 07/23] adding the reason to add new feature layout --- .../docs/content/design/storage-distribution.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 0d4b9b8fd388..a8b92da23873 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -132,6 +132,19 @@ Additionally, Recon already possesses a comprehensive physical and logical capac A new SCM upgrade action (ScmOnFinalizeActionForDataDistribution) is introduced. This action is part of the finalization process for the DATA_DISTRIBUTION layout feature, which enables the new block size tracking capabilities. +A new feature layout is added to check compatibility between components. Following is an example for handling compatability between OM and SCM + +| OM Version | SCM Version | Compatibility Handling | +|------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------| +| **Old OM** | **New SCM** | SCM receives old proto. In `ServerSideTranslatorPB`, it checks if the new block list is empty; if so, it decodes using the old structure. | +| **New OM** | **Old SCM** | OM will be using `getScmInfo()` to fetch SCM metadata layout version. If the feature is not finalized, OM sends the old structure. | +| **New OM** | **New SCM** | Fully upgraded. OM sends size-aware transactions and SCM processes them accordingly. | +| **Old OM** | **Old SCM** | Legacy setup. Both components use old proto structure. | + +Also in SCM, while upgrading for an existing Ozone cluster, all existing block deletion transactions prior to DATA_DISTRIBUTION finalized will be ignored to update DeletedBlocksTransactionSummary when it's removed from SCM DB. +DeletedBlocksTransactionSummary only counts the transaction after DATA_DISTRIBUTION is finalized. +Also in DN side, newly added metadata will be persisted only if the feature is finalized. + --- ## Approach 2: CLI-based (Not Proceeding) From 1b7478f061c12bf0946b332bf961d94357c2e2f8 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Thu, 23 Oct 2025 10:37:45 +0530 Subject: [PATCH 08/23] updating design doc as per brownbag --- .../content/design/storage-distribution.md | 350 ++++++++++++------ 1 file changed, 246 insertions(+), 104 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index a8b92da23873..e7c3cd69ea1a 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -1,5 +1,5 @@ --- -title: Storage Capacity Distribution Dashboard +title: Storage Capacity Distribution Design summary: Proposal for introducing a comprehensive storage distribution dashboard in Recon. date: 2025-08-05 jira: HDDS-13177 @@ -22,7 +22,6 @@ author: Priyesh Karatha --> # Abstract - Ozone currently lacks a unified interface to monitor and analyze storage distribution across its cluster components. This makes it difficult to: - Understand data distribution across the cluster @@ -32,120 +31,267 @@ Ozone currently lacks a unified interface to monitor and analyze storage distrib - Identify potential bottlenecks and imbalances This proposal introduces a comprehensive **Storage Capacity Distribution Dashboard** in Recon to address these challenges. +This initiative significantly enhances operational insight, capacity planning accuracy, and system observability in large-scale Ozone deployments. ---- - -# Key Features - -## 1. Storage Distribution Analysis - -Detailed breakdown of storage usage across components: - -- **Global Used Space**: Represents the actual physical storage consumed on the DataNodes. -- **Global Namespace Space**: Logical size of the namespace, calculated as the sum of pendingDirectorySize + pendingKeySize + totalOpenKeySize + totalCommittedSize, multiplied by the replication factor. -- **Open Keys and Open Files**: Space occupied by data in open keys and files that are not yet finalized. -- **Committed Keys**: Space used by fully committed key–value pairs. -- **Component-wise Distribution**: Breakdown of metrics across OM, SCM, and DataNodes. - -## 2. Deletion Progress Monitoring - -Track pending deletions at various stages: - -- **OM Pending Deletions**: Keys marked for deletion at OM -- **SCM Pending Deletions**: Container-level deletions managed by SCM -- **DataNode Pending Deletions**: Block-level deletion metrics on each DataNode - -## 3. Cluster Overview Metrics - -Summarized cluster statistics: - -- Total capacity and used space -- Free space distribution across components - ---- - -# Implementation Approaches - -## Approach 1: Recon-based Implementation - -Leverage the existing Recon service to build the dashboard with centralized and efficient data collection. -Recon currently maintains synchronization with the OM database and constructs the NSSummary tree, providing established calculation logic for metrics such as openKeysBytes and committedBytes. -Additionally, Recon already possesses a comprehensive physical and logical capacity breakdown through its OM DB insights component. - -### Benefits - -- **Unified Data Source**: All metrics aggregated centrally in Recon -- **Performance Optimization**: Incremental sync reduces the load -- **Reduced Overhead**: Avoids redundant calculations across services -- **Code Reusability**: Built on top of existing Recon infrastructure and endpoints - -![](storage-distribution-design.jpg) - -### Component-wise Enhancements +## Approach 1: Recon-based -#### **DataNodes (DN)** +### Architectural Overview -- **Current State**: DNs expose storage metrics in their reports -- **Enhancement**: - - Add `pending deletion byte counters` in container metadata - - Calculate total pending per DN from container metadata and publish metrics -- **Responsibilities**: - - Report actual and pending deletion usage per container +The dashboard operates as an extension to **Recon**, leveraging existing telemetry from: -#### **Storage Container Manager (SCM)** +- **Ozone Manager (OM)** - namespace-level and key-level metadata. +- **Storage Container Manager (SCM)** - container, block, and replication metrics. +- **DataNodes (DNs)** - raw storage usage and pending deletion data. -- **Current Gap**: No block size tracking in the block deletion process -- **Enhancement**: - - Track block sizes when OM issues a deletion request - - Send a deletion command to DN along with block size and replication factor +All metrics are aggregated, and exposed through a **RESTful API (/storagedistribution)** for recon dashboard. - ``` - OM → SCM: block deletion request + block size - SCM → DN: delete command + block size + replication factor - ``` +![](data:image/jpeg;base64,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mgZrUVgN4v0i3gR7y6SJ2QylY1eQBAxXcSF4UFTkkAD8ibVz4j0m0vls57wLOzIgGxiu5yNqlgMAnIwM5xz0oA1aKxvEWuroFlFcNGjiSXy8ySeWi/KzfM2DjO3A45JA71p20pntYpmjeIyIGKP95cjOD7igCaiiigAooooAKKKKACiiigAooooAK5/xULYw6cZ2YSC7zbgdC/lSZB9tm/8AECugrC8TOy21mFthMGucM+P9SPLc7vzAX/gVOO5MtjCooorYyCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAx9WsvEdzdK+j67b2FuEAaKTqXyct0PbA/CisnxTB4Rl1OJtfuruK78kBFhBxs3Njop5zuopiPaKKKK5zoCiiigAooooAKybn/kaNP/69Lj/0OGtasq5/5GjT/wDr0uP/AEOGky4b/f8AkatFFFMgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4q+FsNd1M27MZTMhuAegfyo8Ae2zZ+JNdrXG6k7NrV+GthCFkUK+P8AXDy0O78yV/4DVw3InsV6KKK0Mwry6T4ha3babf6tLJorQWl49v8AYjvS4kAYLlTuPPOenY16jXIeGPA9ppf2qfU7HT7m+kvJZ45xHvZUY5UZYAgjnpSd+g1bqW08caU2r3GmlLtJbUFriQw/u4VCbyzsOgwMfWotM8faTqd0kAt7+2MsTTWz3NvsW5RRkmM55457UyPwnNI/itLmaJYdaIEbRklkHl7fmBA5zzjJrLs/CPiG5uNJGrzacsGjWskFt9mLlpmZNgL5HAAA6d80tR6F2H4m6LOYRHaaqxuIy9uBZsfPI6qmPvEd+3HWrZ8e6Q2l2F7bx3t09+XWC1t4C87FPv8Ay5429+ao6T4O1Cwm8IPLNbEaNFcpcbWb5jIuF2fLz75x+NY5+HGpRWGlsGsbm6spbgvBJLIkciSNkYdQGBH0o1DQ3JfiBby6loMWn2dxc22qGQNIIzujK5BXH94EfMOw55qtpHxGhlme31S2nRjqMlklxBbt5CndhFZyT8x9v0ot/BupWP8A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72S9SwtVu5F2vOsKh2HHBbGSOB+Qq7RRdhZGamg6PHZSWSaTYraSNueBbdAjHjkrjBPA/IVT0fStOu9B0WW5sLWaSC1iaJ5IVZoztU5UkcHgdPQVu1neH/8AkW9L/wCvSL/0AU7hZXJU0rTo7171LC1W7kXa86wqHYccFsZI4H5Col0DRo7KSyTSbFbSRtzwC3QRseOSuME8D8hWlRSuFkUH0XSpPs2/TbNvsuPs+6BT5OMY2cfL0HT0FOTStOjvZL1LC1W7kXa86wqHYccFsZI4H5CrtFF2FkZq6Bo0dlJZJpNitpI254BboI2PHJXGCeB+Qp76LpUn2bfptm32XH2fdAp8nGMbOPl6Dp6Cr9FFwsikmladHevepYWq3ci7XnWFQ7DjgtjJHA/IVJZ2Npp8JhsrWC2iznZDGEXOMZwPYD8qs0UXCwUUUUDCiiigAooooAKKKKACsq5/5GjT/wDr0uP/AEOGtWsq5/5GjT/+vS4/9DhpMuG/yf5GrRRRTICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xl/yA7b/ALCum/8ApbDXQVz/AIy/5Adt/wBhXTf/AEthoA6CiiigAooooAKKKKACiiigAooooAKKKKACiiigDn/GX/IDtv8AsK6b/wClsNdBXP8AjL/kB23/AGFdN/8AS2GugoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKzfD/APyLel/9ekX/AKAK0qzfD/8AyLel/wDXpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigArKuf8AkaNP/wCvS4/9DhrVrKuf+Ro0/wD69Lj/ANDhpMuG/wAn+Rq0UUUyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuf8AGX/IDtv+wrpv/pbDXQVz/jL/AJAdt/2FdN/9LYaAOgooooAKKKKACiiigAooooAKKKKACiiigAooooA5/wAZf8gO2/7Cum/+lsNdBXP+Mv8AkB23/YV03/0throKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACs3w/8A8i3pf/XpF/6AK0qzfD//ACLel/8AXpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigArKuf+Ro0//r0uP/Q4a1ayrn/kaNP/AOvS4/8AQ4aTLhv8n+Rq0UUUyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuf8Zf8AIDtv+wrpv/pbDXQVz/jL/kB23/YV03/0thoA6CiiigAooooAKKKKACiiigAooooAKKKKACiiigDn/GX/ACA7b/sK6b/6Ww10Fc/4y/5Adt/2FdN/9LYa6CgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArN8P/wDIt6X/ANekX/oArSrN8P8A/It6X/16Rf8AoAo6C6mlRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsq5/5GjT/APr0uP8A0OGtWsq5/wCRo0//AK9Lj/0OGky4b/J/katFFFMgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArn/GX/IDtv+wrpv8A6Ww10Fc/4y/5Adt/2FdN/wDS2GgDoKKKKACiiigAoooo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8K/8ihon/XhB/wCi1rXoAKKKKACiiigArOn/AORjsf8Ar1uP/Qoq0azp/wDkY7H/AK9bj/0KKlLY0pfF8n+Ro0UUUzMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArB8Xf8ga3/AOwpp/8A6WQ1vVg+Lv8AkDW//YU0/wD9LIaAN6iiigAooooAKKKKACiiigAooooAKKKKACiiigDB8Xf8ga3/AOwpp/8A6WQ1vVg+Lv8AkDW//YU0/wD9LIa3qACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/x4W3/AGEbL/0qirpa5rxB/wAeFt/2EbL/ANKoq6WgAooooAKKKKACs3w//wAi3pf/AF6Rf+gCtKs3w/8A8i3pf/XpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf+i1rXrI8K/wDIoaJ/14Qf+i1rXoAKKKKACiiigArOn/5GOx/69bj/ANCirRrOn/5GOx/69bj/ANCipS2NKXxfJ/kaNFFFMzCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACpPIk/u/qKjqr4tEbeFtQSaeW3jeMI00cfmeWGIBYrkZUZ+bkfLnkUAXhDIRwM/iKQQuwyACPYivM/MtYrHU7e3g037As1i+oT6JIfsr25lYSAoOEYKMuATlCMmpvENn4f1Wyaw8LmGJZbyzVp7Er9mSXc5QrtO3zAcFsDptz2oA9H8iT+7+orJ8R6XeX+mQw20PmSLf2cxG4D5I7mJ2PJ7KrH8OOa5jw7qEmv/EGw1943iWfTbm1jibjb5TW5k49RK8iH/cFI/hmTXfE/ieSK10yKRdUhA1KSMtdwbba2bEZA49vmxknIPQgHfeRJ/d/UUeRJ/d/UV55qHi7XYdQ1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Vg+Lv+QNb/8AYU0//wBLIaAOg8x/77fnR5j/AN9vzptFADvMf++350eY/wDfb86bRQA4u54Lt+dNoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHwR/yIPhz/sF23/opa3qwfBH/ACIPhz/sF23/AKKWgDeooooAKKKKACiiigAooooAKKKKACiiigDL8Qf8eFt/2EbL/wBKoq6Wua8Qf8eFt/2EbL/0qirpaACiiigAooooAKzfD/8AyLel/wDXpF/6AK0qzfD/APyLel/9ekX/AKAKOguppUUUUDCiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf8Aota16yPCv/IoaJ/14Qf+i1rQu76xsFja9vra2EmdnnShd2OuM0MaTeiJ6KYJ7YvboLu33XIJgHmDMoAySvrgc8U9Wie5ktluIWnjUM8QcFlB6EjqAaAswoqb7M/qtRlFWZIWljErqWVC3LAYyQO4GRn6igQ2s6f/AJGOx/69bj/0KKtZoSuNzoMnAyevtVWTTZn1a2ugybIoJYyMnOWKEdv9k/pSZcHZ3ZLRT9i+d5Pmx+aF3bN3zYzjOPSmRNDOZhDcQSGFikuxwdjDkhsdD7GmTZhRS25jvLdJ7aeKaFxlZI33Kw9iODTxCWZgHQleCM9KAsyOinRoswYxSxuFYq21s4I4IPuKebdlBJK8DNAiKiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHxd/yBrf8A7Cmn/wDpZDW9WD4u/wCQNb/9hTT/AP0shoA3qKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHwR/yIPhz/sF23/opa3qwfBH/ACIPhz/sF23/AKKWgDeooooAKKKKACiiigAooooAKKKKACiiigDL8Qf8eFt/2EbL/wBKoq6Wua8Qf8eFt/2EbL/0qirpaACiiigAooooAKzfD/8AyLel/wDXpF/6AK0qzfD/APyLel/9ekX/AKAKOguppUUUUDCiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf8AotaiivrPSvE+oy6rNFbCeGL7NNOwVWQbtyAnjIbkj/aBqXwr/wAihon/AF4Qf+i1rcWVQgVkDY55pNFwly3utzz028sZsbyGJ1WF76+tI8EHyxLG2AOwZd2B6PW34ab7T4lu9R731qs6n1j3ssf/AI4qn6k11X2kf3P1o+0/7H61KhZ3NpYjmjy2/rc4m/udQhtbi5F7KY5dUe3lMty0SQwgvgBwCUywUbsZ5xxUH9o3EUVtdzXJlVLS+EU0EpchPMhAIkZRnGfv4xgZ5rvDcAjBjyD70faABgR8fWjlYKulvE4BLoXYMc95mC21K3dDHfPKFVhj/WHBYbgfYHIFFnq2sO08sNzG9+IblpbYXTysGUHavlbNseGCgc8g9813/wBoAGBH+tVn1IR6nBaiAZmikkL7umwoMdOfv/pS5bdSlXT0UTn/AA3Jay+JJzZanLfw/YIiZJJfMwxZs/N69CV7Z7ZrMLS219qUMAcf2xdS2m5f4XD/AHh7+W8h/wC2YrvBcBekYH40v2n/AGP1p8hCr2lex5r9turSytrVLmOztY7WRrYtdtADJ5sgOAqN5hUBPk/2uhzxpMkx1i4h+2zwXNze24m8qZgdpgycA9ASCAccY9q7czq2Mxjjkc0v2nn7n60lAp4lO75d/wDM4p73/SVh1LVJ7SwE12BKs5QmRHARd3U4UsQvfHQ4qRb+VPEUKSX8s7Fo08sTGORcxDO+Ajayk5YsOQSR2rsDcA9Yx+dI04Of3YyRjNPlfcn2y7ENFFFWc4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWD4u/5A1v8A9hTT/wD0shrerB8Xf8ga3/7Cmn/+lkNAG9RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVg+CP+RB8Of8AYLtv/RS1vVg+CP8AkQfDn/YLtv8A0UtAG9RRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGX4g/48Lb/sI2X/AKVRV0tc14g/48Lb/sI2X/pVFXS0AFFFFABRRRQAVm+H/wDkW9L/AOvSL/0AVpVm+H/+Rb0v/r0i/wDQBR0F1NKiiigYUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/ANFrWvWR4V/5FDRP+vCD/wBFrWvQAUUUUAFFFFABWdP/AMjHY/8AXrcf+hRVo1nT/wDIx2P/AF63H/oUVKWxpS+L5P8AI0aKKKZmFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVg+Lv+QNb/wDYU0//ANLIa3qwfF3/ACBrf/sKaf8A+lkNAG9RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUdBk0xEkuPmDFIuxH3m/wABWc6ih5spRuPopfsVt/FCr+7/ADH9aPsNr/z7Rf8AfArL20+34/8AAK5V3EopfsNr/wA+8X/fAo+w2v8Az7xf98Cj20/5fx/4Acq7iUUv2G1/594v++BR9htf+feL/vgUe2n/AC/j/wAAOVdxKKX7Da/8+8X/AHwKPsNr/wA+8X/fAo9tP+X8f+AHKu4lFL9htf8An3i/74FH2G1/594v++BR7af8v4/8AOVdxKwfBH/Ig+HP+wXbf+ilrf8AsNr/AM+8X/fAo+w2v/PvF/3wKPbT/l/H/gByruJRS/YbX/n3i/74FH2G1/594v8AvgUe2n/L+P8AwA5V3EopfsNr/wA+8X/fAo+w2v8Az7xf98Cj20/5fx/4Acq7iUUv2G1/594v++BR9htf+feL/vgUe2n/AC/j/wAAOVdxKKX7Da/8+8X/AHwKPsNr/wA+8X/fAo9tP+X8f+AHKu4lFL9htf8An2i/74FH2G2HSBF91GD+lHtp9vx/4Acq7iUU14ZIPmjLSIOqHlh9D3+hpVYOoZTlTyDWlOqpabMlxsZniD/jwtv+wjZf+lUVdLXNeIP+PC2/7CNl/wClUVdLWpIUUUUAFFFFACVneH/+Rb0v/r0i/wDQBVXxRPqNlpR1DTXHmWp3yRMu5ZI++R7cHII4B9aoeBrnUL7R0nuiqW0aLb20ajGQgwXJ7kkY/A07aXJvrY6uiiikUFFFFABRRRQAUUUUAFFFFAHL+Ff+RQ0T/rwg/wDRa1r1keFf+RQ0T/rwg/8ARa1r0AFFFFABRRRQAVnT/wDIx2P/AF63H/oUVaNZ0/8AyMdj/wBetx/6FFSlsaUvi+T/ACNGiiimZhRRRQAUUUUAFFFVru+itGRCHkmkzshjGWbHXjsPc4FNJt2QnJRV2WaKz/tGqtyun2yj0kuyG/RCP1o87WP+fCy/8DG/+NVfsmZ+1j/SZoUVn+drH/PhZf8AgY3/AMao87WP+fCy/wDAxv8A41R7Nh7WP9JmhRWf52sf8+Fl/wCBjf8AxqjztY/58LL/AMDG/wDjVHs2HtY/0maFFZ/nax/z4WX/AIGN/wDGqPO1j/nwsv8AwMb/AONUezYe1j/SZoUVn+drH/PhZf8AgY3/AMao87WP+fCy/wDAxv8A41R7Nh7WP9JmhRWf52sf8+Fl/wCBjf8AxqjztY/58LL/AMDG/wDjVHs2HtY/0maFFZ/nax/z4WX/AIGN/wDGqPO1j/nwsv8AwMb/AONUezYe1j/SZoUVn+drH/PhZf8AgY3/AMao87WP+fCy/wDAxv8A41R7Nh7WP9JmhRWf52sf8+Fl/wCBjf8Axqjz9WHJsLQj0W7Yn9Yx/Oj2TD2sf6TNCiqdtqCTzfZ5I3t7kDd5UmMkeqkcMPp+OKuVDi46M0jJSWgUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVUuL9IZhBHG89wRu8qPGQPVieFH1/DNM83VTyLG0A/wBq7YH9IzUuSIc4rQvUVR83Vv8Anysv/Atv/jVHm6t/z5WX/gW3/wAao50HtEXqKo+bq3/PlZf+Bbf/ABqjzdW/58rL/wAC2/8AjVHOg9oi9RVHzdW/58rL/wAC2/8AjVHm6t/z5WX/AIFt/wDGqOdB7RF6iqPm6t/z5WX/AIFt/wDGqPN1b/nysv8AwLb/AONUc6D2iL1YPi7/AJA1v/2FNP8A/SyGtDzdW/58rL/wLb/41VDV7LVtVso7f7PZRbLq3uN32lmz5UyS4x5Y67MZ7Zzz0o50HtEbtFUfN1b/AJ8rL/wLb/41R5urf8+Vl/4Ft/8AGqOdB7RF6iqPm6t/z5WX/gW3/wAao83Vv+fKy/8AAtv/AI1RzoPaIvUVR83Vv+fKy/8AAtv/AI1R5urf8+Vl/wCBbf8AxqjnQe0Reoqj5urf8+Vl/wCBbf8AxqjzdW/58rL/AMC2/wDjVHOg9oi9RVHzdW/58rL/AMC2/wDjVHm6t/z5WX/gW3/xqjnQe0Reoqibq/h+afT1ZO/2abzCPwZVz+Gas29xDdQiWBw6HjI9e4PofampJjUk9iWiiimUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARyr5jxw9nPzfQdf6D8au9gKpr/x/Rf8AXN/5rVzvXG9akjXogooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVPb5V06D7rDeo9D3/ofxq5VSf/j8h/65v/NaT0aY99DN8Qf8eFt/2EbL/wBKoq6Wua8Qf8eFt/2EbL/0qirpa7TIKKKKACqt3eLahFCmSeQ4iiXqx/oB3Pb8qtVmacftV1eXrZz5pt4+OiRkg4+rbsn6DsDQJiG11O6Q/aLuK3ByPKgQOMehZxz/AN8io7XSrvTbWK3stQzFCoVI54VIwOxK7T+PXuc1sUUXCxTtbzzZWt50EN0g3NHu3Aj+8pwNw/DjuBVysvWkEdot+vElkwm3DrsH31+hXPtkA9q1KAQUUUUDCiiigAooooAKKKKAOX8K/wDIoaJ/14Qf+i1rXrI8K/8AIoaJ/wBeEH/ota16ACiiigAooooAKzp/+Rjsf+vW4/8AQoq0azp/+Rjsf+vW4/8AQoqUtjSl8Xyf5GjRRRTMwooooAKKKKACs7SEE0Lai4zLd/OD6R/wKPbHP1JrRqhoP/Ivab/16xf+gitqfwsxqfEkaFFFFMQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFPU7U3NqWjwLmL95A/91x0/A9D7E1Na3C3VpDcIMLLGrj6EZqas7Qv+Rf03/r1i/wDQRSnrEIaT9TQooorE3CiiigAooooAKKKKACiiigAooooAKKKKACormdbW1muHGViRnP0AzUtUdb/5AOo/9esn/oBpN6Ck7Jkum2ptrUGTBuJf3kzf3nPX8B0HsBVuiioSMlogooooGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZroLPV4nQYjvMpIo7yKuQ312hgfoPStKqGof8AH5pf/X03/omShifQu0UUVobBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADF/4/4v8Arm/81q5VNf8Aj/i/65v/ADWrlcT+OX9dEaLZBRRRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqlx/x+Q/9c3/AJrVuqlx/wAfkP8A1zf+a0n09V+Y0ZviD/jwtv8AsI2X/pVFXS1zXiD/AI8Lb/sI2X/pVFXS12mQUUUUAJWbpTCKa+sifmhnaQA91kJcH6ZLD6qa06x9SuLCK4Sb+0Le3vYgVXdIPmB6qw6kHGfUYz60xM2KKwYPE8LuI5bK9V84LRW7yofdSFyR+APtS3PiaCH5Y7K/eQ9N9rJGv1JYcCizDmRa1webpklmpO+8/wBHUDqd33vyXcfoDWnWJYXlpc3ZuLm+tmugMJAsnEIPoDgkn+8QPQY77fehggooopDCiiigAooooAKKKKAOX8K/8ihon/XhB/6LWtesjwr/AMihon/XhB/6LWtegAooooAKKKKACs6f/kY7H/r1uP8A0KKtGs6f/kY7H/r1uP8A0KKlLY0pfF8n+Ro0UUUzMKKKKACiiigAqhoP/Ivab/16xf8AoIq/VDQf+Re03/r1i/8AQRWsPhZjU+Nf12NCiql/qlhpUIlv7yC2jY4DSuFyfQZ61JZ31rqFuLizuIriFuBJE4ZT+Iq7O1ybq9ieiiikMKKKKACiqseo2M19JYx3cD3cQ3SQLIC6jjkr1HUfmKLPUbHUBIbO7guBG21/KkD7T6HHQ07MV0WqKKKQwooooAKKKKACiqUmsabDYm9lvrdLUMU85pAF3AkEZ9cgj8KS31nTLuxkvbe/tpLWMEySrKCqY65Pb8afK+wrovUVRbWdLSwS/bULVbNzhbgzLsJyRgNnHUH8qnt722uzILeeOUxkBwjA7SQCM/UEH8aLMLonrO0L/kX9N/69Yv8A0EVo1naF/wAi/pv/AF6xf+gipl8I4/GjQpyqWJCjJptY/ipd/he+TajblQbX+6f3i8H2rOK5pJGzdk2bnkSf3f1FHkSf3f1FcFdWp02+vrZraxtfOgt3WHT8iMbbhQWdcDDHcMHHIB9K1Jdc1W3gXU1n8/zLq5g/s7YoCiMSkYYDdu/dgnJI5OAOK09i90zNVe6Op8iT+7+oo8iT+7+orkNRu9Rhs7KX7YmrTtLbXEduqpGwZt/QjACHHGcn5Tya37PVxH4ROsXM7XIW3e4kKRhCMAllC9sYK888cmplTaVylO7saHkyf3f1FHkSf3f1Fcr4MeXTNSuNFvYwL4wrcExEGNowFVWz/E7EtubAyV9MZgvb8aF4y1XVWBaJo1t5EH8TeVvj/HKso93FV7J8zSYvaaXOx8iT+7+oo8iT+7+orgdLm1PSVTR7U3DTTXlxJPNbiIuXVYy2PNIXlnJPU4HHqLsOragJ5dQub1opG0yHEcYSVPMaVkBUAkEk4x82MnBOBQ6L7iVVdjsfIk/u/qKPJk/u/qK5W21jVrib+zHuZbeU6iLY3EyRNKieR5uCEzHuJGB7H1rOh1e/tNFlS0vJHuIXvriVreKPa2J3AdjIcBMg8Lye3Sj2L7h7Vdju/Ik/u/qKayMmNwxmuVGo3aXepTre3Akufsiwwxxo5VnXJCBsDOAeWOO5zitbQdQudQ0xzdljNBcywkvt3EK2Bu2fLu7HHHFTKm4q5UZpuxpVR1v/AJAOo/8AXrJ/6AavVR1v/kA6j/16yf8AoBrKXwjn8LJNQ1XT9KjWTUL2C2RjhTK4XcfbPWpYb60uLeO4huYZIZSBHIrgqx9Ae9cf4thibxPp8tvqlpaamlu4jjvot0MqE8jceA2fTnFczPJFf6BZARx6f9n8QJDK1jKfIdjjMqE5xjHHYfjWLlY53Np2PXaK8r1TVr0Jr+ot4gubW80y7ENpZLKAkiAgKWT+PcCTn+lay3eoXHibXbifU7u0tNOtYLk20Y3AMYSSMHqAQSRxk4p84/aI76ivJdP8QaxZ3TtFeXdwJdJlu0S6nSUlgMq+1fuf7uTVjTNVu4NX0EW3iC51Nrmznubi3eUOFk8okLgcgZHCnpg+tLnQvao9Sqve39np0Hn3t1DbRZxvlcKM+mTXnHhHVdZutV0m5k1F5kvRJ9pinvI2DYBIMcY5TaRyK2fEJtV+IWinVvK/s820gh8/HlibPfPGcYx74p8+lx891dHX2l5a39us9ncxXELcCSJwyn8RU9ed6tqul2Wk6pN4Yb7N5l7DDeXkOfKTdwWTnaCBwSAOo9jWfqWq32l2viOy0/W7q+tra1gmjunm8x4pGdQV3j1GeP8A69HOJ1LHqbMqIXdgqgZJJwAKFZXUMpDKRkEHIIrzTV0v7a417SJtXvrm3fQmviZXGRIDggYHCnByPQ1Xu76aDRtHsrPVb/dFpH2tvLuUiUe7SHlgp4CAdBS5w9pboenG7theCzM8f2kp5gi3DeVzjdjrjPepq8xtdZ1C5kt7mS5fzm8MyzFxwfMDHDcd+KW11DWNMfQLsapeXr6jpk80kE7Bk3pFvXaMcckA9zRzh7Q9NoryjQ9W1tvIuTqcsqXVlPJOs17G53BCQ0cY5TBGCK7LwPHeP4dtr++1G4vJruJHIlPyxgA4C/h1Pc01K44z5uhtQ6pp9ybgQX1tL9m/1+yVT5XX72Dx0PX0NSWd7aahB59ncw3EJJHmROGXI7ZFePwySWU+rpFkNrNzc6euP+ennIB/47K/5Ve0+4e10Gz0y0ubuBp9SugsdtIsJdU7GRvuAfQ5qVMn2p6zRXlularq2sQeGrZ9Xuo/tFzdwyzQyDc6IuRzjBOOhx705NX1A6V/ZkuqahJOusT2kbxyLHJLHGAcNK3C9c5wSafOh+0R6hRXlFlr2o32n6RZXmsz2trPqFzDNfJMA4VFBRfMxjkkjOOcUz/hINVGi3EcOq3FzHJrptBeCVUYxBRgK5+Vd3r0o50HtUetVQ1D/j90v/r6b/0TJXnn9oa6bC0shqsiF9ajtY7hblJpFjZWyrsvDEHB59q7yW3Np/Ytu08s5jnKmWU5d8Qyck+tPmuNS5jUooorY6RQpY4HJp3lOSQAMjqMiqeovcx6VevZ5+1LbyGHAyd4U7f1xWTbQaFY6bpOo2dupvJU327w/wCtuG8sswdhywIBJznnHfFJsluzOj8iT+7+oo8iT+7+orkptZ1i009Jk1FLmS7043YYxLtgfdGAFwBlD5h+9k/L1p97NqYv1sJdVmfydQtisqoisVcNlSAMEArxx35zS5hc/kdV5En939RR5En939RXH3GvXztcfvJJrO5tbx4vOiiEZCDjYASxHY7xg54qwNS1VWuLlL0JbWt7Z24tlhXDJIsG7JxkcykjGMe4xg5kHtEdR5En939RR5En939RXG2/iPXJbZr11kSKaG5dVl8gJGUViuwBi7EEAMGHfPGK1dbF1/wrjUmvbgXFxJYyOzhAoGUJwAOw/OjmBTuro3fIk/u/qKPIk/u/qK4u4Wfw/qq3i6Lp+n+Xp91KkenuWW4ZArbX+ROmMjg/Ud5DreuwWjiWdo2f7KyT3It8p5kyoxCxucoVY4J54PJ7LnF7Q7DyJP7v6ijyJP7v6iubj1DU5NYbRP7ScBZ3U3wij8wgRI4jxt27suedvRfXmqy6lrGp28qG/EMcenSSu0US5lYPIisCc7QwUN+WKfMPnOt8iT+7+oo8iT+7+orlbbUdStm00SXsrWapbI8ipHICz4BEo4dSdy7WXjkE5rodR/0nVtNsuqhmupB6hAAo/wC+3Uj/AHTTTGpXLPkSf3f1FHkSf3f1FYJOqDxhq39nLaEfZrbf9oZh3lxjaPrXP2Gr6tDpVpaWQkQW9gbpnj8nazGRx85lZcINnO3n5uo4yuYlzt0O+8iT+7+oo8iT+7+ormLzxBqC6hDJE8vlC5traaNVi8lWl2bgWJ3swEgI2ceveo7WbVLy50K7udTfE15OPJjjRV2qkmAeMnIXn68dAaOYfOdX5En939RR5En939RXBWOsaronhfS5IrtLxJtKDpEY1AtyvlopB4yBvwdx6jqBmtZdX1aKG4tLiS6WczRRwMVt2uGLBmZdqsY14QkFsDBPXFJTQvaI6fyJP7v6imtG6DLDA+tchBqmo3U1jdvemKSGPUEYSlFjYxuApkK5Hpkg44OK2dEvbycXNvfyzm5i8tzHcRxhkDBuQ0fyspKnHfg5pqVxqabsalFFFUWMX/j/AIv+ub/zWrlZ01xDazpPcSpFEkblnkYKo5XqTUtpq2nag7JZ39rcOoyVilViB64Brifxy/rojXoi5RRTUkSVA8bq6noVORTEOoqCe8trVoluLiKJpW2RiRwu9vQZ6mnC5gN0bYTRmcJvMW4bgucZx1xQMlooqJ7mCK4igkmjWabd5cbMAz4GTgd8CgRLRRRQAUVFLcQwPEksqI0rbIwxwWOM4HrwDVSDXtIuZlhg1SyllY4VEnUsT7DNAzQoqBLy2kupLVLiJriIAyRBwXUHoSOo6ikW/s3tDdpdwG2XOZhINgwcHnp1oAsUUgIYAggg8giqt5qlhpxQXt7b2xfO3zpQm7HXGaBFuiqh1TTxZfbft1t9lzjzvNXZnOPvZxUrXduk0MLTxCWcExIXGZMDJ2jvgc8UATUVXhv7S4neCG6gkmj+/GkgLL9QORU7MEUsxAUDJJ6AUDFoqhba5pV5MIbbU7OaU9EjnVmP0ANWI721mmmhiuYXkg/1qK4Jj/3h2/GgCeiqh1SwFtFcNfWwglOI5DKoVz7HODVpWDKGBBB5BHegBaqXH/H5D/1zf+a1PPPFbQPPM6xxRgs7scBQO5qCZg11AykFTG5BHQjK0n09V+YIzfEH/Hhbf9hGy/8ASqKulrmvEH/Hhbf9hGy/9Koq6Wu0yCori4itYHnnkWOJBuZ2OABUtZeoJ9s1GzsmwYRm4mUjIYLgKD/wIg/8B/MQmMW0utTKzXkk1tB/DaxSFSfd2GDn/ZBx65rE8O28Fp8Q/FcMMUcQ8ixZVVQOCsgz+YP5V2VYureFtK1q7S7uo7iO6SMxefa3Utu5jJyUZo2Usuexz1OKAscFYX+sW2kO2ltdrZz6xqkk89hbpcTqBcNsZY2zuQnduIBPTHXNWJvF2saneWVjp19OVXS47yW70/ThKZ5HZ1GUf7iDyzkfeycZGK7GbwfostpYW0dvLaJp6lLZrO4kgaNWxuXcjAkHAzk8kZ681HdeCdBuorWL7LLALWH7PGbW5lhYxdSjFGBdSecNnkk9zQMwNI1DXPE/iC0t7821rZppNre3dm1sshaWRplZQzZwp2e54GOprrTp0tiA+myMFUc2ruSj+wJyUP049R3qSz0bTtPuvtFpapDJ9mitBsJAEUZYooXOABvboO/sK0KLisV7S6S8t1mj3AN1VhhlPdSOxB4qxWYiiz11lUYjvYzIfQSJtB/EqR/3xWnQwQUUUUDCiiigAooooA5fwr/yKGif9eEH/ota16yPCv8AyKGif9eEH/ota16ACiiigAooooAKzp/+Rjsf+vW4/wDQoq0azp/+Rjsf+vW4/wDQoqUtjSl8Xyf5GjRRRTMwooooAKKKKACqGg/8i9pv/XrF/wCgir9UNB/5F7Tf+vWL/wBBFaw+FmNT41/XY5jVGs4/idatrBiFq2nEWhnx5Yl3/NjPG7H6YrCkvdNs7vxVeW19c2mkrNAITp0gTzZ9h3IhwRyeuB2B6V6VfabZanCIb60guYwchZowwB9RnpUTaHpL2KWT6ZZtaxtuSFoFKKfULjGeTz710xqxS1MHTd9DzxLjVLTSNItL3xFKBqN6Rd3MdwGa2XblYg/YnufX26pJrGqR6Vf2drrFxNFbavBb29+XDOyt95S3Rsf19K9CXQdHSzktF0qyW2kIZ4lgUKxHQkAYJ96lTSNNjtEtEsLVbaNw6RCFdqsOQwGMZ96r20ewezl3POdV1bWNBHiPT4NTu7iOCS1Ec87hpIVlyWO7GB2A9K6HwTcaibzU7S6u2uLaLy2i827S4ljJByGZexxkZrqH06yka4d7O3ZrlQs5MSkygcANx8wHvSWOnWWmQmGxtILaMnJWGMKCfU4qZVYuFrajVNp3ueX6nfHQvG2t64ucQzC3bHffbkr/AOPov51BpvmaHp2oabHcXUE8moW1t/oxVXdvKyy72OEyQfm5+leqy6Tp05mM1hayecyvLvhU72X7pbI5I7E9KbNo2mXKSpPp1pIszh5Q8Knew6M3HJ960+sK1mu34E+yd73PNbXWNYuNMt7X+1LlG/4SFbITLMJHERU5UvjD4Pcjmrsmq3um2Ov6bLq1/IIL6G3t5sq03zjO3ecAdPvHpXepo2lxbfL020TbIJV2wKMOBgMOPvAdD1p0uk6dOlwkthbOtwQ0waJT5hHQtxyR71Pto320H7OXc8vXX9Xh07ULJ9SniiTVLe2e5acSvbRODvPmADOCoGe2TS3Wvajp6eI4LDW7i+gge0hiunlDmNWzuIbpnPy7v616Df8Ahy1m02a109LfT2l273itY2VwvRXUjDDHaq+heE4NKF+bqSK8kvtiyqLdY4gighVCDIA5P1q1Wp2bt8vuJ9nK9rnEz6nrtno2qQx6nLiO4thA7XiTzRFmwysy9QeoB7V3GqJc6L4H1AJd3F1cQWszCeVvnJIY549M8ewFaMWh6VBaG1i020S3LhzEIV2lh0bGOvvVyaGOeB4ZVDxyKVZT0IIwRWU6qdrIuMGr6nnDRWNrd+CPtwiGk/Y22mX/AFXnFAQWzxk54z3qDVmtJNZ8VPpHlGxGiEXJgx5ZnycdOM7c/rXdWOgW1voUOkXgjv7aEbUE8QPyg/KCDkEgYGfarUGkada2T2UFhbR2sgIeFYlCPnrkYwfxqvbJO/8AW4vZtnjl3ubw8+gkEpZxvqRHYI0KFf8Ax+VvyrudGcQeOreKL7tzocUs4H95W2qx/A4rq20jTG37tPtTviELZhX5ox0U8crwOOlV7HRYrPV73US4eWdUijUJtWGJRwg/HJP/ANaiddSVrCjScXc1KwNGl1QaHp4js7NkFtHtZrtgSNowSPLOPzNb9Z2hf8i/pv8A16xf+giuZu0TZJua1sHnav8A8+Nl/wCBjf8Axqp7aKe+8221PT7NrV0IZPNMwbkcFWQDFWamtv8AWH6VnzLsaqL6sittF0qzheG20yzhicgukUCqrEHIJAHODT49K0+K+e9jsbdbp+HmEah29cnGew/KrlFTdlWRQh0rS7CJjDY2dvGreaxWJUAYfxHjqOee1LHLpcdorxyWi212S6spUJMWBYkdmyAzE9wCaz/Fcs0mlx6bbRrJcahKLcIX2gpgtJk4OBsVhnHUiuWd57eCHSbqFIJbPUJmSJH3KsUltcOgBwMgEsvT+GtIwcle5nKXK7WO3stK0m2Ec1jY2cY5eOSGJR94ckEDuMfhip5LG0mLmW1gcuyu5aMHcy/dJ9SMDB7VwkV9IkAU6jLDqMQs00+1WYqJI2SPJKZw4LGQEkHAXtjNWo9UWEXt1Nql42pwm7M9lE+8JGm/ZiM8LgBCGx8xPOc8N05b3EprsdXeaXpdzCYruytJI3k3lZYlIZzxnn+I9M9aT7DpV8gP2WzuERWt8+WrBVBwyewBXBHqK4A3i3Jmt7jUN1rBcWE6tHqTzBd0rK58w7eOFyBwpxirraiWkuF1TVp7O3Q3ptmScxF5FuZFxkEbtqhMLyDk8Gm6bXUPaLsdidB0fyHt/wCy7PyZNu+PyF2tt+7kY7ZOKVtD0llhVtMsysOfLHkLhMnJwMcZPP1rkXm1Nobu/ur66ju7SSy/cpIVjDMsfmAr0IO48Hp2wa76okpR6lRs+hQfRNKkj2PptoybFj2mFcbF5VenQdh2qtc2p09Ej0rTrNUYlpF3+SMgAA4VDngY7dBWzVe6/g/GpUn1K5V00MC8m1H7HP8AaLKxWARsZD9tcYXHJ/1Vcjpmo+JLrQr4Tw+dYG2kxNcHawG09DjLfl+Ir0J40lQpIiup6hhkGqWt/wDIB1H/AK9ZP/QDWvtoxpSjy7/gc9WhKUubmehPfaZYanGsd/ZwXKKcqJow2D7Z6U1tI01rAWDafamzHIgMK7B/wHGKuUVyWNLIoS6LpU15Hdy6baPcx4CStCpZcdMHHbtVkWdss00wtoRLOAszhBukAGAGPfA9amoosFkZqaDplujfYrG1tJtrKk0ECK8ZYYJU4/zisfSPBv8AZ2sQajcXsU7W6OsKQ2aQAFhhmbb95iOM8V1VFLlQuVFK20jTbO7kurawtYbiTO+WOJVZs9ckCpb2wtNRg8i9tYbmLOdkqBhn1we9WKKdh2RVj0ywhsTYx2VuloQQYBGAhB65XpUMWjaRb2b2UenWaW0xy8AhXZIRzyMYPT9K0K4+7kF746vkluTBHp+lkxOTgRPJndIPooApOyE7I6Y2thNdSOYLZ7gxeS7bFL+X/dJ67fbpVc6FooFvEdMscQ58lDAnyZOTtGOOTnivOtLtF0G40W4v9LiKNcLHDrGm3WfPZzx5inlge9X9H0nSNf0/XNV19ibyO7mSS4aUq1qq/dC9lx1HH51PNczU79Du00rTIsKlhaJiIwgCFR+7JyU6fdJzx0p4srCNrdhbWytaqUgPlqDECMYX+6CMDArzXXZI4PGuk6lBdSXENlpdvP58hy0kZn2MxOBklXJziq2n2yaprHiC5mJAv9LmulbP3QJj5ZB9giGlza2sHOr2senwaLpVrLNLb6baRPMCsrJCoLg9QeOQatQQRW0KQwRJFEg2pHGoVVHoAOlZ3hq+k1Lwzpt5MSZZbdGdj3bHJ/E81q1ordDVWtdFMaVpwZCLC1BSUzKfJX5ZD1cccN79aZJomlTQCCXTLN4g5kCNApUOerYx1PrV+iiyCyKkWladA8bxWFrG0Ts8ZSFQUZhhiMDgkdT3pkui6VPC0Uum2bxvKZmRoFIaQ9WIxyx9etXqKLBZGFqvhqK9s1t7A21ivmmZ4/sccscrHuyEcn3yDRo/he003Sbixutl+LqZp7gywqFdjjonQAYGB2rdopWW4uVXuU4tI02GCGCKwtUigkEsSCFcI/8AeAxwffrUGrtKs+mGBEeX7UcK7lQf3UncA4/KtOqGof8AH5pf/X03/omShg0J5urf8+Vl/wCBb/8AxujzdW/58rL/AMC3/wDjdXqKu3ma8r7kFnJqBukE9rapHzlkuWYjg9igz+dWbbR9MtLqS6ttOtYLiTO+WOFVZs9ckDNOg/1y/j/KrlOw0u5Qg0XS7ZZlh060jWb/AFoSFQH5zzxzzzU0thZ3G/zrSCTeVL74wdxX7pOeuO3pVqkoCyM8aHpKyvINMsw7klm8hcsSCDnjuCc/U+tWPsNpsdfssO13V2HljDMuNpPqRtXB7bR6VZoosgsigmj6ZHPPOmn2qzXAImcQrmQHqGOOc9/Wn3j6fHbSW941stv5RLxzFQvljAOQeNvIB7c1critbIlv21OVd1laX8EMueVEaBizn2Ejrn/rnntQ9BSdkdLbXWl6uVuLaa0vDASBJGyuYyRgjI6ZH6VWn8NaXJYPZwWdvbQyTxTSLDCoEnlurgMMcg7cfQ1karq9jcJdXOlyptX7PHd6lbuCFiMnzKHHdVLEn+ENmqlu0l9q0NjbardvpZupFiljuWZpFEKsV8zOWAcnnOcgjPFS2iXJHVNoelNZLZnTbQ2qvvWHyV2BvXGMZ96spZ20WPLt4UxGIhtQDCDov09uleerdalBo9tKNVvHmvdKed5HlztdZIgrKOi8SEHHXvV+SO6sdRu3TU790tdTs4Io5J2YbZTEHDZ+9necZ6dsUcy7BzLsdUmh6VHPDMmm2iyQqFicQqCgByAOOMZP51dEUfnGbYvmFdpfHOOuM+nNedPrs5u7iSC9dRNb3nyPel3VlBKZjwFiI2nAByQDnoat3c93pqzRf2neGGa1tZbieSXc0QaXbI6k/d+XPTgdR0o5kCmuiO2iFsbmd4vJM42pMVxu4GVDd+jZAP8Ae96rzaLpdysKTadaSJAcxK0KkJzngY45rhBdRRtqAtdYD2raiQrzXrw+cBbx8C4GeQc4z97b7V3ukTm60axuCZiZIEYmYAOcqD82OM+uKaaY4yUtBJtG0y5uWuJ9PtZZ2ADSPCpY46ckZ4wPyFSnT7No4ozawFIX8yJfLGEfn5gOx5PI9TVqinYqyM+30XS7QSi3020hEybJBHAqh19Dgcj2pF0LSUsjZLptoLUtvMIgXYW9cYxn3rRoosgsigukaYgVV0+1UKxdQIVADEbSRxwSOPpUElhFpdoE0jT7OLc4LID5KkYPOVU5PTtWrUNz/qx9aLBYx/N1b/nysv8AwLf/AON1z3ii81W3Fk8MaQ3jSFYhbTtIzjHIKFAGHT9OK6+m7E8zzNi78bd2OcemaiUW1a5nODkrXOM1ubVZ/B162q20UMv2c42NyRvTqOg/P8BRezadLrPhoaU1u15G++Y220lYgvzbtv8AX3rrpYIbm4WG4ijlieNwySKGU8r1BqW00zT7Bmazsba2LcEwxKmfyFcyVpSX9dDqh7sEnqef6Xqt9c65pYXUr57fUjOrGSZMsApwyxjPl4PTnnFRaXO1v4S0y1gvr1Zrq7lBjhlVD8pbK7z9wdCepJNehRaNpcEolh060jkDbw6wqCG9c460jaJpTxNE2m2hjaTzGUwLgv8A3iMdfeqL5kedbpvEOmaPa31y8hOpzQLLv3MAF+U7hjJGetSrrOpQ6lrVwyFdUsdLEMhxkb1k++PUbSGr0RNL0+IoY7G2QrIZV2xKMOerDjr79ak+x2v2iS4FtD58i7Hk2Dcy+hPUj2oFzI4BdUvNKuANP1efVBNpktzIJZBL5UirkMPQZ4xVOK4kh1XQLyLVpdTujZXNwY5HD+W5hJwMcgEjGD/dr0a00rT9PLmzsba3Mn3zFEq7vrim2+j6ZaSrLb6daQyKSytHCqlSRgkEDjI4oDmRweg6pq5ltrltTLJc2ssk32m6SQKQpIdUHKgEcj0q74T1O8OtQ219eXUkk9uXXM6TwzY/iUjBT/drsbfStOtJpJrextoZZOHeOJVLfUgUlppGm2Ery2dhbW8jjDPFEqkj0yKAcl2MeZvO+I9rDKMpBprzQ5/vs4Ukf8BFcZFLpR+F6wMbZtTZyIUTaZt/nHGAPm6fpXpF3pa3GqWWoJIY57bcp+XIkRhyp/HBB9qWDRNKtZhNb6ZZQyjo8cCKw/ECgFJI4YxXlr4p1rWI9z3WnLaNPGp/1sbRfvV+vAYf7tV/sltefCd7p1ZnhaVojvYAZl7gHB/GvS0trdJppkgiWWbHmuEAZ8DA3HvgetRLp1itkbJbK3FqesAiXYec/dxjrQHOJBdW8aWdu88azyxgxxlgGfAycDviuc8RPax+NPDzXjQrAI7jcZiAv3RjOeOtdFLp0E1/aXbKPMtQwiwo43DB5xnp26fkKdd6ZYagyG9sra5KZ2+dEr7c9cZHFBKdmeZ6oLeeDxRJYBDpb3FoqeX/AKtnyN+3HH1x6itGEzWnjXQ9Fui5Fj9p8mYn78DRfJz6jay/8BrvDp1kbQWn2O3+zAgiHyl2ZByPlxjrTpbK1nnSeW2hkmQFUkeMFlBGCATyARQVzHC6ENKu9fsrjTTbWen6csqRFpFE10zDBJHXaOTk/wD6u0uLiG60eee3lSWJ4XKujBlPB6EVHHoOkQP5kGl2MUgBAdLZARkY9KnstPgsNPisolBhjXbggcg9eBx3PGMUCbTPNJZNOk+Hul29q1u2stJGIFi2mUPv68cjj+lXGE2n65r+twBnFvdeVdRr/HCyjJx6qcH867u20bS7OXzbXTbOCQdHigVT+YFTrZ2y+fttoR5/M2EH7zjHzevHrQPnPPbAafJ4Q06IvaJqxsZfIa8DGMJvO7H8O79fwrpfCmpWMfhXTEaZIGFqX8uWQbtqkhm5/h4Jz6VrS6Npc9tFbS6daPBF/q42hXan0GOKlbTrJyC1nbsVjMQJiU4Q9V6fd9ulANpjDd2F6v2X7RBL58JcRhwd8Z4yB3X3rn/Bs7z+G9KZyW2xTIrHuqyAD9AK3bjSrd7Z1tYoLWfyDbxTpCu6JD2HTgdcdKjt7GHTY7KytxiKCBkXPXgryfepl09V+Yk0VfEH/Hhbf9hGy/8ASqKulrmvEH/Hhbf9hGy/9Koq6Wu0xErOt/n16+c/wQxRj2+8xx9cj8h6Vo1nafzqWrEdrhF/HykP9RQhM0qKKKBhRRRQAUUUUAZupfJdaZKP4brafoyOv8yK0qzdZ4tYG9Lu3/WVR/WtKgXUKKKKBhRRRQAUUUUAcv4V/wCRQ0T/AK8IP/Ra1r1keFf+RQ0T/rwg/wDRa1r0AFFFFABRRRQAVnT/APIx2P8A163H/oUVaNZ0/wDyMdj/ANetx/6FFSlsaUvi+T/I0aKKKZmFFFFABRRRQAVQ0H/kXtN/69Yv/QRV+qGg/wDIvab/ANesX/oIrWHwsxqfGv67GhRRRVCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKztC/5F/Tf+vWL/wBBFaNZ2hf8i/pv/XrF/wCgilL4Qj8aNCnJIY2yAOmOabRWJuT/AGl/RaPtL+i1BRQBN9pf0Wj7S/otQ0UAS+exYEqmR0OKX7Q2c7V/KoaKAJftDAYCp6dKDOxxlU4ORkVFRQBN9pf0Wj7S/otQ0UATfaX9FpkkjSYyBx6UyigAqjrf/IB1H/r1k/8AQDV6qOt/8gHUf+vWT/0A0pbEz+FmhRRRUGYUUUUDCiiigAooooAKx59FZvE8OrxGPY9s1rdRuPvpncpHuDwc9jWxRQ1cTVzn7PwT4fsb2O7t7DbJG/mRqZXZEb1VScA/hS3/AIK8P6lfte3WnhpnIaTbIyrIR0LKDg/lW/RSsuwuVbWMy78PaVezSTXForvJa/Y2w7KPJ3btuAcDnuOfeqOoeFrY6bPFpUUdtdSWYsFld3ISDPIxk5IGcHrnqa6GiiyBxRBZWkVhYwWcAxDBGsaD2AwKnoopjCiiigYUUUUAFFFFABVDUP8Aj80v/r6b/wBEyVfqhqH/AB+aX/19N/6JkpMll2iiitTccjFGDDqKk+0v6LUNFAE/2l/RaPtL+i1BRQBP9pf0Wj7S/otQUUAT/aX9FpPtL+i1DRQBKJ2C7QqAegFAuGUABVA7ACoqKAJvtL+i0faX9FqGigCX7Q3Xanr0pftLnqq/lUNFAEvnkqAUTA6DFL9pf0WoaKAJvtL+i0v2l/RagooAn+0v6LR9pf0WoKKAJ/tL+i0x5mkXaQOueKjooAKKKKAGL/x/xf8AXN/5rVyqa/8AH/F/1zf+a1crifxy/rojRbIKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVUuP8Aj8h/65v/ADWrdVLj/j8h/wCub/zWk+nqvzGjN8Qf8eFt/wBhGy/9Koq6Wua8Qf8AHhbf9hGy/wDSqKulrtMgrN03/j/1f/r7X/0RFWlVGfR9MupmmuNOtJpW+88kCsxwMckj0oEy9RWb/wAI/ov/AECLD/wGT/Cj/hH9F/6BFh/4DJ/hRoGppUVxvjM6J4Z8MXV+ukaebkjybZPsyHdK33eMc45Yj0U1kfDC40jxH4XWO602ykv7IiGdmgUs6/wOeOcgYJPJKk07Bqek0Vm/8I/ov/QIsP8AwGT/AAo/4R/Rf+gRYf8AgMn+FLQNQ1v/AI8Iv+vu2/8AR6VpVnJoekxSJLFpdkkiEMrLboCpHQg44NaNAIKKKKBhRRRQAUUUUAcv4V/5FDRP+vCD/wBFrWvWR4V/5FDRP+vCD/0Wta9ABRRRQAUUUUAFZ0//ACMdj/163H/oUVaNZ0//ACMdj/163H/oUVKWxpS+L5P8jRooopmYUUUUAFFFFABWfopEenrZtxLafuGX2X7p+hXB/GtCqd1YebOLm3lMF0q7fMAyGHoy/wAQ/Ijsa0hJLRmVSLdmuhdorO8zWF4+y2Mn+19oZM/hsOPzpfP1f/nwsv8AwMb/AONVpYz5vI0KKz/P1f8A58LL/wADG/8AjVHn6v8A8+Fl/wCBjf8AxqiwX8jQorP8/V/+fCy/8DG/+NUefq//AD4WX/gY3/xqiwXNCis/z9X/AOfCy/8AAxv/AI1R5+r/APPhZf8AgY3/AMaosFzQorP8/V/+fGy/8DG/+NVXsdS1S/0+2vItPtFjuIllUNeNkBgCM/u+vNFh30vY2KKz/P1f/nwsv/Axv/jVHn6v/wA+Fl/4GN/8aosK/kaFFZ/n6v8A8+Fl/wCBjf8Axqjz9X/58LL/AMDG/wDjVFguaFFZ/n6v/wA+Fl/4GN/8ao8/V/8Anwsv/Axv/jVFguaFFZ/n6v8A8+Fl/wCBjf8AxqjztXPH2OxX3+1M2Pw8sfzosF/Im1C6+x2UkoG6TG2NB1dzwAPqcU6xtvsdhbW2c+TEsefXAA/pUENg7XCXV7MJ5kz5aqu1I8+g559yfyq9UTkrWRpTi78zCiiisjUKKKKACiiigAooooAKKKKACiiigAooooAKgvbf7XYXFtnHmxNHn0yCKnooeomrogsLn7XZxykbXxtkQ9VccMD9DVmqEti63D3NnKIZnx5gZdySY9Rxz7j9aTztWHH2Oyb3+1OM/h5Z/nWeqMtVozQorP8AP1b/AJ8bL/wMf/41R5+rf8+Nl/4GP/8AGqLiuaFFZ/n6t/z42X/gY/8A8ao8/Vv+fGy/8DH/APjVFwuaFFZ/n6t/z42X/gY//wAao8/Vv+fGy/8AAx//AI1RcLmhRWf5+rf8+Nl/4GP/APGqPP1b/nxsv/Ax/wD41RcdzQorP8/Vv+fGy/8AAx//AI1UF5qOp2UKyyWFoVaWOIBbts5d1Qf8s+mWFC1dgWrska9FZ/n6t/z42X/gY/8A8ao8/Vv+fGy/8DH/APjVFwuaFFZ/n6t/z42X/gY//wAao8/Vv+fGy/8AAx//AI1RcVzQorP8/Vv+fGy/8DH/APjVHn6t/wA+Nl/4GP8A/GqLhc0KKz/P1b/nxsv/AAMf/wCNUefq3/PjZf8AgY//AMaouFzQorP8/Vv+fGy/8DH/APjVHn6t/wA+Nl/4GP8A/GqLjuaFZ9w32jV7WFOfs26eQ+hKlFH1O5j+FBOqzfKRaWoPV0dpT+AKqP51PaWkVnGyx7mZm3O7nLOfUmhJsEm2T0UUVobBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFADF/4/4v8Arm/81q5VNf8Aj+i/65v/ADWrlcT+OX9dEaLZBRRRTAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqlx/x+Q/9c3/AJrVuqlx/wAfkP8A1zf+a0n09V+Y0ZviD/jwtv8AsI2X/pVFXS1zXiD/AI8Lb/sI2X/pVFXS12mQUUUUAFFFFAEEtrBNPDNLCjyQkmNmUEoT1I9DWJ4QsbVfDWiXy28a3T6ZbxtKFwzL5a4BPfGOM9Ocda6Ksbwj/wAiXoX/AGDrf/0WtAGzRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/wBFrWvWR4V/5FDRP+vCD/0Wta9ABRRRQAUUUUAFZ0//ACMdj/163H/oUVaNZ0//ACMdj/163H/oUVKWxpS+L5P8jRooopmYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZfhr/kVtI/68of/QBWpWX4a/5FbSP+vKH/ANAFUvhKXws1KKKKkkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArL1/wD5BsX/AF+2n/pRHWpWXr//ACDYv+v20/8ASiOqh8SKh8SNSiiipJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAI3by5opT0BKt7A/wD18VdqqyhlKsMgjBFIkzQAJLlox0frj2P+NctSPJJy6M0jqrFuimJIki5R1YeoOafUJp6jCiiimAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRTWdUGWYAepOKG0gHVTZvMu2YdI12/ieT/AEpXuTKNtvznrJ2H09aERY0Cr0H60U1zyTWyBvlRm+IP+PC2/wCwjZf+lUVdLXNeIP8Ajwtv+wjZf+lUVdLXYZBRRRQAUUUUAFY3hH/kS9C/7B1v/wCi1rZrG8I/8iXoX/YOt/8A0WtAGzRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/wCRQ0T/AK8IP/Ra1r1keFf+RQ0T/rwg/wDRa1r0AFFFFABRRRQAVnT/APIx2P8A163H/oUVaNZ0/wDyMdj/ANetx/6FFSlsaUvi+T/I0aKKKZmFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWX4a/5FbSP+vKH/ANAFalZfhr/kVtI/68of/QBVL4Sl8LNSiiipJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKy9f/wCQbF/1+2n/AKUR1qVl6/8A8g2L/r9tP/SiOqh8SKh8SNSiiipJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCNoIXOXiRj7qDTfslv/AM8Iv++BU1FZulBu7RXNLuQ/ZLf/AJ4Rf98Cj7Jb/wDPCL/vgVNRR7Gn2Qc0u5D9kt/+eEX/AHwKPslv/wA8Iv8AvgVNRR7Gn2Qc0u5D9kt/+eEX/fAo+yW//PCL/vgVNRR7Gn2Qc0u5D9kt/wDnhF/3wKPslv8A88Iv++BU1FHsafZBzS7kP2S3/wCeEX/fArN8O28MnhnSneJGdrOIszKCSSg5NbFZfhr/AJFfSP8Aryh/9AFUqNPl2RSlLl3L32S3/wCeEX/fAo+yW/8Azwi/74FTUVPsafZE80u5D9kt/wDnhF/3wKPslv8A88Iv++BU1FHsafZBzS7kP2S3/wCeEX/fAo+yW/8Azwi/74FTUUexp9kHNLuQ/ZLf/nhF/wB8Cj7Jb/8APCL/AL4FTUUexp9kHNLuQ/ZLf/nhF/3wKVbeBTlYYwfZRUtFCpQ/lDnl3CiiitCTL8Qf8eFt/wBhGy/9Koq6Wua8Qf8AHhbf9hGy/wDSqKuloAKKKKACiiigArG8I/8AIl6F/wBg63/9FrWzWN4R/wCRL0L/ALB1v/6LWgDZooooAKKKKACiiigAooooAKKKKAOX8K/8ihon/XhB/wCi1rXrI8K/8ihon/XhB/6LWtegAooooAKKKKACs6f/AJGOx/69bj/0KKtGs6f/AJGOx/69bj/0KKlLY0pfF8n+Ro0UUUzMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsvw1/yK2kf9eUP/oArUrL8Nf8AIraR/wBeUP8A6AKpfCUvhZqUUUVJIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAyY3K20zWao90I2MKucKXwcA+2cVysfiW8062u57q8vWuoLCa4ew1C1WIs6KDmJ0UBlByDy3BBrqZ7WC+tprS5UNBPG0Ui5xlWBBGfoaqReHIGlRtQ1G51JY4nhjS58vCq42tnaq7iRxk54JrSDilqUmupGbbVrCBLx9ea4JjYzRSxRhCdhIMW1QQQQOCWyM555rmZ/Fmsr8P0kS6A1sZ8yfy14VY/O37cY5QoOnV66i38MwRGFbjVb27it0ZLaKZ0xCCpTIKqCxCkgFieCfrUL+DdJdZQZ5x5mnjTyRIvCAAbhxjeQFBPTCjirjOC+LUaaLuv3l1A2m2dpN9nkv7ryDPtDGNRG7kgHI3EJgZBHPQ1Sun1TR5beI6s11FNdwIvmxoJVVmIYHaoBU8YOARzzWtqunW2rWyQyzPE8ciywzRMA8Tjoy5BGeo5BBBIqlF4dtvM8+5v7m6ujNFK1xKyBj5ZJVcKoAUFm4AzyeaiLjYSaMM/EO1s7SEzGNylslxcG4uo45SGzwi4HmNhScAKOnc4rV/wCEpuDftGumf6It79iNwZxnzCMqQuPukkAnORnoaIvCdrbKiWmqXttH5KQzCKRAZlUkjJ25U8kZUqcfhi8dDsmDDzpOb0Xv3l++McdPu8fX3qpOnfRDbiV9G1ueTwmdX1ZYoTGkkkhjbI2qTz0HYVzdr4sv5fCetyPqUMmoWqRzrLbBHEaSAELgAglW3ryCTtBPWupGg2f9iHSWuZmtTL5mCy5279+zOOVPQ98E803UfDmnalK8jyPCZLc27iFlUMpZWBOQeQV4/wB40KUE3dCTRz1zrWrW2n6vPZ3moz20FiZEudQsRA6TZ4CgxoGGMk5U4wOea6nWr2W1jtIYW2y3dykCtjJUHLMRnvtVse9TapY22raXc6fPKyxXCGNjGwDAH0zmq2uwJcW1rMs0SzWt1FNF5jhQzbtu3PqwYqPcipunYLpmXbPq2sW15qMGsNZmK5migg8qMxARSMn7zK7ju2knDDAIx72R4mk+1hvsIOnfaxZG6E3zeaTtyEx9zf8ALndnPbHNE/hi1nlulXUbqGyvJDJc2UbJ5crH73JUsA3cBhnn1OZR4fthqJuBfT/Z/tH2r7HlPKEuPvfd3dfmxuxnmm3FhoZMvjK/k0l7mPSlgM1jNc2jvcBsmMDIYBeOuR1zjnFWbjxc1hNYw3lvaq04hDgXY8wtIwX5ExllBIJPHtnFXD4a042VraNPKYre2ltly65ZJAA2eOuBxjFVpPCVtKJB/a16BKYXkwYvneLbsYnZ22LwPl46cmnel2H7pXXxXeKZ4rbTnvZIvtUrNLOsYCRTvHgYXrx8ox06nPJS5+IFhBfCECDylEPmmS5VJR5gVhsjPL4VlJ5HfGSK1Lfw7YW0k8iTylplnRsuvAlkaRscdixx7evWoovDNtbzq1tqd5BEREJoY5EAmMahVLHbuB2qoO0jIAoTp9UHulvRtXm1ZrxmsjBBBcSW6SNIGMpR2RiBjgfKOvckdsnn7XVtUi1WGLUry6tLqS4ZPs09qv2WZcttWOVVyGI2kbmyTnjtXU6fZ2+mwPDDIWV55ZzvYE7pHZ2HHbLHHtWVB4YtoTBEdRupLG2mE0FmzJsRgcqMhdxCnkAt2HWpUo6iTRmr4yu7Pw7a3+oW1mJZBKzbrwRghDgKuVyznnAAxxyRmpZfFtza3GpTS20Bsovs/kO0xQL5gzukO07V9TzirB8IWezYmpXkaGKSBgrR5MTsWKZKZAyTyMH1J4xOvhuKIE2+rXsMpjiQujR8mMEBiCuDkHBB49geau9PsO8RkWtzzXWlO6KkOoRzRmNZFkVZEBZWV16qVV/w28A5FadZtroUdlc2Yil3W1os8u5yu6SaUkk4AAAAL8AAfMMdK0qyna+hLt0CiiipEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZfhr/kVtI/68of/QBWpWX4a/5FbSP+vKH/ANAFUvhKXws1KKKKkkKKKKACiiigAooooAKKKKACiiigDL8Qf8eFt/2EbL/0qirpa5rxB/x4W3/YRsv/AEqirpaACiiigAooooAKxvCP/Il6F/2Drf8A9FrWzWN4R/5EvQv+wdb/APotaANmiiigAooooAKKKKACiiigAooooA5fwr/yKGif9eEH/ota16yPCv8AyKGif9eEH/ota16ACiiigAooooAKzp/+Rjsf+vW4/wDQoq0azp/+Rjsf+vW4/wDQoqUtjSl8Xyf5GjRRRTMwooooAKKKKACiiigAooooAKKKKACiiigAooooAKy/DX/IraR/15Q/+gCtSsvw1/yK2kf9eUP/AKAKpfCUvhZqUUUVJIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXr/wDyDYv+v20/9KI61Ky9f/5BsX/X7af+lEdVD4kVD4kalFFFSSFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZfhr/AJFbSP8Aryh/9AFalZfhr/kVtI/68of/AEAVS+EpfCzUoooqSQooooAKKKKACiiigAooooAKKKKAMvxB/wAeFt/2EbL/ANKoq6Wua8Qf8eFt/wBhGy/9Koq6WgAooooAKKKKACsbwj/yJehf9g63/wDRa1s1jeEf+RL0L/sHW/8A6LWgDZooooAKKKKACiiigAooooAKKKKAOX8K/wDIoaJ/14Qf+i1rXrI8K/8AIoaJ/wBeEH/ota16ACiiigAooooAKzp/+Rjsf+vW4/8AQoq0azp/+Rjsf+vW4/8AQoqUtjSl8Xyf5GjRRRTMwooooAKKKKACiiigAooooAKKKKACiiigAooooAKy/DX/ACK2kf8AXlD/AOgCtSsvw1/yK2kf9eUP/oAql8JS+FmpRRRUkhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRVO+1GGx2IVkmnkz5UEQy7464zwAO5JAHrTSbdkNJt2RcorK+1623K6XZqp6CS+YN+IERH60fadc/6Bmn/wDge/8A8ZqvZyK9nI1aKyvtOuf9AzT/APwPf/4zR9p1z/oGaf8A+B7/APxmj2cg9mzVorK+065/0DNP/wDA9/8A4zR9p1z/AKBmn/8Age//AMZo9nIPZs1aKyvtOuf9AzT/APwPf/4zR9p1z/oGaf8A+B7/APxmj2cg9mzVrL1//kGxf9ftp/6UR0n2nXP+gZp3/ge//wAZrh/GV5rf9u6dFaWyrfMBIYLWdplkCsCjOpRRwwODz0PTFaUqLlOxpSpNyPTaKw7K88SPaRNdaVpyzlfnH21lwfoI2A/76NT/AGnXP+gZp3/ge/8A8ZqHTlch05XNWisr7Trn/QM0/wD8D3/+M0fadc/6Bmn/APge/wD8ZpezkL2bNWisr7Trn/QM0/8A8D3/APjNH2nXP+gZp/8A4Hv/APGaPZyD2bNWisr7Trn/AEDNP/8AA9//AIzR9p1z/oGaf/4Hv/8AGaPZyD2bNWisr7Trn/QM0/8A8D3/APjNH2nXP+gZp/8A4Hv/APGaPZyD2bNWisk3usxDdLpNu6jqLe8LP+AZFH61dsr6C/hMkDHKttdHG1kburA9DScGlcTg1qWaKKKkkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKy/DX/IraR/15Q/+gCtSsvw1/yK2kf9eUP/AKAKpfCUvhZqUUUVJIUUUUAFFFFABRRRQAUUUUAFFFFAGX4g/wCPC2/7CNl/6VRV0tc14g/48Lb/ALCNl/6VRV0tABRRRQAUUUUAFY3hH/kS9C/7B1v/AOi1rZrG8I/8iXoX/YOt/wD0WtAGzRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/0Wta9ZHhX/AJFDRP8Arwg/9FrWvQAUUUUAFFFFABWdP/yMdj/163H/AKFFWjWdP/yMdj/163H/AKFFSlsaUvi+T/I0aKKKZmFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWX4a/wCRW0j/AK8of/QBWpWX4a/5FbSP+vKH/wBAFV9kpfCzUoooqSQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArI0lftFxfag/zSSXEkKE/wRxsUAHtuVm+rVr1k6D/AMg6X/r9u/8A0okrSGzZpDZmnRRRTGFFFFABRRRQAUUUUAFNWONZHdUUO+NzActjpk96dRQAUUUUAFFFFABRRRQAUUUUAFFFFABWXcr9l1+xuI+PtZa2lA6MQjOrH3Gxh/wKtSszU/8AkJ6J/wBfjf8ApPNVIpdTWooorAwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsvw1/wAitpH/AF5Q/wDoArUrL8Nf8itpH/XlD/6AKpfCUvhZqUUUVJIUUUUAFFFFABRRRQAUUUUAFFFFAGX4g/48Lb/sI2X/AKVRV0tc14g/48Lb/sI2X/pVFXS0AFFFFABRRRQAVjeEf+RL0L/sHW//AKLWtmsbwj/yJehf9g63/wDRa0AbNFFFABRRRQAUUUUAFFFFABRRRQBy/hX/AJFDRP8Arwg/9FrWvWR4V/5FDRP+vCD/ANFrWvQAUUUUAFFFFABWdP8A8jHY/wDXrcf+hRVo1nT/APIx2P8A163H/oUVKWxpS+L5P8jRooopmYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU2SSKCCSe4nighjGXklcKqj1JPAoAdWX4a/5FfSP+vKH/wBAFWotV0uezmvItVsXtYf9bMJ12J/vHoPxpmnQJpOj6ZZXV3bI4RLeImTAkYLgBc4ySBnir6WZX2Wi7RVe+1DTtLaNdQ1KytGkBKC4nVCwHXGcZpLnUtNs4IZ7rU7GCGbmKSWdVWT/AHSTg/hU2YrFmii2MV7bpcWtxDPC/KyROGVvoRwagtr/AE+9uXtrXUbOeePl4oplZl+oHNFmInoqb7M/qtH2Z/VaQENFPljEMTyyyIkaKWZmbAUDqSfSo4XhuJJo4LmCWSFgsqpICY2xnDAdDj1osAtFFq0N9bJcWlzBPA+dssUgdWwcHBHB5BFSCElmUOhZeoB5FAEdFTfZn9VpkSLcRLLDLHJGwyro2QfoRQAyipFhLFgrodpwcHofSmlVEjRebH5irvKbvmx649ODQA2iiigAooooAKKKKACiiigAooooAKKKKACsnQf+QdL/ANft3/6USVrVk6D/AMg6X/r9u/8A0okrSGzNIbM06KKKYwooooAKK4fxxr1zpOuaJbLrD6XZXKzm4mSBZTlQu3gqe5xx61Q0jx1Pa6Zq15d3R1ayhuo7awuBGsLzuw5UjgKBxyQOM1uqEnFSXUrldrno9FcZF8Q7U6XfTz2LpfWkscJtIpkl8x5PubXXgg889sGppvGk9jp08mo6DeWt6k8dvFbFgwnkfO0JIPlPQ59Kn2Mw5WdbRXFzePzY6dqkmo6RLbX+nGIy2nnK+5ZGAVlcDB6+lami+JZdS1i70q80ubT7uCNZgkkivvjY4ByvQ+1J0ppXaFZnQUV594t1zUrDxE8N1qN7pOlCBWt7q2tBKjSd/MJBIx6CrL+OWsbDTIALbV9QuYGmeSCdYIiikjdufuSMbfUHpVewk0mh8rO4orjE+ICXcmmR6ZpNxePqFuZo1EiqUKttYNngYwefb3qdPGyPEi/2e4vG1Q6abfzRkMOS+cfdxz0pexmugcrOsorh7PxlLBpzfuLjUL6fU5rO2gLIhO0/3sABQO5yanu/HbWlpaiXRbmHUrmaSFbS5kWEfIAWbzG+UryMEde1HsZ3sHKzsaKyfDmvQeI9KF7DG0TLI0UsTMGKOvUZHB7c+9a1Q007MWwUUUVIgrM1P/kJaJ/1+N/6TzVp1ja9eW9jc6Pc3UyQwR3jFpHOAP3Ev9aqKuVFXZuUVxsHxD02/wBbSytXiitFy0t5duI1IHZQcEkkjrjHJwcVv/8ACS6F/wBBrTv/AAKT/GolSnHRoiVKcd0adFZn/CS6F/0GtO/8Ck/xo/4SXQv+g1p3/gUn+NTyS7E8kuxp0Vmf8JLoX/Qa07/wKT/Gj/hJdC/6DWnf+BSf40ckuwckuxp0Vmf8JLoX/Qa07/wKT/Gj/hJdC/6DWnf+BSf40ckuwckuxp0Vmf8ACS6F/wBBrTv/AAKT/Gj/AISXQv8AoNad/wCBSf40ckuwckuxp0Vmf8JLoX/Qa07/AMCk/wAaP+El0L/oNad/4FJ/jRyS7ByS7GnRWZ/wkuhf9BrTv/ApP8aP+El0L/oNad/4FJ/jRyS7ByS7GnV7y0/uL+Vc9/wkuhf9BrTv/ApP8a6MHNJprcTTW4nlp/cX8qPLT+4v5U6ikIb5af3F/KmSKqRsyxBmAJCgDk+lS1HNGJoXi3Om9Su5DhhkdQexoA43SvE91eYd30+aUQNLPpqxNDc27Bc7cO3z8jaThR36Vch8X2x0y2uptNudxtEvLoRIrC2jbOGb5uQdrEBcnAzgVJH4cvp7iwfU9ShuVsN3lOlsUlctG0eXYuc8MSQAMnB9qrr4RvYrH7JFqsKpNYpYXTfZTl0TcFZPn+VtrEHO4dDjjFbP2bL0L6+I7OV71bexu7j7LIImaOEEO5Iwqknnhgc9AOSRSDxLZvbxPFY3c07ySRm1jjUyIYzh884wOOhOcjGc1Fc+FvN065tIrqMLNeC52SQ7oyuAPLdQw3Lx6jt9Dl/8I/eeHjBcWUpeVXnwbawDRokuwlPLDg43IMEHjGDnrQlTfULI0/8AhMNLa1iuYba6mha3F1K0cIPkQkkB3BOf4W4GT8p4qXxPq50iws54J7K3We5SJri6TdGikMdxwy+g71hW/gJ5rCyec2QuTZR29wLyyS5ZCpY5Qk4DfOQeCDgHHHPV6hpS3w09VkES2dyk4ATO4KpG3tjr+nSlJQUtBOyZg6b4sjb7d581pqUUDwxwXGmxHbPI+f3aqWYbhgEndjDc4wavHxTZboIo9PvJbuVpU+ypEvmI0e0sGywUcMCDnBB4PIzDrHg+LVb66uvNgBm+zuIprYSR+ZEX5YZG4Mr7SODwDmqcfhvUdO1HTP7NksoGRbl5ZIrEJApfywF2KwPReCWJ+Xk9qq1N/wBeQ/dZoy+LNNSFZorW5niFut1O0UQ/0eJs4ZwSD/C3ABPynioL3xbDE7JY6Zc3Xl3kVrJIEUJudgOCWGThh+YzimDwdPBaSWtnqaxxXNoLW8aSDc0nLkupDAKx8xuoI6enN2Tw0RYzwQXSxs1+l7GxiyqFWQhSNwyPkxnI60v3aF7pZsdatr+/ktobO42I8kYuTGDEzo21lyCSCDn7wGccZrV8tP7i/lXP2XhuW38Qtqklzbk7pOYbby5JVbosrBsPt7fKDwPfPR1nO32RO3Qb5af3F/Kjy0/uL+VOoqRDPLT+4v5VFcKqxjCgc9hU9UdTvrSwt1lvLqG3jLhQ80gQE4PGT34P5ULULX2G0Vmf8JLoX/Qa07/wKT/Gk/4STQu2s6eT6C5Qk/hmq5JdiuSXY1CQoJJAA5JNZvh1WTwzpSsMMLOIH67BVa71E6pG9hpiPL5y7ZLnbiOJG4LBiMM2M4Azz1xWzFGkMSRRjCIoVR6AdKbTUbMbVo2Y6iiioICiiigAooooAKKKKACiiigAooooAy/EH/Hhbf8AYRsv/SqKulrmvEH/AB4W3/YRsv8A0qirpaACiiigAooooAKxvCP/ACJehf8AYOt//Ra1s1jeEf8AkS9C/wCwdb/+i1oA2aKKKACiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf8Aota16yPCv/IoaJ/14Qf+i1rXoAKKKKACiiigArOn/wCRjsf+vW4/9CirRrOn/wCRjsf+vW4/9CipS2NKXxfJ/kaNFFFMzCiiigAooooAKKKKACiiigAooooAKKKKACsTxGywNpN3cru0+2v1kuiR8qL5bhXb/ZVyh9uD2rbqSKXy8/LnPvTi7O40zg/Es1nrN9e3enyRXNmlglvdTRMHjd2njKJkcEgB8+gYetRAy3OoaXbThz/Yd5DZbm/jdpOG+vlJGc/9NDXoi3CqMLGAPQGl+1f7H61qq1lZIrmOd1XUrHS/G9hNqF5b2sTadOivPIEBPmRHAJ6ng8VzbTpZXenXi6hDpVnPe3sttLdIAgjYL0DEYDMGYdPvV6N9q/2P1o+0/wCx+tKNS3QSdjnPCLD/AIR/UTlruM3U7i4hTb9r3fMWQZwOSVGDjK5rD0uSKV9I0yx1S3v7d4XggKoEvNOXyWAZipwMYCnIU5I6mu/+1f7H60xpQUdQhUuOWU4P16daSqavTcOY4aHUdT1iCGeS7ubXF1a6dKsTlf3q5M5H1LBc/wCxTjdmC7Ww1LWLq20qG5uo/tD3TI5dfLaNGkzk8PIQCedoBzXY2MUGnWi21vGdgZmJZ9xZmJZiSepJJJ+tWDcg9U/Wn7RX0Wgcxg6rK58LaYHllmSW4sklllTY7qZUyWXtu4BH+0a5ueSew1jWmttyvq922nBlH3Ztsflt+CvKT/uiu8vFhv7SW2ni3RyLtOGwfqD2I6g9jUwucD7mfxojU5QUrHl6XU+nWNrYxXUdjp8S3hhZ75rUGQXMgwCqNvKjbhO+ehrRluzY3GpyXd1Kl9dJZCQrdNAg3L8zZYZjTIIyFyM4GCa78zqcZjBwcjJoNwCMGMHPvVe2T6D5jz6y1j7TDawalrL2tglxdI1xFeHllKmJDKcFhtZ2BP3go61mzazcWfhWzEF3JFc22li4j8y6MG9iX5WNVJlb5OVOFAI9a9TM4PBjHXPWj7QCc+WM/WhVV2DmXY4KW8trJtXSO8kButXXczag0KBWgDqWk5MaNggFRk4AHHSfSb+7vIdDuElSe8WS/t33Sk7o1LbQzYz1SLkjPOcV232gEY8sfnVdo4XvBdmPMwiMSktwoJBOB74XP+6Kn2itsHMZv2jXf+gbp3/ge/8A8Zo+0a7/ANA3Tv8AwPf/AOM1p0VHMuwuZdjM+0a7/wBA3Tv/AAPf/wCM0faNd/6Bunf+B7//ABmtOijmXYOZdjM+0a7/ANA3Tv8AwPf/AOM0faNd/wCgbp3/AIHv/wDGa06KOZdg5l2Mz7Rrv/QN07/wPf8A+M0faNd/6Bunf+B7/wDxmtOijmXYOZdjM+0a7/0DdO/8D3/+M0faNd/6Bunf+B7/APxmtOijmXYOZdjM+0a7/wBA3Tv/AAPf/wCM0faNd/6Bunf+B7//ABmtOinzLsHMux5jbat4pXxffW2j26z2yTYmgMhkgibjcA7BSvOeB3zwa7Xw4ZG0ljKqrIbu63KrZAPnvkA4GR74Fa8cUcMYjiRUQdFUYA/CsvQf+QdL/wBft3/6USVtKoprRWsbuoprRWNOiiiszMKKKKAMe/0L7b4l0nWPtOz+z1mHlbM+Z5i7eueMfQ1iah4Aiv5tXk+3bPt1zDdQgQAiCSMEZIJwwOTkYFdnRWkaso7Md2jjW8CvPo1zbXGoxLeSTxzxT21mkSQsn3cIPvdTnJ79qkufB99qOnSrqOuyzagbmO6t50i2x27oMLtjzjuc88111FP20h8zOJn8BXGoWWqnUdY87UNR8kNcLbhUjSNgwVUDd8dc/wD19+LQ/K8WXGufaM+darbeTs6bWzu3Z/TFa9FJ1ZPRsV2c5qmgavNq0t/pWvPZieMRzW80InjOOAygkbTj86xz8No7a307+z76NLm1ieJ5Lm1WZJQzFidhIAIJJFd3RTVaaVkPmZzeneE/sGradf8A20SG0tHtmTyFTzCzbi3y4C89sfjSJ4QhXxs3iL7UdpUkWuz5RKVCGTOf7oxjHvmulope1lvcV2cYfAkkVtG1rqvlX0GoS30E5gyq7/vIV3cjHfIpb3wPc3ttZSz6wbjVLWaSUT3NuJI2DgBk8snAXgYGeOa7Kin7aY+ZmZoWknRtMW1edZ5SxeSRIViDE+irwB0HfpWnRRWbbbuxBRRRSEFZeqqr6hoquoZWvHBUjII+zzVqVman/wAhPRP+vxv/AEnmqkVEhtfCmnadrI1PTVNo7KVlij/1cgP+z/CcgYxgcdK3KKKylOUt2ZObluwoooqSQooooAKKKKACiiigAooooAKKKKACsfxZq97pjKLOfy82F5N9xT88aKUPI7En2PetisdfCen7Z45L68kgeCe3iiYri3SY5faQuSfQsTgDFXBpO8hrzMi88Taqnh7S0iuAupi48u8fy1OUjdUdsEYG4vGenAfirlxrGqx+Kv8AhG1vE33Di5ju8Juig5LRbcYL5UgEj7pJPK86EnhfSpLm8nM1wHuxCHwwwvllSCoxwW2Ju9do6U+Tw9p0kUwa4uDcS3YvPtWR5qyD7uDtwAFG0DGMZBzkmtOen2Kuiv4q1i+0nUdHe2mCWpkd7xCoO6IbQxyRkbQxbj+7Wfc+L57DxBq01xKDpNtAEhiwq7pRIiFi56fO5Tk4G3NdHqOm2OqTRPcs7COOWLYPussi7WB49KzV8JaUtklt9ouzsg8kSFhv3eYJfMJ2/f3gNnpntSjKFkmhJq2pTj8ZXF/LZxWMVk7/AG9Le58q7Ese1o2cFHC89D1AOVx3zTl8ZP8AZrfUbqyntrV7e4mWNZFcyLGF5I25BJJC8j39tMaJE0cRuNVvp547lblZnK5BAK7QoXaFwSMAdyc55preG9LksbazkkneGC2ltgCRlkkADZwOvHBGKL0+w7xIbzxNe6baeZqGlR2sjSrGryXf7gBlY5aXb8uNu0/L1ZeTnNXb3WJYPC0mqrAEn8jckRcON54Ubl4IyRyOoqD+xD5X/Id1JrjerfaGKElQpXaV2bCuGOflznnOQKfNotofC0uhwSsiGIpHIwyVYnIY4AH3ucDA9MUvc0FoVo/7R1TVr+yTV7i1j04RRBoY4y8zsgcu25SMcgAADkN+EeqeKpPD1lbtf/Y52WDzJ5hcCLzMcHykOSzcE44A9asz6R9ruPt8eoXWm3c8Kx3QtChEmAcffQ8jJAYYOPwxBd+EtNuIHt4ru6tbeSyWxkjhK/PEu7AyylgfnbOCM9807wvrsGnUlbxPMt/Orabixt7xLKW5MwyHfYFITHK5dQTkYz35qsfHFvDdXkNzDEBBBNOFguVlkxGQNroB8jNuGBk++KLTw4Wv7ya9v7lrd75bpbcFdkhRU2s2FyDuTOAQOBxTo/CGnLHHDJf3ktvFby2yQvsCiKQDcvCAk8Kck5yOvXJ+76j90lk1rVEuLKC601rWeW58tFS4V4pcwyuAXKZGCnOACDjkjINLS/GNw+gQXF/Zqb17G2uY1jk+W4aVtigcfKd23I5xvHWtSDRIEuLa4uNSvbue3nEyyTlecRvGFIVQMYkY8AEnkntWfH4bii1HQoleR7LSImCSyuNzg4CRkBRkLtU5P91epyaE4bWFobXiO7nsfDGrXlq+y4gs5pYnwDtZUJBweDyB1qrqWp3NpqGirGzNFP5pmREDGQLEzAD3yB0q5DAraW1nfTm6EgdZC/VlYn5TgDoDjPHSqFp4ft4JY3n1S/uxDA0FuJWUeSrAAkFFUlsADcST+uYjyrcFYr2fi83ej3OoLa2uyLZtK36mMbjgiRiAYyv8QIPtmltfFr6jb240+xjubuVpg0a3I8sLEQGZXx8wJZMcDO7nFB8L2rl5ZtTvZbstCy3LLHvHlFinATafvtkkE/kMVrrw+9iY59OuL2e48yZ2mE0aSr5gXcBujKlSygnjI429MVa9mx+6QS/EiyihjmeCKIC2S5nSe7WORVbPyop5kYAEkDHYZJOK3ba+ll1LUrCVi/2d45YnIx+7kUkD3wyuPpj61mad4VjtNPtYv7Tu7aX7NFBdLbOAJtmf4iu4feI3KQSPwxq29syX2oXkhG+5kQIo/hjRcDPuSWP4iifs9eUTt0LNFFFYkhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBl+IP+PC2/7CNl/wClUVdLXNeIP+PC2/7CNl/6VRV0tABRRRQAUUUUAFY3hH/kS9C/7B1v/wCi1rZrG8I/8iXoX/YOt/8A0WtAGzRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/wCRQ0T/AK8IP/Ra1r1keFf+RQ0T/rwg/wDRa1r0AFFFFABRRRQAVnT/APIx2P8A163H/oUVaNZ0/wDyMdj/ANetx/6FFSlsaUvi+T/I0aKKKZmFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFZOg/8g6X/r9u/wD0okrWrH09xZahdabLhS8r3Nvn/lojnc2PcMWyPQg960hqmaQ2aNWiiimMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKzNT/wCQnon/AF+P/wCk81adZTONQ16BIiGi08tJK46CVlKqv12sxPplfWqXcpdWbFFFFYGAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAZfiD/jwtv8AsI2X/pVFXS1zXiD/AI8Lb/sI2X/pVFXS0AFFFFABRRRQAVjeEf8AkS9C/wCwdb/+i1rZrG8I/wDIl6F/2Drf/wBFrQBs0UUUAFFFFABRRRQAUUUUAFFFFAHL+Ff+RQ0T/rwg/wDRa1r1keFf+RQ0T/rwg/8ARa1r0AFFFFABRRRQAVnT/wDIx2P/AF63H/oUVaNZ0/8AyMdj/wBetx/6FFSlsaUvi+T/ACNGiiimZhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVe8sbe/h8q5j3qDuUglWU+qsOVPuKsUU02tUNNrVGV/ZFyvEeuaii9hiFsfi0ZJ/E0v9k3n/Qf1H/v3b//ABqtSiq55Fe0Zlf2Tef9B/Uf+/dv/wDGqP7JvP8AoP6j/wB+7f8A+NVq0Uc7D2kjK/sm8/6D+o/9+7f/AONUf2Tef9B/Uf8Av3b/APxqtWij2jBTZgaZZ399pVpdya7fq80KSMFjt8AkAnGY+nNWv7JvP+g/qP8A37t//jVSeH/+Rc0z/r1j/wDQRWjSjUlYupNqbSMr+ybz/oP6j/37t/8A41R/ZN5/0H9R/wC/dv8A/Gq1aKfOyPaSMr+ybz/oP6j/AN+7f/41R/ZN5/0H9R/792//AMarVoo52HtJGV/ZN5/0H9R/792//wAao/sm8/6D+o/9+7f/AONVq0Uc7D2kjK/sm8/6D+o/9+7f/wCNUf2Tef8AQf1H/v3b/wDxqtWijnYe0kc5ottqGpaDp99Nrt8stzbRzOEjtwoLKCcZi6c1e/sm8/6D+o/9+7f/AONU3wr/AMihon/XhB/6LWtej2jD2kjK/sm8/wCg/qP/AH7t/wD41R/ZN5/0H9R/792//wAarVoo52HtJGUdGlkG241jUZoz1XMcefxRFb8jWhbW0FnAsFvEsUa9FUYH/wCupaKTk3oJybCiiipJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDL8Qf8AHhbf9hGy/wDSqKulrmvEH/Hhbf8AYRsv/SqKuloAKKKKACiiigArG8I/8iXoX/YOt/8A0WtbNY3hH/kS9C/7B1v/AOi1oA2aKKKACiiigAooooAKKKKACiiigDl/Cv8AyKGif9eEH/ota16yPCv/ACKGif8AXhB/6LWtegAooooAKKKKACs6f/kYrE/9OtwPx3Rf4Vo1namJomt76FDIbdj5karuZo2GGC+44OO+MVMtjSl8Ro0VBbXltdrut545R32sCR9R2qequQ4taMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKKKAswooooCzCiiigLMKKQkAEk4A6mszUNRjkWSxs3E15Iu0KnzCMNxvbHQDr6ntSbsVCDk9B+gAjw7poIwRaxZH/AAEVo1HBCtvbxwp9yNQq/QDFSULYU3eTaCiiimSFFFFABRRRQAUUUUAZHhX/AJFHRh3FjAD7EIMitesDS72PSC+kajJHAYnP2WVxsjmiOSqqTwWUcEdeM963gQyhgQQeQR3oAWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBQC3ABP0pfLf8AuN+Vc743nntvCdxJbNciQ3FqmLWYxSsGuYlZVcMu0sCRnI69RXOt4hvPDWqanILHWLWKOxhMVhql29400sk4iWRSrykKpYBlDZORhfUA9E8t/wC435UeW/8Acb8q5K28W65cyQ6alpHHf3F55EN5c2FxbwMnlNKzeVJtckbCuA2DkHPUU+68T+IYotQKQaZHJo9kLu9DF3W4O6X5Y2DDZ8sRO5g2C2McE0AdV5b/ANxvyo8t/wC435Vy3/CV6y2oSzrBZLpcWq2+nsjq/nsJViw2c7QVaUcYOQD0xzc162/tHxtoeny3V9FavY3szpa3ktvudXtwpJjZScB2xn1NAG75b/3G/Kjy3/uN+VcZF4h1HTI7zTYr5J3g1SW2t5rmCW7leJYo3ICRfM5VpChYngLk5PV//CcalLb6Le/Z7ezsr20t53luIZXjZ3Yho/NTiIgYIZwQ27HGDQB2Hlv/AHG/Kjy3/uN+Vcbo+ua5b3Ea3T282nXmtajYxlmczpte4dW3E42jyigXHAwQe1YPh7UtT02y8KaveRaxFa3Fnuurm41R7pLxzbF1AiZ22FmBYEAYxt70AeoeW/8Acb8qPLf+435Vya+LdYs7aKXUhpi/bdNa/tigdVgIaNfLkOWL/wCuTBUDJBAHIqGHxlrl0kdnawWjX7asNP8ANuLWa3Qo1q0+/wApzvUjGME8gcEZyADsvLf+435UeW/9xvyrkP7d1vUNZ0G43W0Ok3Gs3FqiRM6ysIo7hfn5wwZoy23Hy4Xqel/X9Zfwx4ibUbmaVtNudOl/dFyVWeAGQBR0DOhfp18sUAdB5b/3G/Kjy3/uN+VcDF4g1TwvbGxujNd6o0NjG0kpmuAJpjOzny1JJVdjYCAEgKCcAYuP451iCzDTacizSfaLa3aW2mtxPcjy/JwkmGVHDsCDkgocE0AdiVZeoI+opKxfD3iKbxJBJcmFI4I44FwM7hM0SySKfZd6D6hq2qACiiigAooooAKKKKAMvxB/x4W3/YRsv/SqKulrmvEH/Hhbf9hGy/8ASqKuloAKKKKACiimswVSzEAAZJNADqxvCYK+DdDUggjT4AQe37tai1fWIpUl0nTZBc6lMmwLF8wgDceZIR91RnPUE4wK2LW2SztIbaLPlwxrGufQDA/lQBNRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/ANFrWvWR4V/5FDRP+vCD/wBFrWvQAUUUUAFFFFABRRRQBVuNNsbsk3NnbzE9TJGG/mKg/wCEf0b/AKBVl/4Dr/hWjRSsi1UmtmZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZ3/CP6N/0CrL/wHX/Cj/hH9G/6BVl/4Dr/AIVo0UcqD2s+5nf8I/o3/QKsv/Adf8KP+Ef0b/oFWX/gOv8AhWjRRyoPaz7md/wj+jf9Aqy/8B1/wo/4R/Rv+gVZf+A6/wCFaNFHKg9rPuZw0DR1II0qyBHQ+Qv+FXYoIYE2QxJGo7IoA/SpKKLITnJ6NhRRRTJCiiigAooooAKKKKACiiigBksUc8ZjljSRD1VwCD+BrNbwx4fdiz6HpjMepNpGT/KtWigDJ/4RXw7/ANAHS/8AwDj/AMKP+EV8O/8AQB0v/wAA4/8ACtaigDJ/4RXw7/0AdL/8A4/8KP8AhFfDv/QB0v8A8A4/8K1qKAMn/hFfDv8A0AdL/wDAOP8Awo/4RXw7/wBAHS//AADj/wAK1qKAMn/hFfDv/QB0v/wDj/wo/wCEV8O/9AHS/wDwDj/wrWooAyf+EV8O/wDQB0v/AMA4/wDCj/hFfDv/AEAdL/8AAOP/AArWooAyf+EV8O/9AHS//AOP/Cj/AIRXw7/0AdL/APAOP/CtaigDJ/4RXw7/ANAHS/8AwDj/AMKP+EV8O/8AQB0v/wAA4/8ACtaigDJ/4RXw7/0AdL/8A4/8KP8AhFfDv/QB0v8A8A4/8K1qKAMn/hFfDv8A0AdL/wDAOP8Awo/4RXw7/wBAHS//AADj/wAK1qKAMn/hFfDv/QB0v/wDj/wo/wCEV8O/9AHS/wDwDj/wrWooAyf+EV8O/wDQB0v/AMA4/wDCj/hFfDv/AEAdL/8AAOP/AArWooAyf+EV8O/9AHS//AOP/Cj/AIRXw7/0AdL/APAOP/CtaigDJ/4RXw7/ANAHS/8AwDj/AMKP+EV8O/8AQB0v/wAA4/8ACtaigDJ/4RXw7/0AdL/8A4/8KP8AhFfDv/QB0v8A8A4/8K1qKAMn/hFfDv8A0AdL/wDAOP8Awo/4RXw7/wBAHS//AADj/wAK1qKAMn/hFfDv/QB0v/wDj/wo/wCEV8O/9AHS/wDwDj/wrWooAzI/DHh8BkGkWUKsUYmCERMSjrIvK4OAyKcdDjmrmo6Lo+rytLfW/mu1u1sTvdf3ZZWI4I53KpDdQRwRU9FAGcPC2hfYzblbliZxcm4a7mM/mBdobzd2/IX5euMEjoabN4S8PTpCjW8qxxw+QUjuJUWWPcW2SAN+8GSx+bOdzepzp0UARPpOkyedugyJruO9k+d+Zk2bW69vLTjpx05NR6tomla1c21zeG5E9srpFJbXc1uyq+0sMxspIOxeDnpVmigCg3hnQTbWkCW8kCWu/wAo288kTAOcuCysCwYgE5JyRk81Ang7w5GkEccE6QwxLCIlupgjxqxZUdd2HVSxwGzgHHTitaigCFdH0hUgQQfLBdy3sfzv8s0nmb268582TjoN3AGBijpvhHw7pU1rLbQXDG0TZbLcXk86QDbtwiyOyr8vHAHHFalFAGVD4P8ADsFrLbLBO0UiLGBJdTOYkVg6rGS2YwGAI24wQPQYms/DWh2V0LqKKYzicXPmS3EshMojaPedzHJ2Oy89segxfooAoR+GdCi1ddUWGX7Sk73MYNxKY45XBDuse7aCwY5wOSSetXNV0zStchgh1K3W4jgnS4jViw2yKeDx+PHQgkHin0UAVr/Q9H1N7mS5hYy3AiDyJI6ODEWMZUqQVKlm5XB5qNPDmhJaWtubYyJa3YvY2lkd388ZxIzE5ZuT1J/QVdooAzX8MeHltxAuk2csfnSz7ZohJh5G3ORuzjJ7DjgDoBUf/CK+Hf8AoA6X/wCAcf8AhWtRQBk/8Ir4d/6AOl/+Acf+FH/CK+Hf+gDpf/gHH/hWtRQBk/8ACK+Hf+gDpf8A4Bx/4Uf8Ir4d/wCgDpf/AIBx/wCFa1FAGT/wivh3/oA6X/4Bx/4Uf8Ir4d/6AOl/+Acf+Fa1FAHLa54a0GKxgaPRNNQm+s0JW0QEhriMMOnQgkEdwTXQ/wDCI+Gv+he0n/wCj/8Aiap+IP8Ajwtv+wjZf+lUVdLQBjf8Ij4a/wChe0n/AMAo/wD4mj/hEfDX/QvaT/4BR/8AxNbNFAGN/wAIj4a/6F7Sf/AKP/4mgeE/DasGXw/pQI5BFnHx+lbNFAENva29pGI7aCKFAMBY0Cj8hU1FFABRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/ANFrWvWR4V/5FDRP+vCD/wBFrWvQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUc88VtbyXE8ixwxKXd3OAqgZJJ7DFSVg+NtKutb8Faxptl/x83FsyxjONx67c++MfjQBW0z4g+GdXuTb2eoM0vlNMge3kTzUUZZo9yjfjB+7k8UWHxB8M6lqkOm29/KLyZWaOOazmiyFUsxy6AAAA9TXIyX13r+oeFTa+HdVtP7DDXN4ZrRo9m2Lb5MefvljwAPaqeji+8SDXZdU0fWrfxFrVpPaW8lxp8kdtYw7G2RiRhgZPJPckfiAd3pfxA8M6xqcWn2Wo755iwhLwyIkxX72x2UK2PY1YTxr4ek0u81JNRVrSyuRa3DiJ8xylgoUrjP3mAyBj3rgoGvtesfBWgQ6BqVldaPeW097LcWzRxQrApDBXPDbu2M5BrBvvCmuWvhme60/TLtn1DUnhv7UQtvZFu/NimC4ycAFc/3XB6CgD1J/iB4aj1KbTze3DXME5t5FjsZ3VZAcFSyoV/WunrxzTY7rS/FeuSXUfjWBZNbluIotNsy1rNGSuGYlDnOCDg9AK9joAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAy/EH/Hhbf8AYRsv/SqKulrmvEH/AB4W3/YRsv8A0qirpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5fwr/yKGif9eEH/ota16yPCv8AyKGif9eEH/ota16ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/wAeFt/2EbL/ANKoq6Wua8Qf8eFt/wBhGy/9Koq6WgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOX8K/8AIoaJ/wBeEH/ota16yPCv/IoaJ/14Qf8Aota16ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/x4W3/AGEbL/0qirpa5rxB/wAeFt/2EbL/ANKoq6WgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPMNA+InhWy8N6XaXGqbJ4LSKKRPs8p2sqAEZC4NaP/CzfB/8A0F//ACWl/wDiKKKdhXD/AIWb4P8A+gv/AOS0v/xFH/CzfB//AEF//JaX/wCIooosFw/4Wb4P/wCgv/5LS/8AxFH/AAs3wf8A9Bf/AMlpf/iKKKLBcP8AhZvg/wD6C/8A5LS//EUf8LN8H/8AQX/8lpf/AIiiiiwXD/hZvg//AKC//ktL/wDEUf8ACzfB/wD0F/8AyWl/+IooosFw/wCFm+D/APoL/wDktL/8RR/ws3wf/wBBf/yWl/8AiKKKLBcP+Fm+D/8AoL/+S0v/AMRR/wALN8H/APQX/wDJaX/4iiiiwXD/AIWb4P8A+gv/AOS0v/xFH/CzfB//AEF//JaX/wCIooos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) -- **Responsibilities**: - - Serve as the metadata bridge between logical keys and physical blocks +### Data Flow Summary -#### **Ozone Manager (OM)** +- OM → Recon + - Periodic synchronization happens between OM db to Recon. +- OM -> SCM + - Block deletion request sent by OM to SCM carries block size and replicated size. +- SCM → Recon + - SCM aggregates the blocks in the block deletion request into DeletedBlocksTransaction with aggregated block size and replicated size, persisted into DB. + - SCM maintains and updates a deletion transaction summary for newly created/deleted transactions. Summary is exposed through metrics, API, and also persisted. + - Recon gets the deletion transaction summary using SCM client whenever required. +- SCM → Datanode + - Block deletion transaction sent by SCM to DN carries block size. +- DataNode → Recon + - Exposes TotalPendingDeletionBytes via JMX through BlockDeletingService. + - Recon fetches this data for node-level pending deletion tracking. +- Recon + - Consolidates all component-level data. + - Computes global storage, namespace usage, and pending deletion metrics. + - Exposes results via RestFull API /storagedistribution. + +### Recon API Design + +The Recon API will expose a single endpoint that returns a JSON object with the following structure: + +| Field | Type | Description | +|--------------------|------------------|----------------------------------------| +| globalStorage | Object | Overall storage capacity metrics. | +| globalNamespace | Object | Overall namespace (key) usage metrics. | +| usedSpaceBreakdown | Object | Detailed breakdown of used space. | +| dataNodeUsage | Array of Objects | Per-DataNode storage usage. | + +#### globalStorage Object + +| Field | Type | Description | +|----------------|------|---------------------------------------------------| +| totalUsedSpace | Long | Total used space across all DataNodes in bytes. | +| totalFreeSpace | Long | Total free space across all DataNodes in bytes. | +| totalCapacity | Long | Total raw capacity across all DataNodes in bytes. | + +#### globalNamespace Object + +| Field | Type | Description | +|----------------|------|---------------------------------------------------------| +| totalUsedSpace | Long | Total used space for namespace objects (keys) in bytes. | +| totalKeys | Long | Total number of keys in the namespace. | + +#### usedSpaceBreakdown Object + +| Field | Type | Description | +|-----------------------|--------|--------------------------------------------------------| +| openKeysBytes | Long | Bytes currently held by open keys (not yet committed). | +| committedBytes | Long | Bytes committed to existing keys. | +| containerPreAllocated | Long | Pre-allocated space for open containers. | +| deletionPendingBytes | Object | Bytes pending deletion. | + +#### deletionPendingBytes Object + +| Field | Type | Description | +|---------|--------|-------------------------------------------------| +| total | Long | Total bytes pending deletion across all stages. | +| byStage | Object | Breakdown of pending deletion bytes by stage. | + +#### byStage Object + +| Field | Type | Description | +|-------|--------|-----------------------------------------------------| +| DN | Object | DataNode pending deletion metrics. | +| SCM | Object | Storage Container Manager pending deletion metrics. | +| OM | Object | Ozone Manager pending deletion metrics. | + +#### DN Object (within byStage) + +| Field | Type | Description | +|--------------|------|-----------------------------------------------| +| pendingBytes | Long | Bytes pending deletion at the DataNode level. | + +#### SCM Object (within byStage) + +| Field | Type | Description | +|--------------|------|------------------------------------------| +| pendingBytes | Long | Bytes pending deletion at the SCM level. | + +#### OM Object (within byStage) + +| Field | Type | Description | +|-----------------------|------|------------------------------------------------------------------------------------------| +| pendingKeyBytes | Long | Key bytes pending deletion at the Ozone Manager level. | +| pendingDirectoryBytes | Long | Directory bytes pending deletion at the Ozone Manager level. | +| totalBytes | Long | Total bytes pending deletion at the Ozone Manager level (includes keys and directories). | +#### dataNodeUsage Array of Objects + +Each object in this array represents the usage for a single DataNode. + +| Field | Type | Description | +|------------------|--------|------------------------------------------------| +| dataNodeUuId | String | Unique identifier for the DataNode | +| hostName | String | Hostname of the DataNode | +| capacity | Long | Total capacity of the DataNode in bytes. | +| used | Long | Used space on the DataNode in bytes. | +| remaining | Long | Remaining free space on the DataNode in bytes. | +| committed | Long | Bytes committed to keys on this DataNode. | +| pendingDeletion | Long | Bytes pending deletion on this DataNode. | +| minimumFreeSpace | Long | Configured minimum free space in Bytes. | + +#### Example API Output + +```json +{ + "globalStorage": { + "totalUsedSpace": 15744356352, + "totalFreeSpace": 3002519420928, + "totalCapacity": 3242976054744 + }, + "globalNamespace": { + "totalUsedSpace": 5242880000, + "totalKeys": 10 + }, + "usedSpaceBreakdown": { + "openKeysBytes": 0, + "committedBytes": 5242880000, + "containerPreAllocated": 0, + "deletionPendingBytes": { + "total": 0, + "byStage": { + "DN": { + "pendingBytes": 0 + }, + "SCM": { + "pendingBytes": 0 + }, + "OM": { + "pendingKeyBytes": 0, + "totalBytes": 0, + "pendingDirectoryBytes": 0 + } + } + } + }, + "dataNodeUsage": [ + { + "datanodeUuid": "31300d56-f6f8-46f4-9d1e-862ac82066f8", + "hostName": "ozone-datanode-2.ozone_default", + "capacity": 1080992018248, + "used": 5248118784, + "remaining": 1000839806976, + "committed": 0, + "pendingDeletion": 0, + "minimumFreeSpace": 1080992000 + }, + { + "datanodeUuid": "d211a430-6363-4882-a4b5-5d3275652e5a", + "hostName": "ozone-datanode-3.ozone_default", + "capacity": 1080992018248, + "used": 5248118784, + "remaining": 1000839806976, + "committed": 0, + "pendingDeletion": 0, + "minimumFreeSpace": 1080992000 + }, + { + "datanodeUuid": "70fd6c8c-b3f3-43ad-83ac-4e0dc6e9d74d", + "hostName": "ozone-datanode-1.ozone_default", + "capacity": 1080992018248, + "used": 5248118784, + "remaining": 1000839806976, + "committed": 0, + "pendingDeletion": 0, + "minimumFreeSpace": 1080992000 + } + ] +} +``` + +### Backend Implementation + +The backend implementation will involve collecting data from various Ozone components, and also we need to add few code changes to get pending deletion and replicated sizes in different components. + +#### Ozone Manager (OM) + +Ozone Manager will be the key data source for most of the data. But SCM doesn't have the data and we need to include block size information in Deleted Block and pass it to SCM + +Previously, the key block deletion requests sent from the Ozone Manager (OM) to the Storage Container Manager (SCM) only contained BlockIDs, lacking any size information. Consequently, the SCM was unable to accurately monitor the total space designated for cleanup and pending reclamation. + +The new implementation will include the block size and replicated size in the key block deletion requests sent out by OM to SCM, so that SCM will know the size of each block under request to delete. + +#### Storage Container Manager (SCM) + +##### Persist Block Size in Delete Transactions (SCM) + +SCM currently tracks pending deleted blocks by transaction metadata but lacks reliable, aggregated visibility into **how much space** (raw and replicated) those blocks occupy while they await deletion. This limits operational insights (metrics/CLI) and complicates capacity-related decisions. The design introduces block size persistence at the transaction level and an SCM-side summary to expose accurate, real-time totals. + +##### Goals + +- Persist **total raw size** and **total replicated size** for each DeletedBlocksTransaction.[](https://github.com/apache/ozone/pull/8845) +- Maintain an SCM-side **DeletedBlocksTransactionSummary** with totals for: transaction count, block count, total size, and total replicated size. +- Expose the summary via **metrics**, **API** and **CLI** for operators. +- Provide a safe **upgrade path** so legacy transactions do not pollute the new counters. + +#### Data Node (DNs) + +To enhance storage visibility, a new metric will be introduced: the total bytes consumed by blocks pending deletion. Previously, only the count of blocks awaiting deletion was tracked, providing an incomplete understanding of reclaimable disk space. This change aims to offer a more accurate and comprehensive view of storage in the process of being freed. + +The core idea involves: + +- **Measuring Deleted Data Size:** The system will now measure the total size in bytes of deleted items, rather than just counting them. +- **Integrating into Existing Systems:** This new size measurement will be incorporated into the current data deletion service and container data structures. +- **Calculating Size During Deletion:** Mechanisms will be implemented to accurately capture the byte size of blocks as they are marked for deletion and it will be exposed via metrics. + +DataNodes currently provide storage reports, which Recon consumes regularly. However, these reports lack information about pending deletion bytes. To address this, we propose publishing TotalPendingBytes as a metric via BlockDeletingService, which Recon can then consume via JMX. This approach is more reliable and performs better than alternative solutions, such as including pending deletion information in the storage report. + +#### Recon + +A new REST API endpoint, `/storagedistribution`, has been introduced to provide a consolidated view of storage distribution across the cluster. This endpoint offers various storage-related insights, including used capacity, pending deletions, and overall data distribution within Ozone components.**Key Functionalities** + +Recon exposes consolidated metrics regarding storage usage and distribution, drawing data from the following sources: + +- **OMDBInsightEndpoint:** Retrieves Ozone Manager (OM)-level data, such as bucket-level usage, namespace size, and used capacity. +- **SCMClient:** Fetches pending deletion metrics from the Storage Container Manager (SCM). This includes block-level metadata like size and replicated size, crucial for accurate estimation of reclaimable space. +- **Datanode Storage Reports and Metrics:** Gathers current storage usage statistics from individual datanodes. This information helps determine used versus available capacity and facilitates the classification of data distribution based on node-wise storage usage. + +The pending deletion bytes are calculated and updated within the BlockDeletionService metrics, which are then exposed via JMX. This allows direct access to these metrics by monitoring tools. While this approach introduces a dependency on JMX (a minor concern in some deployments), its primary advantage is avoiding unnecessary data transfer to SCM and the associated processing overhead in the Datanode when iterating and calculating pending deletions from the container data list, as would be required with the Storage Report approach. + +### New HDDS Layout and Upgrade -- **Enhancement**: - - Compute block sizes during deletion -- **Responsibilities**: - - Expose logical storage metrics — committed keys, open keys, and namespace usage.(All calculations will be performed in Recon using the synchronized OM database.) +A new HDDS layout version, DATA_DISTRIBUTION, has been introduced to handle the potential issues during upgrading. +- In the OM to SCM block deletion request, a new field is added to protobuf to represent the block with its size. If a new OM connects to an old SCM, the request will be accepted by SCM, but the new field will be ignored by the old SCM. So OM will think these blocks are deleted by actually not, leading to orphan blocks residual in containers. +- In SCM, for an existing Ozone cluster, SCM may already have many DeletedBlocksTransactions in DB without block size information. As SCM maintains a DeletedBlocksTransactionSummary which requires update on new transactions creation, and finished transactions creation. For those old existing transactions, DeletedBlocksTransactionSummary doesn't need to be updated when they are finished and deleted. The DATA_DISTRIBUTION feature finalization action is a good timing to distinguish which are new transactions, which are old transactions. -#### **Recon** +Before DATA_DISTRIBUTION is not finalized, -- **Enhancement**: - - Add a new dashboard aggregating: - - Logical metrics from OM - - Deletion progress from SCM - - Container-level metadata from DNs -- **Data Sources**: - - OM DB (via Insight Sync) - - SCM Client API - - DN BlockDeletingService metrics (This is done via scrapping jmx metrics from DN in Recon) +- The OM to SCM block deletion request will use the current existing field for block ID info +- SCM will not collect DeletedBlocksTransactionSummary, nor it will expose the information +- Datanode will not expose the TotalPendingBytes +- Since Recon doesn't be covered in current Ozone upgrading framework, Recon should be prepared for the case that both SCM and Datanode doesn't have the info required for /storagedistribution -#### **Upgrade Path for Data Distribution Feature** +After the upgrade: -A new SCM upgrade action (ScmOnFinalizeActionForDataDistribution) is introduced. -This action is part of the finalization process for the DATA_DISTRIBUTION layout feature, which enables the new block size tracking capabilities. +- The OM to SCM block deletion request will use the new field for block ID info and size +- SCM will know the start ID of new transactions, aggregate block size in OM request into DeletedBlocksTransaction, update and expose DeletedBlocksTransactionSummary. Old requests from old OM are still supported. +- Datanode will receive DeletedBlocksTransactions with or without block size included from SCM, for new transactions or old existing transactions. Datanode should handle them properly, and begin to publish metrics, including pending deletion bytes for new transactions. -A new feature layout is added to check compatibility between components. Following is an example for handling compatability between OM and SCM +#### Known Limitations +For an existing Ozone cluster updating, if there are existing pending deletion transactions in SCM and DN, these transactions will not be covered in the new data/metrics exposed by SCM and DN. So the data shown by Recon UI can vary a lot from the real total pending deletion size. The gap will reduce gradually after existing old transactions are executed and finished. -| OM Version | SCM Version | Compatibility Handling | -|------------|-------------|-------------------------------------------------------------------------------------------------------------------------------------------| -| **Old OM** | **New SCM** | SCM receives old proto. In `ServerSideTranslatorPB`, it checks if the new block list is empty; if so, it decodes using the old structure. | -| **New OM** | **Old SCM** | OM will be using `getScmInfo()` to fetch SCM metadata layout version. If the feature is not finalized, OM sends the old structure. | -| **New OM** | **New SCM** | Fully upgraded. OM sends size-aware transactions and SCM processes them accordingly. | -| **Old OM** | **Old SCM** | Legacy setup. Both components use old proto structure. | - -Also in SCM, while upgrading for an existing Ozone cluster, all existing block deletion transactions prior to DATA_DISTRIBUTION finalized will be ignored to update DeletedBlocksTransactionSummary when it's removed from SCM DB. -DeletedBlocksTransactionSummary only counts the transaction after DATA_DISTRIBUTION is finalized. -Also in DN side, newly added metadata will be persisted only if the feature is finalized. - ---- ## Approach 2: CLI-based (Not Proceeding) A CLI-based approach was evaluated to compute detailed usage and pending deletion breakdown by analyzing offline OM and SCM database checkpoints and querying DataNodes. @@ -190,12 +336,8 @@ By combining both, operators gain: - **Real-time visibility** (via Recon) - **Historical context** (via Grafana) ---- - # Summary The proposed dashboard improves visibility into cluster storage dynamics, providing deeper insights for effective debugging and informed decision-making. Recon is the ideal place to host the point-in-time overview, while exposing metrics enables Prometheus and Grafana to track long-term trends. Together, these complementary approaches give operators a unified and powerful view of both current cluster state and historical storage patterns. - ---- From ab07c7e8b46140ca220bad6e7421f155d6e1a03d Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Thu, 23 Oct 2025 10:44:08 +0530 Subject: [PATCH 09/23] fixing image issue --- hadoop-hdds/docs/content/design/storage-distribution.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index e7c3cd69ea1a..143e9915efc7 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -45,8 +45,7 @@ The dashboard operates as an extension to **Recon**, leveraging existing telemet All metrics are aggregated, and exposed through a **RESTful API (/storagedistribution)** for recon dashboard. -![](data:image/jpeg;base64,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mgZrUVgN4v0i3gR7y6SJ2QylY1eQBAxXcSF4UFTkkAD8ibVz4j0m0vls57wLOzIgGxiu5yNqlgMAnIwM5xz0oA1aKxvEWuroFlFcNGjiSXy8ySeWi/KzfM2DjO3A45JA71p20pntYpmjeIyIGKP95cjOD7igCaiiigAooooAKKKKACiiigAooooAK5/xULYw6cZ2YSC7zbgdC/lSZB9tm/8AECugrC8TOy21mFthMGucM+P9SPLc7vzAX/gVOO5MtjCooorYyCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAx9WsvEdzdK+j67b2FuEAaKTqXyct0PbA/CisnxTB4Rl1OJtfuruK78kBFhBxs3Njop5zuopiPaKKKK5zoCiiigAooooAKybn/kaNP/69Lj/0OGtasq5/5GjT/wDr0uP/AEOGky4b/f8AkatFFFMgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4q+FsNd1M27MZTMhuAegfyo8Ae2zZ+JNdrXG6k7NrV+GthCFkUK+P8AXDy0O78yV/4DVw3InsV6KKK0Mwry6T4ha3babf6tLJorQWl49v8AYjvS4kAYLlTuPPOenY16jXIeGPA9ppf2qfU7HT7m+kvJZ45xHvZUY5UZYAgjnpSd+g1bqW08caU2r3GmlLtJbUFriQw/u4VCbyzsOgwMfWotM8faTqd0kAt7+2MsTTWz3NvsW5RRkmM55457UyPwnNI/itLmaJYdaIEbRklkHl7fmBA5zzjJrLs/CPiG5uNJGrzacsGjWskFt9mLlpmZNgL5HAAA6d80tR6F2H4m6LOYRHaaqxuIy9uBZsfPI6qmPvEd+3HWrZ8e6Q2l2F7bx3t09+XWC1t4C87FPv8Ay5429+ao6T4O1Cwm8IPLNbEaNFcpcbWb5jIuF2fLz75x+NY5+HGpRWGlsGsbm6spbgvBJLIkciSNkYdQGBH0o1DQ3JfiBby6loMWn2dxc22qGQNIIzujK5BXH94EfMOw55qtpHxGhlme31S2nRjqMlklxBbt5CndhFZyT8x9v0ot/BupWP8A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72S9SwtVu5F2vOsKh2HHBbGSOB+Qq7RRdhZGamg6PHZSWSaTYraSNueBbdAjHjkrjBPA/IVT0fStOu9B0WW5sLWaSC1iaJ5IVZoztU5UkcHgdPQVu1neH/8AkW9L/wCvSL/0AU7hZXJU0rTo7171LC1W7kXa86wqHYccFsZI4H5Col0DRo7KSyTSbFbSRtzwC3QRseOSuME8D8hWlRSuFkUH0XSpPs2/TbNvsuPs+6BT5OMY2cfL0HT0FOTStOjvZL1LC1W7kXa86wqHYccFsZI4H5CrtFF2FkZq6Bo0dlJZJpNitpI254BboI2PHJXGCeB+Qp76LpUn2bfptm32XH2fdAp8nGMbOPl6Dp6Cr9FFwsikmladHevepYWq3ci7XnWFQ7DjgtjJHA/IVJZ2Npp8JhsrWC2iznZDGEXOMZwPYD8qs0UXCwUUUUDCiiigAooooAKKKKACsq5/5GjT/wDr0uP/AEOGtWsq5/5GjT/+vS4/9DhpMuG/yf5GrRRRTICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xl/yA7b/ALCum/8ApbDXQVz/AIy/5Adt/wBhXTf/AEthoA6CiiigAooooAKKKKACiiigAooooAKKKKACiiigDn/GX/IDtv8AsK6b/wClsNdBXP8AjL/kB23/AGFdN/8AS2GugoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKzfD/APyLel/9ekX/AKAK0qzfD/8AyLel/wDXpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigArKuf8AkaNP/wCvS4/9DhrVrKuf+Ro0/wD69Lj/ANDhpMuG/wAn+Rq0UUUyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuf8AGX/IDtv+wrpv/pbDXQVz/jL/AJAdt/2FdN/9LYaAOgooooAKKKKACiiigAooooAKKKKACiiigAooooA5/wAZf8gO2/7Cum/+lsNdBXP+Mv8AkB23/YV03/0throKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACs3w/8A8i3pf/XpF/6AK0qzfD//ACLel/8AXpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigAooooAKKKKACiiigArKuf+Ro0//r0uP/Q4a1ayrn/kaNP/AOvS4/8AQ4aTLhv8n+Rq0UUUyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuf8Zf8AIDtv+wrpv/pbDXQVz/jL/kB23/YV03/0thoA6CiiigAooooAKKKKACiiigAooooAKKKKACiiigDn/GX/ACA7b/sK6b/6Ww10Fc/4y/5Adt/2FdN/9LYa6CgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArN8P/wDIt6X/ANekX/oArSrN8P8A/It6X/16Rf8AoAo6C6mlRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsq5/5GjT/APr0uP8A0OGtWsq5/wCRo0//AK9Lj/0OGky4b/J/katFFFMgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArn/GX/IDtv+wrpv8A6Ww10Fc/4y/5Adt/2FdN/wDS2GgDoKKKKACiiigAoooo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8K/8ihon/XhB/wCi1rXoAKKKKACiiigArOn/AORjsf8Ar1uP/Qoq0azp/wDkY7H/AK9bj/0KKlLY0pfF8n+Ro0UUUzMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArB8Xf8ga3/AOwpp/8A6WQ1vVg+Lv8AkDW//YU0/wD9LIaAN6iiigAooooAKKKKACiiigAooooAKKKKACiiigDB8Xf8ga3/AOwpp/8A6WQ1vVg+Lv8AkDW//YU0/wD9LIa3qACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/x4W3/AGEbL/0qirpa5rxB/wAeFt/2EbL/ANKoq6WgAooooAKKKKACs3w//wAi3pf/AF6Rf+gCtKs3w/8A8i3pf/XpF/6AKOguppUUUUDCiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf+i1rXrI8K/wDIoaJ/14Qf+i1rXoAKKKKACiiigArOn/5GOx/69bj/ANCirRrOn/5GOx/69bj/ANCipS2NKXxfJ/kaNFFFMzCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACpPIk/u/qKjqr4tEbeFtQSaeW3jeMI00cfmeWGIBYrkZUZ+bkfLnkUAXhDIRwM/iKQQuwyACPYivM/MtYrHU7e3g037As1i+oT6JIfsr25lYSAoOEYKMuATlCMmpvENn4f1Wyaw8LmGJZbyzVp7Er9mSXc5QrtO3zAcFsDptz2oA9H8iT+7+orJ8R6XeX+mQw20PmSLf2cxG4D5I7mJ2PJ7KrH8OOa5jw7qEmv/EGw1943iWfTbm1jibjb5TW5k49RK8iH/cFI/hmTXfE/ieSK10yKRdUhA1KSMtdwbba2bEZA49vmxknIPQgHfeRJ/d/UUeRJ/d/UV55qHi7XYdQ1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Vg+Lv+QNb/8AYU0//wBLIaAOg8x/77fnR5j/AN9vzptFADvMf++350eY/wDfb86bRQA4u54Lt+dNoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHwR/yIPhz/sF23/opa3qwfBH/ACIPhz/sF23/AKKWgDeooooAKKKKACiiigAooooAKKKKACiiigDL8Qf8eFt/2EbL/wBKoq6Wua8Qf8eFt/2EbL/0qirpaACiiigAooooAKzfD/8AyLel/wDXpF/6AK0qzfD/APyLel/9ekX/AKAKOguppUUUUDCiiigAooooAKKKKACiiigDl/Cv/IoaJ/14Qf8Aota16yPCv/IoaJ/14Qf+i1rQu76xsFja9vra2EmdnnShd2OuM0MaTeiJ6KYJ7YvboLu33XIJgHmDMoAySvrgc8U9Wie5ktluIWnjUM8QcFlB6EjqAaAswoqb7M/qtRlFWZIWljErqWVC3LAYyQO4GRn6igQ2s6f/AJGOx/69bj/0KKtZoSuNzoMnAyevtVWTTZn1a2ugybIoJYyMnOWKEdv9k/pSZcHZ3ZLRT9i+d5Pmx+aF3bN3zYzjOPSmRNDOZhDcQSGFikuxwdjDkhsdD7GmTZhRS25jvLdJ7aeKaFxlZI33Kw9iODTxCWZgHQleCM9KAsyOinRoswYxSxuFYq21s4I4IPuKebdlBJK8DNAiKiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHxd/yBrf8A7Cmn/wDpZDW9WD4u/wCQNb/9hTT/AP0shoA3qKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsHwR/yIPhz/sF23/opa3qwfBH/ACIPhz/sF23/AKKWgDeooooAKKKKACiiigAooooAKKKKACiiigDL8Qf8eFt/2EbL/wBKoq6Wua8Qf8eF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j4a/6F7Sf/AKP/4mgeE/DasGXw/pQI5BFnHx+lbNFAENva29pGI7aCKFAMBY0Cj8hU1FFABRRRQAUUUUAFFFFABRRRQAUUUUAcv4V/5FDRP+vCD/ANFrWvWR4V/5FDRP+vCD/wBFrWvQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUc88VtbyXE8ixwxKXd3OAqgZJJ7DFSVg+NtKutb8Faxptl/x83FsyxjONx67c++MfjQBW0z4g+GdXuTb2eoM0vlNMge3kTzUUZZo9yjfjB+7k8UWHxB8M6lqkOm29/KLyZWaOOazmiyFUsxy6AAAA9TXIyX13r+oeFTa+HdVtP7DDXN4ZrRo9m2Lb5MefvljwAPaqeji+8SDXZdU0fWrfxFrVpPaW8lxp8kdtYw7G2RiRhgZPJPckfiAd3pfxA8M6xqcWn2Wo755iwhLwyIkxX72x2UK2PY1YTxr4ek0u81JNRVrSyuRa3DiJ8xylgoUrjP3mAyBj3rgoGvtesfBWgQ6BqVldaPeW097LcWzRxQrApDBXPDbu2M5BrBvvCmuWvhme60/TLtn1DUnhv7UQtvZFu/NimC4ycAFc/3XB6CgD1J/iB4aj1KbTze3DXME5t5FjsZ3VZAcFSyoV/WunrxzTY7rS/FeuSXUfjWBZNbluIotNsy1rNGSuGYlDnOCDg9AK9joAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAy/EH/Hhbf8AYRsv/SqKulrmvEH/AB4W3/YRsv8A0qirpaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5fwr/yKGif9eEH/ota16yPCv8AyKGif9eEH/ota16ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/wAeFt/2EbL/ANKoq6Wua8Qf8eFt/wBhGy/9Koq6WgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOX8K/8AIoaJ/wBeEH/ota16yPCv/IoaJ/14Qf8Aota16ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMvxB/x4W3/AGEbL/0qirpa5rxB/wAeFt/2EbL/ANKoq6WgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPMNA+InhWy8N6XaXGqbJ4LSKKRPs8p2sqAEZC4NaP/CzfB/8A0F//ACWl/wDiKKKdhXD/AIWb4P8A+gv/AOS0v/xFH/CzfB//AEF//JaX/wCIooosFw/4Wb4P/wCgv/5LS/8AxFH/AAs3wf8A9Bf/AMlpf/iKKKLBcP8AhZvg/wD6C/8A5LS//EUf8LN8H/8AQX/8lpf/AIiiiiwXD/hZvg//AKC//ktL/wDEUf8ACzfB/wD0F/8AyWl/+IooosFw/wCFm+D/APoL/wDktL/8RR/ws3wf/wBBf/yWl/8AiKKKLBcP+Fm+D/8AoL/+S0v/AMRR/wALN8H/APQX/wDJaX/4iiiiwXD/AIWb4P8A+gv/AOS0v/xFH/CzfB//AEF//JaX/wCIooos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) - +![](storage-distribution-design.jpg) ### Data Flow Summary - OM → Recon From ed954a342f4b6503b7e56482d466497710347b1d Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Wed, 5 Nov 2025 11:54:57 +0530 Subject: [PATCH 10/23] updating feature layout section. --- .../content/design/storage-distribution.md | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 143e9915efc7..b185f13fd255 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -270,26 +270,30 @@ The pending deletion bytes are calculated and updated within the BlockDeletionSe ### New HDDS Layout and Upgrade -A new HDDS layout version, DATA_DISTRIBUTION, has been introduced to handle the potential issues during upgrading. +A new HDDS layout feature, DATA_DISTRIBUTION, has been introduced to handle upgrade and downgrade scenarios correctly and ensure accurate persistence of pending deletion metrics. -- In the OM to SCM block deletion request, a new field is added to protobuf to represent the block with its size. If a new OM connects to an old SCM, the request will be accepted by SCM, but the new field will be ignored by the old SCM. So OM will think these blocks are deleted by actually not, leading to orphan blocks residual in containers. -- In SCM, for an existing Ozone cluster, SCM may already have many DeletedBlocksTransactions in DB without block size information. As SCM maintains a DeletedBlocksTransactionSummary which requires update on new transactions creation, and finished transactions creation. For those old existing transactions, DeletedBlocksTransactionSummary doesn't need to be updated when they are finished and deleted. The DATA_DISTRIBUTION feature finalization action is a good timing to distinguish which are new transactions, which are old transactions. +#### Why a New Layout Feature Is Needed -Before DATA_DISTRIBUTION is not finalized, +Although rolling upgrades are not supported in Ozone (meaning OM and SCM should never run different versions simultaneously), SCM and Datanodes may persist aggregated size metrics in their databases during the upgrade process. +If these metrics are written before the cluster is finalized, and later the cluster is downgraded and re-upgraded, the old values can become stale or inaccurate since old code won’t update them correctly. -- The OM to SCM block deletion request will use the current existing field for block ID info -- SCM will not collect DeletedBlocksTransactionSummary, nor it will expose the information -- Datanode will not expose the TotalPendingBytes -- Since Recon doesn't be covered in current Ozone upgrading framework, Recon should be prepared for the case that both SCM and Datanode doesn't have the info required for /storagedistribution +To prevent such inaccuracies, SCM and DNs must only start persisting the aggregated pending deletion data once the layout feature is finalized. -After the upgrade: +#### Behavior Before DATA_DISTRIBUTION Finalization -- The OM to SCM block deletion request will use the new field for block ID info and size -- SCM will know the start ID of new transactions, aggregate block size in OM request into DeletedBlocksTransaction, update and expose DeletedBlocksTransactionSummary. Old requests from old OM are still supported. -- Datanode will receive DeletedBlocksTransactions with or without block size included from SCM, for new transactions or old existing transactions. Datanode should handle them properly, and begin to publish metrics, including pending deletion bytes for new transactions. +- SCM does not collect or expose DeletedBlocksTransactionSummary. +- DNs do not report TotalPendingBytes. +- Recon must handle the case where SCM and DN do not expose storage distribution data. + +#### Behavior After DATA_DISTRIBUTION Finalization + +- SCM aggregates block sizes for new transactions, updates DeletedBlocksTransactionSummary, and exposes these metrics. +- DNs handle both legacy and new transactions, calculate pending deletion bytes for new ones, and report them. +- The persisted counters in SCM and DN reflect only data deleted after finalization, ensuring accuracy even across upgrade/downgrade cycles. #### Known Limitations -For an existing Ozone cluster updating, if there are existing pending deletion transactions in SCM and DN, these transactions will not be covered in the new data/metrics exposed by SCM and DN. So the data shown by Recon UI can vary a lot from the real total pending deletion size. The gap will reduce gradually after existing old transactions are executed and finished. +For an existing Ozone cluster updating, if there are existing pending deletion transactions in SCM and DN, these transactions will not be covered in the new data/metrics exposed by SCM and DN. +So the data shown by Recon UI can vary a lot from the real total pending deletion size. The gap will reduce gradually after existing old transactions are executed and finished. ## Approach 2: CLI-based (Not Proceeding) From 78d11ba2bddd789b858befc58d97001584974c21 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Wed, 5 Nov 2025 22:32:59 +0530 Subject: [PATCH 11/23] updating feature layout name. --- hadoop-hdds/docs/content/design/storage-distribution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index b185f13fd255..fe2f09b4a178 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -270,7 +270,7 @@ The pending deletion bytes are calculated and updated within the BlockDeletionSe ### New HDDS Layout and Upgrade -A new HDDS layout feature, DATA_DISTRIBUTION, has been introduced to handle upgrade and downgrade scenarios correctly and ensure accurate persistence of pending deletion metrics. +A new HDDS layout feature, STORAGE_SPACE_DISTRIBUTION, has been introduced to handle upgrade and downgrade scenarios correctly and ensure accurate persistence of pending deletion metrics. #### Why a New Layout Feature Is Needed @@ -279,13 +279,13 @@ If these metrics are written before the cluster is finalized, and later the clus To prevent such inaccuracies, SCM and DNs must only start persisting the aggregated pending deletion data once the layout feature is finalized. -#### Behavior Before DATA_DISTRIBUTION Finalization +#### Behavior Before STORAGE_SPACE_DISTRIBUTION Finalization - SCM does not collect or expose DeletedBlocksTransactionSummary. - DNs do not report TotalPendingBytes. - Recon must handle the case where SCM and DN do not expose storage distribution data. -#### Behavior After DATA_DISTRIBUTION Finalization +#### Behavior After STORAGE_SPACE_DISTRIBUTION Finalization - SCM aggregates block sizes for new transactions, updates DeletedBlocksTransactionSummary, and exposes these metrics. - DNs handle both legacy and new transactions, calculate pending deletion bytes for new ones, and report them. From 0b24bf962c0a7cf26f1642a9c0af830eb3b44f20 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha <35779060+priyeshkaratha@users.noreply.github.com> Date: Sun, 9 Nov 2025 21:26:53 +0530 Subject: [PATCH 12/23] Apply suggestions from code review Co-authored-by: Ethan Rose <33912936+errose28@users.noreply.github.com> --- .../docs/content/design/storage-distribution.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index fe2f09b4a178..943a6ceda9dc 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -96,17 +96,17 @@ The Recon API will expose a single endpoint that returns a JSON object with the | Field | Type | Description | |-----------------------|--------|--------------------------------------------------------| -| openKeysBytes | Long | Bytes currently held by open keys (not yet committed). | -| committedBytes | Long | Bytes committed to existing keys. | -| containerPreAllocated | Long | Pre-allocated space for open containers. | -| deletionPendingBytes | Object | Bytes pending deletion. | +| openKeyBytes | Long | Bytes currently held by open keys (not yet committed). | +| committedKeyBytes | Long | Bytes committed to existing keys. | +| preAllocatedContainerBytes | Long | Pre-allocated space for open containers. | +| pendingDeletionBytes | Object | Bytes pending deletion. | #### deletionPendingBytes Object | Field | Type | Description | |---------|--------|-------------------------------------------------| | total | Long | Total bytes pending deletion across all stages. | -| byStage | Object | Breakdown of pending deletion bytes by stage. | +| byComponent | Object | Breakdown of pending deletion bytes by component. | #### byStage Object From 2c5c81033336831e266af7fa96ca925ab302c936 Mon Sep 17 00:00:00 2001 From: pkaratha Date: Fri, 14 Nov 2025 12:59:16 +0530 Subject: [PATCH 13/23] addressing comments. --- hadoop-hdds/docs/content/design/storage-distribution.md | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 943a6ceda9dc..85af9b3bc29b 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -314,7 +314,6 @@ To enable this, components should expose metrics that can be scraped by Promethe - Recon has already methods that are available to calculate the following information. - open key used space - committed key used space - - containerPreAllocated space - pending deletion - In every OM db syncing, we can update these metrics values. From affa4ef8a2c55a337b6df4d310efdcb95ecfde79 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 2 Dec 2025 10:42:31 +0530 Subject: [PATCH 14/23] updating design doc with new api changes --- .../content/design/storage-distribution.md | 140 +++++++++--------- 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 85af9b3bc29b..fa9af721310f 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -68,7 +68,13 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib ### Recon API Design -The Recon API will expose a single endpoint that returns a JSON object with the following structure: +#### 1. Get Storage Distribution Information + +**Endpoint:** `GET /storageDistribution` +**Description:** Retrieves comprehensive storage metrics including global capacity, namespace usage, and per-DataNode storage breakdown. +**Parameters:** None +**Responses:** 200 OK +**Response Structure:** | Field | Type | Description | |--------------------|------------------|----------------------------------------| @@ -77,67 +83,30 @@ The Recon API will expose a single endpoint that returns a JSON object with the | usedSpaceBreakdown | Object | Detailed breakdown of used space. | | dataNodeUsage | Array of Objects | Per-DataNode storage usage. | -#### globalStorage Object +**Response Objects:** +##### globalStorage Object | Field | Type | Description | |----------------|------|---------------------------------------------------| | totalUsedSpace | Long | Total used space across all DataNodes in bytes. | | totalFreeSpace | Long | Total free space across all DataNodes in bytes. | | totalCapacity | Long | Total raw capacity across all DataNodes in bytes. | -#### globalNamespace Object - +##### globalNamespace Object | Field | Type | Description | |----------------|------|---------------------------------------------------------| | totalUsedSpace | Long | Total used space for namespace objects (keys) in bytes. | | totalKeys | Long | Total number of keys in the namespace. | -#### usedSpaceBreakdown Object - -| Field | Type | Description | -|-----------------------|--------|--------------------------------------------------------| -| openKeyBytes | Long | Bytes currently held by open keys (not yet committed). | -| committedKeyBytes | Long | Bytes committed to existing keys. | -| preAllocatedContainerBytes | Long | Pre-allocated space for open containers. | -| pendingDeletionBytes | Object | Bytes pending deletion. | - -#### deletionPendingBytes Object - -| Field | Type | Description | -|---------|--------|-------------------------------------------------| -| total | Long | Total bytes pending deletion across all stages. | -| byComponent | Object | Breakdown of pending deletion bytes by component. | - -#### byStage Object - -| Field | Type | Description | -|-------|--------|-----------------------------------------------------| -| DN | Object | DataNode pending deletion metrics. | -| SCM | Object | Storage Container Manager pending deletion metrics. | -| OM | Object | Ozone Manager pending deletion metrics. | - -#### DN Object (within byStage) - -| Field | Type | Description | -|--------------|------|-----------------------------------------------| -| pendingBytes | Long | Bytes pending deletion at the DataNode level. | - -#### SCM Object (within byStage) - -| Field | Type | Description | -|--------------|------|------------------------------------------| -| pendingBytes | Long | Bytes pending deletion at the SCM level. | - -#### OM Object (within byStage) - -| Field | Type | Description | -|-----------------------|------|------------------------------------------------------------------------------------------| -| pendingKeyBytes | Long | Key bytes pending deletion at the Ozone Manager level. | -| pendingDirectoryBytes | Long | Directory bytes pending deletion at the Ozone Manager level. | -| totalBytes | Long | Total bytes pending deletion at the Ozone Manager level (includes keys and directories). | -#### dataNodeUsage Array of Objects +##### usedSpaceBreakdown Object +| Field | Type | Description | +|----------------------------|------|--------------------------------------------------------| +| openKeyBytes | Long | Bytes currently held by open keys (not yet committed). | +| committedKeyBytes | Long | Bytes committed to existing keys. | +| preAllocatedContainerBytes | Long | Pre-allocated space for open containers. | -Each object in this array represents the usage for a single DataNode. +##### dataNodeUsage Array (Per-DataNode Metrics) +Each object represents the storage metrics for a single DataNode. | Field | Type | Description | |------------------|--------|------------------------------------------------| @@ -147,10 +116,9 @@ Each object in this array represents the usage for a single DataNode. | used | Long | Used space on the DataNode in bytes. | | remaining | Long | Remaining free space on the DataNode in bytes. | | committed | Long | Bytes committed to keys on this DataNode. | -| pendingDeletion | Long | Bytes pending deletion on this DataNode. | -| minimumFreeSpace | Long | Configured minimum free space in Bytes. | +| minimumFreeSpace | Long | Configured minimum free space in bytes. | -#### Example API Output +**Example Response:** ```json { @@ -166,23 +134,7 @@ Each object in this array represents the usage for a single DataNode. "usedSpaceBreakdown": { "openKeysBytes": 0, "committedBytes": 5242880000, - "containerPreAllocated": 0, - "deletionPendingBytes": { - "total": 0, - "byStage": { - "DN": { - "pendingBytes": 0 - }, - "SCM": { - "pendingBytes": 0 - }, - "OM": { - "pendingKeyBytes": 0, - "totalBytes": 0, - "pendingDirectoryBytes": 0 - } - } - } + "preAllocatedContainerBytes": 0 }, "dataNodeUsage": [ { @@ -192,7 +144,6 @@ Each object in this array represents the usage for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "pendingDeletion": 0, "minimumFreeSpace": 1080992000 }, { @@ -202,7 +153,6 @@ Each object in this array represents the usage for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "pendingDeletion": 0, "minimumFreeSpace": 1080992000 }, { @@ -212,13 +162,57 @@ Each object in this array represents the usage for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "pendingDeletion": 0, "minimumFreeSpace": 1080992000 } ] } ``` +#### 2. Get Pending Deletion Bytes + +**Endpoint:** `GET /pendingDeletion` +**Description:** Retrieves pending deletion metrics across different Ozone components (OM, SCM, and DataNodes). +**Parameters:** +- `component` (required): Component type - `om`, `scm`, or `dn` +**Responses:** +- **200 OK:** Data is available or task is running +- **202 Accepted:** No data available yet but task is in progress + +**Response Schemas by Component:** + +##### a) Ozone Manager (OM) - `GET /pendingDeletion?component=om` + +| Field | Type | Description | +|---------------------|------|--------------------------------------| +| totalSize | Long | Total pending bytes across all items | +| pendingDirectorySize | Long | Total pending bytes for directories | +| pendingKeySize | Long | Total pending bytes for keys | + +##### b) Storage Container Manager (SCM) - `GET /pendingDeletion?component=scm` + +| Field | Type | Description | +|--------------------------|------|------------------------------------------------| +| totalBlocksize | Long | Total pending bytes for unreplicated blocks | +| totalReplicatedBlockSize | Long | Total pending bytes for replicated blocks | +| totalBlocksCount | Long | Total number of pending blocks | + +##### c) DataNodes (DN) - `GET /pendingDeletion?component=dn` + +| Field | Type | Description | +|----------------------------|------------------|-----------------------------------------------------| +| status | String | Status of the background metrics collection task | +| totalPendingDeletion | Long | Sum of pending deletion bytes across all DataNodes | +| pendingDeletionPerDataNode | Array of Objects | Per-DataNode pending deletion metrics | + +**pendingDeletionPerDataNode Array (Per-DataNode Metrics):** +Each object contains pending deletion information for a single DataNode. + +| Field | Type | Description | +|------------------|--------|------------------------------------------| +| hostName | String | Hostname of the DataNode | +| datanodeUuid | String | Unique identifier for the DataNode | +| pendingBlockSize | Long | Total pending bytes on this DataNode | + ### Backend Implementation The backend implementation will involve collecting data from various Ozone components, and also we need to add few code changes to get pending deletion and replicated sizes in different components. @@ -275,7 +269,7 @@ A new HDDS layout feature, STORAGE_SPACE_DISTRIBUTION, has been introduced to ha #### Why a New Layout Feature Is Needed Although rolling upgrades are not supported in Ozone (meaning OM and SCM should never run different versions simultaneously), SCM and Datanodes may persist aggregated size metrics in their databases during the upgrade process. -If these metrics are written before the cluster is finalized, and later the cluster is downgraded and re-upgraded, the old values can become stale or inaccurate since old code won’t update them correctly. +If these metrics are written before the cluster is finalized, and later the cluster is downgraded and re-upgraded, the old values can become stale or inaccurate since old code won't update them correctly. To prevent such inaccuracies, SCM and DNs must only start persisting the aggregated pending deletion data once the layout feature is finalized. From fe4e3876e397116cd5edc9a17b27cf3a47637595 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 2 Dec 2025 10:44:11 +0530 Subject: [PATCH 15/23] cleaning up errors --- hadoop-hdds/docs/content/design/storage-distribution.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index fa9af721310f..f517767ae06a 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -71,9 +71,13 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib #### 1. Get Storage Distribution Information **Endpoint:** `GET /storageDistribution` + **Description:** Retrieves comprehensive storage metrics including global capacity, namespace usage, and per-DataNode storage breakdown. + **Parameters:** None + **Responses:** 200 OK + **Response Structure:** | Field | Type | Description | @@ -171,9 +175,12 @@ Each object represents the storage metrics for a single DataNode. #### 2. Get Pending Deletion Bytes **Endpoint:** `GET /pendingDeletion` + **Description:** Retrieves pending deletion metrics across different Ozone components (OM, SCM, and DataNodes). + **Parameters:** - `component` (required): Component type - `om`, `scm`, or `dn` + **Responses:** - **200 OK:** Data is available or task is running - **202 Accepted:** No data available yet but task is in progress From 8b83b812bb737276d538be3a1f5b479284cacc2e Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Fri, 19 Dec 2025 14:58:46 +0530 Subject: [PATCH 16/23] adding design changes. --- .../content/design/storage-distribution.md | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index f517767ae06a..c0f87fefa804 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -121,6 +121,7 @@ Each object represents the storage metrics for a single DataNode. | remaining | Long | Remaining free space on the DataNode in bytes. | | committed | Long | Bytes committed to keys on this DataNode. | | minimumFreeSpace | Long | Configured minimum free space in bytes. | +| reserved | Long | Configured reserved space in bytes. | **Example Response:** @@ -189,12 +190,20 @@ Each object represents the storage metrics for a single DataNode. ##### a) Ozone Manager (OM) - `GET /pendingDeletion?component=om` -| Field | Type | Description | -|---------------------|------|--------------------------------------| -| totalSize | Long | Total pending bytes across all items | +| Field | Type | Description | +|----------------------|------|--------------------------------------| +| totalSize | Long | Total pending bytes across all items | | pendingDirectorySize | Long | Total pending bytes for directories | -| pendingKeySize | Long | Total pending bytes for keys | +| pendingKeySize | Long | Total pending bytes for keys | +Example:- +```json +{ + "totalSize": 0, + "pendingDirectorySize": 0, + "pendingKeySize": 0 +} +``` ##### b) Storage Container Manager (SCM) - `GET /pendingDeletion?component=scm` | Field | Type | Description | @@ -203,13 +212,24 @@ Each object represents the storage metrics for a single DataNode. | totalReplicatedBlockSize | Long | Total pending bytes for replicated blocks | | totalBlocksCount | Long | Total number of pending blocks | +Example:- +```json +{ + "totalBlocksize": 0, + "totalReplicatedBlockSize": 0, + "totalBlocksCount": 0 +} +``` + ##### c) DataNodes (DN) - `GET /pendingDeletion?component=dn` -| Field | Type | Description | -|----------------------------|------------------|-----------------------------------------------------| +| Field | Type | Description | +|----------------------------|------------------|----------------------------------------------------| | status | String | Status of the background metrics collection task | | totalPendingDeletion | Long | Sum of pending deletion bytes across all DataNodes | | pendingDeletionPerDataNode | Array of Objects | Per-DataNode pending deletion metrics | +| totalNodesQueried | Long | Total number of JMx Queries | +| totalNodeQueriesFailed | Long | Number of Jmx queries failed | **pendingDeletionPerDataNode Array (Per-DataNode Metrics):** Each object contains pending deletion information for a single DataNode. @@ -220,6 +240,33 @@ Each object contains pending deletion information for a single DataNode. | datanodeUuid | String | Unique identifier for the DataNode | | pendingBlockSize | Long | Total pending bytes on this DataNode | +Example:- +```json +{ + "status": "FINISHED", + "totalPendingDeletionSize": 0, + "pendingDeletionPerDataNode": [ + { + "hostName": "ozone-datanode-2.ozone_default", + "datanodeUuid": "002d69fa-ce3e-4d66-bd23-ac235f599fc6", + "pendingBlockSize": 0 + }, + { + "hostName": "ozone-datanode-3.ozone_default", + "datanodeUuid": "d5946743-3496-4f6d-834f-374cebae2159", + "pendingBlockSize": 0 + }, + { + "hostName": "ozone-datanode-1.ozone_default", + "datanodeUuid": "35e850c7-9824-4098-8818-7e95f4ccce0e", + "pendingBlockSize": 0 + } + ], + "totalNodesQueried": 3, + "totalNodeQueriesFailed": 0 +} +``` + ### Backend Implementation The backend implementation will involve collecting data from various Ozone components, and also we need to add few code changes to get pending deletion and replicated sizes in different components. From ba9dee02d62ce5e84c7db57418b952310d3cfce2 Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Fri, 19 Dec 2025 15:24:09 +0530 Subject: [PATCH 17/23] adding reserved space in example --- hadoop-hdds/docs/content/design/storage-distribution.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index c0f87fefa804..e2cee3b44e85 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -149,7 +149,8 @@ Each object represents the storage metrics for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "minimumFreeSpace": 1080992000 + "minimumFreeSpace": 1080992000, + "reserved": 108110008 }, { "datanodeUuid": "d211a430-6363-4882-a4b5-5d3275652e5a", @@ -158,7 +159,8 @@ Each object represents the storage metrics for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "minimumFreeSpace": 1080992000 + "minimumFreeSpace": 1080992000, + "reserved": 108110008 }, { "datanodeUuid": "70fd6c8c-b3f3-43ad-83ac-4e0dc6e9d74d", @@ -167,7 +169,8 @@ Each object represents the storage metrics for a single DataNode. "used": 5248118784, "remaining": 1000839806976, "committed": 0, - "minimumFreeSpace": 1080992000 + "minimumFreeSpace": 1080992000, + "reserved": 108110008 } ] } From 104ab26011f98a7293a4f0ba21b8ad5ea9e52c5f Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Fri, 19 Dec 2025 16:56:22 +0530 Subject: [PATCH 18/23] fixing errors in the document. --- hadoop-hdds/docs/content/design/storage-distribution.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index e2cee3b44e85..1303d024d288 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -114,7 +114,7 @@ Each object represents the storage metrics for a single DataNode. | Field | Type | Description | |------------------|--------|------------------------------------------------| -| dataNodeUuId | String | Unique identifier for the DataNode | +| datanodeUuid | String | Unique identifier for the DataNode | | hostName | String | Hostname of the DataNode | | capacity | Long | Total capacity of the DataNode in bytes. | | used | Long | Used space on the DataNode in bytes. | @@ -138,7 +138,7 @@ Each object represents the storage metrics for a single DataNode. }, "usedSpaceBreakdown": { "openKeysBytes": 0, - "committedBytes": 5242880000, + "committedKeyBytes": 5242880000, "preAllocatedContainerBytes": 0 }, "dataNodeUsage": [ @@ -231,8 +231,8 @@ Example:- | status | String | Status of the background metrics collection task | | totalPendingDeletion | Long | Sum of pending deletion bytes across all DataNodes | | pendingDeletionPerDataNode | Array of Objects | Per-DataNode pending deletion metrics | -| totalNodesQueried | Long | Total number of JMx Queries | -| totalNodeQueriesFailed | Long | Number of Jmx queries failed | +| totalNodesQueried | Int | Total number of JMx Queries | +| totalNodeQueriesFailed | Int | Number of Jmx queries failed | **pendingDeletionPerDataNode Array (Per-DataNode Metrics):** Each object contains pending deletion information for a single DataNode. From 09162850b5abb72de79863b74aa87155482ea6bc Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Mon, 9 Feb 2026 15:50:17 +0530 Subject: [PATCH 19/23] addressing review comments. --- .../content/design/storage-distribution.md | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 1303d024d288..efcfdaa07fe3 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -90,11 +90,15 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib **Response Objects:** ##### globalStorage Object -| Field | Type | Description | -|----------------|------|---------------------------------------------------| -| totalUsedSpace | Long | Total used space across all DataNodes in bytes. | -| totalFreeSpace | Long | Total free space across all DataNodes in bytes. | -| totalCapacity | Long | Total raw capacity across all DataNodes in bytes. | +| Field | Type | Description | +|--------------------------------------|------|----------------------------------------------------------------------------| +| totalFileSystemCapacity | Long | Total raw capacity of filesystem across all DataNodes in bytes. | +| totalReservedSpace | Long | Total space reserved in filesystem which cannot be used by ozone | +| totalOzoneCapacity | Long | Total raw capacity across all DataNodes in bytes. | +| totalOzoneUsedSpace | Long | Total used space across all DataNodes in bytes. | +| totalOzoneFreeSpace | Long | Total free space across all DataNodes in bytes. | +| totalOzonePreAllocatedContainerSpace | Long | Pre-allocated space for open containers. | +| totalOzoneMinimumFreeSpace | Long | Sum of all the minium free space configured across all DataNodes in bytes. | ##### globalNamespace Object | Field | Type | Description | @@ -103,11 +107,17 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib | totalKeys | Long | Total number of keys in the namespace. | ##### usedSpaceBreakdown Object -| Field | Type | Description | -|----------------------------|------|--------------------------------------------------------| -| openKeyBytes | Long | Bytes currently held by open keys (not yet committed). | -| committedKeyBytes | Long | Bytes committed to existing keys. | -| preAllocatedContainerBytes | Long | Pre-allocated space for open containers. | +| Field | Type | Description | +|----------------------------|--------|--------------------------------------------------------| +| openKeyBytes | Object | Bytes currently held by open keys (not yet committed). | +| committedKeyBytes | Long | Bytes committed to existing keys. | + +##### openKeyBytes Object +| Field | Type | Description | +|-----------------------|------|--------------------------------------------------------| +| totalOpenKeyBytes | Long | Bytes currently held by open keys (not yet committed). | +| openKeyAndFileBytes | Long | Bytes currently held by open keys/files | +| multipartOpenKeyBytes | Long | Bytes currently held by open multipart keys | ##### dataNodeUsage Array (Per-DataNode Metrics) Each object represents the storage metrics for a single DataNode. @@ -128,18 +138,25 @@ Each object represents the storage metrics for a single DataNode. ```json { "globalStorage": { - "totalUsedSpace": 15744356352, - "totalFreeSpace": 3002519420928, - "totalCapacity": 3242976054744 + "totalFileSystemCapacity" : 3242976157144, + "totalReservedSpace" : 102400, + "totalOzoneCapacity": 3242976054744, + "totalOzoneUsedSpace": 15744356352, + "totalOzoneFreeSpace": 3002519420928, + "totalOzonePreAllocatedContainerSpace": 0, + "totalMinimumFreeSpace" : 0 }, "globalNamespace": { "totalUsedSpace": 5242880000, "totalKeys": 10 }, "usedSpaceBreakdown": { - "openKeysBytes": 0, - "committedKeyBytes": 5242880000, - "preAllocatedContainerBytes": 0 + "openKeysBytes": { + "totalOpenKeyBytes" : 0, + "openKeyAndFileBytes" : 0, + "multipartOpenKeyBytes" : 0 + }, + "committedKeyBytes": 5242880000 }, "dataNodeUsage": [ { @@ -301,9 +318,9 @@ To enhance storage visibility, a new metric will be introduced: the total bytes The core idea involves: -- **Measuring Deleted Data Size:** The system will now measure the total size in bytes of deleted items, rather than just counting them. +- **Measuring Deleted Data Size:** The system will now measure the total size in bytes of deleted items, rather than just counting them. Whenever a block deletion request is received at DN, it will increment corresponding counter, and also it will be persisted under container info. Once deletion is completed at DN side the same size will decrement. This keeps the pending deletion value consistent. - **Integrating into Existing Systems:** This new size measurement will be incorporated into the current data deletion service and container data structures. -- **Calculating Size During Deletion:** Mechanisms will be implemented to accurately capture the byte size of blocks as they are marked for deletion and it will be exposed via metrics. +- **Calculating Size During Deletion:** Mechanisms will be implemented to accurately capture the byte size of blocks as they are marked for deletion, and it will be exposed via metrics. DataNodes currently provide storage reports, which Recon consumes regularly. However, these reports lack information about pending deletion bytes. To address this, we propose publishing TotalPendingBytes as a metric via BlockDeletingService, which Recon can then consume via JMX. This approach is more reliable and performs better than alternative solutions, such as including pending deletion information in the storage report. From 58bef9eead96a73cc408a6b85fa2bb535cdff0ec Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Mon, 9 Feb 2026 15:54:10 +0530 Subject: [PATCH 20/23] fixing grammer and spell mistakes --- .../content/design/storage-distribution.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index efcfdaa07fe3..c45494fafd95 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -90,15 +90,15 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib **Response Objects:** ##### globalStorage Object -| Field | Type | Description | -|--------------------------------------|------|----------------------------------------------------------------------------| -| totalFileSystemCapacity | Long | Total raw capacity of filesystem across all DataNodes in bytes. | -| totalReservedSpace | Long | Total space reserved in filesystem which cannot be used by ozone | -| totalOzoneCapacity | Long | Total raw capacity across all DataNodes in bytes. | -| totalOzoneUsedSpace | Long | Total used space across all DataNodes in bytes. | -| totalOzoneFreeSpace | Long | Total free space across all DataNodes in bytes. | -| totalOzonePreAllocatedContainerSpace | Long | Pre-allocated space for open containers. | -| totalOzoneMinimumFreeSpace | Long | Sum of all the minium free space configured across all DataNodes in bytes. | +| Field | Type | Description | +|--------------------------------------|------|---------------------------------------------------------------------------| +| totalFileSystemCapacity | Long | Total raw capacity of filesystem across all DataNodes in bytes. | +| totalReservedSpace | Long | Total space reserved in filesystem which cannot be used by ozone | +| totalOzoneCapacity | Long | Total raw capacity across all DataNodes in bytes. | +| totalOzoneUsedSpace | Long | Total used space across all DataNodes in bytes. | +| totalOzoneFreeSpace | Long | Total free space across all DataNodes in bytes. | +| totalOzonePreAllocatedContainerSpace | Long | Pre-allocated space for open containers. | +| totalOzoneMinimumFreeSpace | Long | Sum of all the minimumFreeSpace configured across all DataNodes in bytes. | ##### globalNamespace Object | Field | Type | Description | From 10b8a46a5032aeb06c3aa6e0c5a7f3226930500b Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 10 Feb 2026 07:27:13 +0530 Subject: [PATCH 21/23] updated Calculating Size During Deletion section with details --- hadoop-hdds/docs/content/design/storage-distribution.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index c45494fafd95..5e7b014d5fd7 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -320,7 +320,9 @@ The core idea involves: - **Measuring Deleted Data Size:** The system will now measure the total size in bytes of deleted items, rather than just counting them. Whenever a block deletion request is received at DN, it will increment corresponding counter, and also it will be persisted under container info. Once deletion is completed at DN side the same size will decrement. This keeps the pending deletion value consistent. - **Integrating into Existing Systems:** This new size measurement will be incorporated into the current data deletion service and container data structures. -- **Calculating Size During Deletion:** Mechanisms will be implemented to accurately capture the byte size of blocks as they are marked for deletion, and it will be exposed via metrics. +- **Calculating Size During Deletion:** In DeleteBlockCommandHandler, whenever a delete request is received, the pendingBytes from the transaction are added to the existing pendingBytes of the corresponding ContainerData, and this updated value is persisted. +Once the deletion process completes, the same amount is decremented from the container’s pendingBytes. +Since BlockDeletionService already iterates over all containers while running, it calculates the total pendingBytes per datanode during this iteration and updates the corresponding metrics. DataNodes currently provide storage reports, which Recon consumes regularly. However, these reports lack information about pending deletion bytes. To address this, we propose publishing TotalPendingBytes as a metric via BlockDeletingService, which Recon can then consume via JMX. This approach is more reliable and performs better than alternative solutions, such as including pending deletion information in the storage report. From c6bfc7c46f6cf38dc453db3d7b4496b63f0ae13f Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Wed, 11 Feb 2026 06:03:41 +0530 Subject: [PATCH 22/23] updating pre-allocate bytes to committed --- .../docs/content/design/storage-distribution.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 5e7b014d5fd7..4a44828f3d17 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -97,7 +97,7 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib | totalOzoneCapacity | Long | Total raw capacity across all DataNodes in bytes. | | totalOzoneUsedSpace | Long | Total used space across all DataNodes in bytes. | | totalOzoneFreeSpace | Long | Total free space across all DataNodes in bytes. | -| totalOzonePreAllocatedContainerSpace | Long | Pre-allocated space for open containers. | +| totalOzoneCommittedSpace | Long | Pre-allocated space for open containers. | | totalOzoneMinimumFreeSpace | Long | Sum of all the minimumFreeSpace configured across all DataNodes in bytes. | ##### globalNamespace Object @@ -110,7 +110,7 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib | Field | Type | Description | |----------------------------|--------|--------------------------------------------------------| | openKeyBytes | Object | Bytes currently held by open keys (not yet committed). | -| committedKeyBytes | Long | Bytes committed to existing keys. | +| finalizedKeyBytes | Long | Total bytes in keys that have completed writing. | ##### openKeyBytes Object | Field | Type | Description | @@ -129,7 +129,7 @@ Each object represents the storage metrics for a single DataNode. | capacity | Long | Total capacity of the DataNode in bytes. | | used | Long | Used space on the DataNode in bytes. | | remaining | Long | Remaining free space on the DataNode in bytes. | -| committed | Long | Bytes committed to keys on this DataNode. | +| committed | Long | Bytes pre allocated for the containers. | | minimumFreeSpace | Long | Configured minimum free space in bytes. | | reserved | Long | Configured reserved space in bytes. | @@ -143,7 +143,7 @@ Each object represents the storage metrics for a single DataNode. "totalOzoneCapacity": 3242976054744, "totalOzoneUsedSpace": 15744356352, "totalOzoneFreeSpace": 3002519420928, - "totalOzonePreAllocatedContainerSpace": 0, + "totalOzoneCommittedSpace": 0, "totalMinimumFreeSpace" : 0 }, "globalNamespace": { @@ -156,7 +156,7 @@ Each object represents the storage metrics for a single DataNode. "openKeyAndFileBytes" : 0, "multipartOpenKeyBytes" : 0 }, - "committedKeyBytes": 5242880000 + "finalizedKeyBytes": 5242880000 }, "dataNodeUsage": [ { From 2daab6c731afe95c6c7646968de1aeeabb074baa Mon Sep 17 00:00:00 2001 From: Priyesh Karatha Date: Tue, 24 Feb 2026 09:23:09 +0530 Subject: [PATCH 23/23] addressing review comments and adding missing fields --- .../content/design/storage-distribution.md | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/hadoop-hdds/docs/content/design/storage-distribution.md b/hadoop-hdds/docs/content/design/storage-distribution.md index 4a44828f3d17..080651b2192e 100644 --- a/hadoop-hdds/docs/content/design/storage-distribution.md +++ b/hadoop-hdds/docs/content/design/storage-distribution.md @@ -122,16 +122,19 @@ All metrics are aggregated, and exposed through a **RESTful API (/storagedistrib ##### dataNodeUsage Array (Per-DataNode Metrics) Each object represents the storage metrics for a single DataNode. -| Field | Type | Description | -|------------------|--------|------------------------------------------------| -| datanodeUuid | String | Unique identifier for the DataNode | -| hostName | String | Hostname of the DataNode | -| capacity | Long | Total capacity of the DataNode in bytes. | -| used | Long | Used space on the DataNode in bytes. | -| remaining | Long | Remaining free space on the DataNode in bytes. | -| committed | Long | Bytes pre allocated for the containers. | -| minimumFreeSpace | Long | Configured minimum free space in bytes. | -| reserved | Long | Configured reserved space in bytes. | +| Field | Type | Description | +|---------------------|--------|----------------------------------------------------------| +| datanodeUuid | String | Unique identifier for the DataNode | +| hostName | String | Hostname of the DataNode | +| capacity | Long | Ozone capacity of the DataNode in bytes. | +| used | Long | Ozone Used space on the DataNode in bytes. | +| remaining | Long | Remaining free space on the DataNode in bytes for Ozone. | +| committed | Long | Bytes pre allocated for the containers. | +| minimumFreeSpace | Long | Configured minimum free space in bytes. | +| reserved | Long | Configured reserved space in bytes, for non Ozone usage. | +| filesystemCapacity | Long | Total filesystem capacity of the DataNode in bytes | +| filesystemUsed | Long | Total used filesystem space of DataNode in bytes | +| filesystemAvailable | Long | Total available filesystem space of DataNode in bytes | **Example Response:** @@ -167,7 +170,10 @@ Each object represents the storage metrics for a single DataNode. "remaining": 1000839806976, "committed": 0, "minimumFreeSpace": 1080992000, - "reserved": 108110008 + "reserved": 108110008, + "filesystemCapacity" : 1081100128256, + "filesystemUsed" : 80260321280, + "filesystemAvailable" : 1000839806976 }, { "datanodeUuid": "d211a430-6363-4882-a4b5-5d3275652e5a", @@ -177,7 +183,10 @@ Each object represents the storage metrics for a single DataNode. "remaining": 1000839806976, "committed": 0, "minimumFreeSpace": 1080992000, - "reserved": 108110008 + "reserved": 108110008, + "filesystemCapacity" : 1081100128256, + "filesystemUsed" : 80260321280, + "filesystemAvailable" : 1000839806976 }, { "datanodeUuid": "70fd6c8c-b3f3-43ad-83ac-4e0dc6e9d74d", @@ -187,7 +196,10 @@ Each object represents the storage metrics for a single DataNode. "remaining": 1000839806976, "committed": 0, "minimumFreeSpace": 1080992000, - "reserved": 108110008 + "reserved": 108110008, + "filesystemCapacity" : 1081100128256, + "filesystemUsed" : 80260321280, + "filesystemAvailable" : 1000839806976 } ] }