@@ -38,11 +38,13 @@ static bool hasExpired(const kj::Maybe<double>& expiration, bool allowOutsideIoC
3838
3939SharedMemoryCache::SharedMemoryCache (kj::Maybe<const MemoryCacheProvider&> provider,
4040 kj::StringPtr id,
41- kj::Maybe<AdditionalResizeMemoryLimitHandler&> additionalResizeMemoryLimitHandler)
41+ kj::Maybe<AdditionalResizeMemoryLimitHandler&> additionalResizeMemoryLimitHandler,
42+ const kj::MonotonicClock& timer)
4243 : data(),
4344 provider (provider),
4445 id(kj::str(id)),
45- additionalResizeMemoryLimitHandler(additionalResizeMemoryLimitHandler) {}
46+ additionalResizeMemoryLimitHandler(additionalResizeMemoryLimitHandler),
47+ timer(timer) {}
4648
4749SharedMemoryCache::~SharedMemoryCache () noexcept (false ) {
4850 KJ_IF_SOME (p, provider) {
@@ -219,8 +221,9 @@ void SharedMemoryCache::removeIfExistsWhileLocked(
219221kj::Own<const SharedMemoryCache> SharedMemoryCache::create (
220222 kj::Maybe<const MemoryCacheProvider&> provider,
221223 kj::StringPtr id,
222- kj::Maybe<AdditionalResizeMemoryLimitHandler&> handler) {
223- return kj::atomicRefcounted<const SharedMemoryCache>(provider, id, handler);
224+ kj::Maybe<AdditionalResizeMemoryLimitHandler&> handler,
225+ const kj::MonotonicClock& timer) {
226+ return kj::atomicRefcounted<const SharedMemoryCache>(provider, id, handler, timer);
224227}
225228
226229SharedMemoryCache::Use::Use (kj::Own<const SharedMemoryCache> cache, const Limits& limits)
@@ -240,14 +243,22 @@ SharedMemoryCache::Use::~Use() noexcept(false) {
240243}
241244
242245kj::Maybe<kj::Own<CacheValue>> SharedMemoryCache::Use::getWithoutFallback (
243- const kj::String& key) const {
244- auto data = cache->data .lockExclusive ();
246+ const kj::String& key, SpanBuilder& span) const {
247+ kj::Locked<ThreadUnsafeData> data = [&] {
248+ auto memoryCacheLockRecord =
249+ ScopedDurationTagger (span, memoryCachekLockWaitTimeTag, cache->timer );
250+ return cache->data .lockExclusive ();
251+ }();
245252 return cache->getWhileLocked (*data, key);
246253}
247254
248255kj::OneOf<kj::Own<CacheValue>, kj::Promise<SharedMemoryCache::Use::GetWithFallbackOutcome>>
249- SharedMemoryCache::Use::getWithFallback (const kj::String& key) const {
250- auto data = cache->data .lockExclusive ();
256+ SharedMemoryCache::Use::getWithFallback (const kj::String& key, SpanBuilder& span) const {
257+ kj::Locked<ThreadUnsafeData> data = [&] {
258+ auto memoryCacheLockRecord =
259+ ScopedDurationTagger (span, memoryCachekLockWaitTimeTag, cache->timer );
260+ return cache->data .lockExclusive ();
261+ }();
251262 KJ_IF_SOME (existingValue, cache->getWhileLocked (*data, key)) {
252263 return kj::mv (existingValue);
253264 } else KJ_IF_SOME (existingInProgress, data->inProgress .find (key)) {
@@ -374,7 +385,7 @@ jsg::Promise<jsg::JsRef<jsg::JsValue>> MemoryCache::read(jsg::Lock& js,
374385 auto readSpan = IoContext::current ().makeTraceSpan (" memory_cache_read" _kjc);
375386
376387 KJ_IF_SOME (fallback, optionalFallback) {
377- KJ_SWITCH_ONEOF (cacheUse.getWithFallback (key.value )) {
388+ KJ_SWITCH_ONEOF (cacheUse.getWithFallback (key.value , readSpan )) {
378389 KJ_CASE_ONEOF (result, kj::Own<CacheValue>) {
379390 // Optimization: Don't even release the isolate lock if the value is aleady in cache.
380391 jsg::Deserializer deserializer (js, result->bytes .asPtr ());
@@ -423,7 +434,7 @@ jsg::Promise<jsg::JsRef<jsg::JsValue>> MemoryCache::read(jsg::Lock& js,
423434 }
424435 KJ_UNREACHABLE;
425436 } else {
426- KJ_IF_SOME (cacheValue, cacheUse.getWithoutFallback (key.value )) {
437+ KJ_IF_SOME (cacheValue, cacheUse.getWithoutFallback (key.value , readSpan )) {
427438 jsg::Deserializer deserializer (js, cacheValue->bytes .asPtr ());
428439 return js.resolvedPromise (jsg::JsRef (js, deserializer.readValue (js)));
429440 }
@@ -433,10 +444,11 @@ jsg::Promise<jsg::JsRef<jsg::JsValue>> MemoryCache::read(jsg::Lock& js,
433444
434445// ======================================================================================
435446
436- MemoryCacheProvider::MemoryCacheProvider (
447+ MemoryCacheProvider::MemoryCacheProvider (const kj::MonotonicClock& timer,
437448 kj::Maybe<SharedMemoryCache::AdditionalResizeMemoryLimitHandler>
438449 additionalResizeMemoryLimitHandler)
439- : additionalResizeMemoryLimitHandler(kj::mv(additionalResizeMemoryLimitHandler)) {}
450+ : additionalResizeMemoryLimitHandler(kj::mv(additionalResizeMemoryLimitHandler)),
451+ timer (timer) {}
440452
441453MemoryCacheProvider::~MemoryCacheProvider () noexcept (false ) {
442454 // TODO(cleanup): Later, assuming progress is made on kj::Ptr<T>, we ought to be able
@@ -456,7 +468,7 @@ kj::Own<const SharedMemoryCache> MemoryCacheProvider::getInstance(
456468 -> SharedMemoryCache::AdditionalResizeMemoryLimitHandler& {
457469 return const_cast <SharedMemoryCache::AdditionalResizeMemoryLimitHandler&>(handler);
458470 });
459- return SharedMemoryCache::create (provider, id, handler);
471+ return SharedMemoryCache::create (provider, id, handler, timer );
460472 };
461473
462474 KJ_IF_SOME (cid, cacheId) {
0 commit comments