@@ -48,7 +48,10 @@ ReuseTimeReinsertionPolicy::ReuseTimeReinsertionPolicy(
4848
4949bool ReuseTimeReinsertionPolicy::shouldReinsert (folly::StringPiece key,
5050 folly::StringPiece value) {
51+ updateRateWindow (); // check if window needs to be reset
5152 reinsertAttempts_.inc ();
53+ attemptedBytes_.add (value.size ());
54+ windowAttemptedCount_.fetch_add (1 , std::memory_order_relaxed);
5255
5356 const auto lr = index_.peek (
5457 makeHK (cachelib::navy::BufferView{
@@ -70,6 +73,8 @@ bool ReuseTimeReinsertionPolicy::shouldReinsert(folly::StringPiece key,
7073 return false ;
7174 }
7275 reinserted_.inc ();
76+ windowReinsertedCount_.fetch_add (1 , std::memory_order_relaxed);
77+ windowReinsertedBytes_.fetch_add (value.size (), std::memory_order_relaxed);
7378 reinsertedBytes_.add (value.size ());
7479 return true ;
7580}
@@ -80,16 +85,19 @@ void ReuseTimeReinsertionPolicy::onLookup(folly::StringPiece key) {
8085
8186void ReuseTimeReinsertionPolicy::getCounters (
8287 const util::CounterVisitor& visitor) const {
83- visitor (" bc_reinsert_reuse_time_attempts " ,
88+ visitor (" bc_reinsert_reuse_time_attempted " ,
8489 reinsertAttempts_.get (),
8590 cachelib::util::CounterVisitor::CounterType::RATE);
91+ visitor (" bc_reinsert_reuse_time_attempted_bytes" ,
92+ attemptedBytes_.get (),
93+ cachelib::util::CounterVisitor::CounterType::RATE);
8694 visitor (" bc_reinsert_reuse_time_key_not_found" ,
8795 keyNotFound_.get (),
8896 cachelib::util::CounterVisitor::CounterType::RATE);
89- visitor (" bc_reinsert_reuse_time_success " ,
97+ visitor (" bc_reinsert_reuse_time_accepted " ,
9098 reinserted_.get (),
9199 cachelib::util::CounterVisitor::CounterType::RATE);
92- visitor (" bc_reinsert_reuse_time_success_bytes " ,
100+ visitor (" bc_reinsert_reuse_time_accepted_bytes " ,
93101 reinsertedBytes_.get (),
94102 cachelib::util::CounterVisitor::CounterType::RATE);
95103 visitor (" bc_reinsert_expired" ,
@@ -98,7 +106,24 @@ void ReuseTimeReinsertionPolicy::getCounters(
98106 visitor (" bc_reinsert_no_prev_access" ,
99107 noPrevAccess_.get (),
100108 cachelib::util::CounterVisitor::CounterType::RATE);
101- // Report percentile stats for reuse time values
109+
110+ visitor (" bc_reinsert_last_byte_accepted" ,
111+ lastBytesAccepted_.load (std::memory_order_relaxed),
112+ cachelib::util::CounterVisitor::CounterType::COUNT);
113+
114+ visitor (" bc_reinsert_last_acceptance_rate" ,
115+ lastAcceptanceRate_.load (std::memory_order_relaxed),
116+ cachelib::util::CounterVisitor::CounterType::COUNT);
117+
118+ auto attempts = reinsertAttempts_.get ();
119+ double acceptanceRate = attempts > 0
120+ ? static_cast <double >(reinserted_.get ()) /
121+ static_cast <double >(attempts)
122+ : 0.0 ;
123+ visitor (" bc_reinsert_acceptance_rate" ,
124+ acceptanceRate,
125+ cachelib::util::CounterVisitor::CounterType::COUNT);
126+
102127 reuseTimeStats_.visitQuantileEstimator (visitor, " bc_reinsert_reuse_time" );
103128}
104129
@@ -175,4 +200,38 @@ uint32_t ReuseTimeReinsertionPolicy::isExpired(folly::StringPiece value) {
175200 return nvmItem.isExpired ();
176201}
177202
203+ void ReuseTimeReinsertionPolicy::updateRateWindow () const {
204+ auto currentTime = static_cast <uint64_t >(
205+ std::chrono::duration_cast<std::chrono::milliseconds>(
206+ std::chrono::steady_clock::now ().time_since_epoch ())
207+ .count ());
208+
209+ auto windowStart = windowStartTime_.load (std::memory_order_relaxed);
210+ // Initialize windowStartTime_ on first call
211+ if (windowStart == 0 ) {
212+ windowStartTime_.store (currentTime, std::memory_order_relaxed);
213+ return ;
214+ }
215+
216+ auto elapsed = currentTime - windowStart;
217+ if (elapsed >= windowSizeMs_) {
218+ // Try to rotate the window (only one thread should succeed)
219+ if (windowStartTime_.compare_exchange_strong (
220+ windowStart, currentTime, std::memory_order_relaxed)) {
221+ // Atomically read and reset counters to avoid losing increments
222+ // from concurrent threads
223+ auto attempts =
224+ windowAttemptedCount_.exchange (0 , std::memory_order_relaxed);
225+ auto reinserted =
226+ windowReinsertedCount_.exchange (0 , std::memory_order_relaxed);
227+ auto reinsertedBytes =
228+ windowReinsertedBytes_.exchange (0 , std::memory_order_relaxed);
229+ double rate =
230+ attempts > 0 ? static_cast <double >(reinserted) / attempts : 0.0 ;
231+ lastAcceptanceRate_.store (rate, std::memory_order_relaxed);
232+ lastBytesAccepted_.store (reinsertedBytes, std::memory_order_relaxed);
233+ }
234+ }
235+ }
236+
178237} // namespace facebook::cachelib::navy
0 commit comments