Skip to main content

rocketmq_runtime/
resources.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use crate::metadata_target::MetadataTargetRegistry;
16use crate::resource_budget::BudgetLimit;
17use crate::resource_budget::FullPolicy;
18use crate::resource_budget::ManagedMemoryBudget;
19use crate::resource_budget::ProcessMemoryLimit;
20use crate::resource_budget::ResourceBudget;
21use crate::resource_budget::ResourceBudgetTree;
22
23/// Process-wide resource capabilities owned by [`crate::RuntimeOwner`].
24///
25/// Clones share the same budget tree. Components derive narrower child
26/// budgets from [`Self::process_budget`] instead of detecting process limits
27/// or creating independent roots.
28#[derive(Debug, Clone)]
29pub struct RuntimeResources {
30    memory_limit: ProcessMemoryLimit,
31    memory_budget: ManagedMemoryBudget,
32    process_budget: ResourceBudget,
33    metadata_targets: MetadataTargetRegistry,
34}
35
36impl RuntimeResources {
37    pub(crate) fn from_memory_budget(memory_budget: ManagedMemoryBudget) -> Self {
38        Self::from_memory_budget_with_metadata_capacity(
39            memory_budget,
40            crate::metadata_target::DEFAULT_MAX_METADATA_TARGETS,
41        )
42    }
43
44    pub(crate) fn from_memory_budget_with_metadata_capacity(
45        memory_budget: ManagedMemoryBudget,
46        metadata_capacity: usize,
47    ) -> Self {
48        let managed_bytes = usize::try_from(memory_budget.managed_bytes()).unwrap_or(usize::MAX);
49        let process_budget = ResourceBudgetTree::new(
50            "process",
51            BudgetLimit::new(usize::MAX, managed_bytes, FullPolicy::Reject),
52        )
53        .expect("a positive managed memory budget must create the process budget")
54        .root();
55        Self {
56            memory_limit: memory_budget.detected(),
57            memory_budget,
58            process_budget,
59            metadata_targets: MetadataTargetRegistry::with_max_entries(metadata_capacity),
60        }
61    }
62
63    /// Returns the detected or explicitly configured process memory limit.
64    #[must_use]
65    pub const fn memory_limit(&self) -> ProcessMemoryLimit {
66        self.memory_limit
67    }
68
69    /// Returns the managed memory budget the ledger charges.
70    #[must_use]
71    pub const fn memory_budget(&self) -> ManagedMemoryBudget {
72        self.memory_budget
73    }
74
75    /// Returns the shared process resource-budget root.
76    #[must_use]
77    pub fn process_budget(&self) -> ResourceBudget {
78        self.process_budget.clone()
79    }
80
81    /// Returns retained target capacity and ownership counts without paths.
82    pub fn metadata_target_stats(&self) -> crate::MetadataTargetRegistryStats {
83        self.metadata_targets.stats()
84    }
85
86    pub(crate) fn metadata_targets(&self) -> MetadataTargetRegistry {
87        self.metadata_targets.clone()
88    }
89}