Skip to content

Commit 5df1b7a

Browse files
gusinaciocarlosvdr
authored andcommitted
initial counter
Signed-off-by: Gustavo Inacio <[email protected]>
1 parent 87da82d commit 5df1b7a

File tree

1 file changed

+49
-10
lines changed

1 file changed

+49
-10
lines changed

tap-agent/src/agent/sender_fee_tracker.rs

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,29 @@ impl ExpiringSum {
2727
}
2828
self.sum
2929
}
30+
31+
fn get_count(&mut self, duration: &Duration) -> usize {
32+
let now = Instant::now();
33+
while let Some(&(timestamp, _)) = self.entries.front() {
34+
if now.duration_since(timestamp) >= *duration {
35+
self.entries.pop_front();
36+
} else {
37+
break;
38+
}
39+
}
40+
self.entries.len()
41+
}
42+
}
43+
44+
#[derive(Debug, Clone, Default)]
45+
pub struct FeeCounter {
46+
fee: u128,
47+
count: usize,
3048
}
3149

3250
#[derive(Debug, Clone, Default)]
3351
pub struct SenderFeeTracker {
34-
id_to_fee: HashMap<Address, u128>,
52+
id_to_fee: HashMap<Address, FeeCounter>,
3553
total_fee: u128,
3654

3755
fees_requesting: u128,
@@ -82,7 +100,8 @@ impl SenderFeeTracker {
82100
}
83101
self.total_fee += value;
84102
let entry = self.id_to_fee.entry(id).or_default();
85-
*entry += value;
103+
entry.fee += value;
104+
entry.count += 1;
86105
}
87106

88107
/// Updates and overwrite the fee counter into the specific
@@ -92,8 +111,8 @@ impl SenderFeeTracker {
92111
pub fn update(&mut self, id: Address, fee: u128) {
93112
if fee > 0 {
94113
// insert or update, if update remove old fee from total
95-
if let Some(old_fee) = self.id_to_fee.insert(id, fee) {
96-
self.total_fee -= old_fee;
114+
if let Some(old_fee) = self.id_to_fee.insert(id, FeeCounter { fee, count: 0 }) {
115+
self.total_fee -= old_fee.fee;
97116
}
98117
self.total_fee = self.total_fee.checked_add(fee).unwrap_or_else(|| {
99118
// This should never happen, but if it does, we want to know about it.
@@ -105,7 +124,7 @@ impl SenderFeeTracker {
105124
u128::MAX
106125
});
107126
} else if let Some(old_fee) = self.id_to_fee.remove(&id) {
108-
self.total_fee -= old_fee;
127+
self.total_fee -= old_fee.fee;
109128
}
110129
}
111130

@@ -134,11 +153,12 @@ impl SenderFeeTracker {
134153
.map(|(addr, fee)| {
135154
(
136155
addr,
137-
fee - self
138-
.buffer_window_fee
139-
.get_mut(addr)
140-
.map(|expiring| expiring.get_sum(&self.buffer_window_duration))
141-
.unwrap_or_default(),
156+
fee.fee
157+
- self
158+
.buffer_window_fee
159+
.get_mut(addr)
160+
.map(|expiring| expiring.get_sum(&self.buffer_window_duration))
161+
.unwrap_or_default(),
142162
)
143163
})
144164
.filter(|(_, fee)| *fee > 0)
@@ -168,6 +188,25 @@ impl SenderFeeTracker {
168188
self.get_total_fee() - self.get_buffer_fee().min(self.total_fee)
169189
}
170190

191+
pub fn get_total_counter_outside_buffer_for_allocation(
192+
&mut self,
193+
allocation_id: &Address,
194+
) -> usize {
195+
let Some(allocation_counter) = self
196+
.id_to_fee
197+
.get(allocation_id)
198+
.map(|fee_counter| fee_counter.count)
199+
else {
200+
return 0;
201+
};
202+
let counter_in_buffer = self
203+
.buffer_window_fee
204+
.get_mut(allocation_id)
205+
.map(|window| window.get_count(&self.buffer_window_duration))
206+
.unwrap_or(0);
207+
allocation_counter - counter_in_buffer
208+
}
209+
171210
pub fn get_buffer_fee(&mut self) -> u128 {
172211
self.buffer_window_fee
173212
.values_mut()

0 commit comments

Comments
 (0)