MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / try_reserve

Method try_reserve

nodedb-mem/src/budget.rs:78–115  ·  view source on GitHub ↗

Try to reserve `size` bytes from this budget. Returns `true` if the reservation succeeded, `false` if it would exceed the limit.

(&self, size: usize)

Source from the content-addressed store, hash-verified

76 /// Returns `true` if the reservation succeeded, `false` if it would
77 /// exceed the limit.
78 pub fn try_reserve(&self, size: usize) -> bool {
79 let limit = self.limit.load(Ordering::Relaxed);
80
81 // CAS loop to atomically check and increment.
82 loop {
83 let current = self.allocated.load(Ordering::Relaxed);
84 if current + size > limit {
85 self.rejection_count.fetch_add(1, Ordering::Relaxed);
86 return false;
87 }
88
89 match self.allocated.compare_exchange_weak(
90 current,
91 current + size,
92 Ordering::AcqRel,
93 Ordering::Relaxed,
94 ) {
95 Ok(_) => {
96 // Update peak if necessary.
97 let new_allocated = current + size;
98 let mut peak = self.peak.load(Ordering::Relaxed);
99 while new_allocated > peak {
100 match self.peak.compare_exchange_weak(
101 peak,
102 new_allocated,
103 Ordering::Relaxed,
104 Ordering::Relaxed,
105 ) {
106 Ok(_) => break,
107 Err(actual) => peak = actual,
108 }
109 }
110 return true;
111 }
112 Err(_) => continue, // Retry CAS.
113 }
114 }
115 }
116
117 /// Try to reserve `size` bytes and return a shared `Arc` to the allocated
118 /// counter so the caller can decrement it on drop.

Callers 13

try_reserve_arcMethod · 0.45
dynamic_limit_adjustmentFunction · 0.45
concurrent_reservesFunction · 0.45
reserveMethod · 0.45
get_or_insert_withMethod · 0.45
execute_ilp_ingestMethod · 0.45
make_governor_atFunction · 0.45
make_governor_atFunction · 0.45

Calls 1

loadMethod · 0.45