diff --git a/polkadot/node/core/runtime-api/src/cache.rs b/polkadot/node/core/runtime-api/src/cache.rs index d2582a26ad..c075b73d27 100644 --- a/polkadot/node/core/runtime-api/src/cache.rs +++ b/polkadot/node/core/runtime-api/src/cache.rs @@ -102,7 +102,7 @@ pub(crate) struct RequestResultCache { candidate_pending_availability: MemoryLruCache<(Hash, ParaId), ResidentSizeOf>>, candidate_events: MemoryLruCache>>, - session_info: MemoryLruCache>>, + session_info: MemoryLruCache>, dmq_contents: MemoryLruCache<(Hash, ParaId), ResidentSizeOf>>>, inbound_hrmp_channels_contents: MemoryLruCache< @@ -309,18 +309,12 @@ impl RequestResultCache { self.candidate_events.insert(relay_parent, ResidentSizeOf(events)); } - pub(crate) fn session_info( - &mut self, - key: (Hash, SessionIndex), - ) -> Option<&Option> { - self.session_info.get(&key.1).map(|v| &v.0) + pub(crate) fn session_info(&mut self, key: SessionIndex) -> Option<&SessionInfo> { + self.session_info.get(&key).map(|v| &v.0) } - pub(crate) fn cache_session_info(&mut self, key: SessionIndex, value: Option) { - // only cache Some(SessionInfo) - if value.is_some() { - self.session_info.insert(key, ResidentSizeOf(value)); - } + pub(crate) fn cache_session_info(&mut self, key: SessionIndex, value: SessionInfo) { + self.session_info.insert(key, ResidentSizeOf(value)); } pub(crate) fn dmq_contents( diff --git a/polkadot/node/core/runtime-api/src/lib.rs b/polkadot/node/core/runtime-api/src/lib.rs index 95202eee9b..e1e23d1620 100644 --- a/polkadot/node/core/runtime-api/src/lib.rs +++ b/polkadot/node/core/runtime-api/src/lib.rs @@ -147,7 +147,9 @@ where CandidateEvents(relay_parent, events) => self.requests_cache.cache_candidate_events(relay_parent, events), SessionInfo(_relay_parent, session_index, info) => - self.requests_cache.cache_session_info(session_index, info), + if let Some(info) = info { + self.requests_cache.cache_session_info(session_index, info); + }, DmqContents(relay_parent, para_id, messages) => self.requests_cache.cache_dmq_contents((relay_parent, para_id), messages), InboundHrmpChannelsContents(relay_parent, para_id, contents) => self @@ -235,8 +237,15 @@ where .map(|sender| Request::CandidatePendingAvailability(para, sender)), Request::CandidateEvents(sender) => query!(candidate_events(), sender).map(|sender| Request::CandidateEvents(sender)), - Request::SessionInfo(index, sender) => query!(session_info(index), sender) - .map(|sender| Request::SessionInfo(index, sender)), + Request::SessionInfo(index, sender) => { + if let Some(info) = self.requests_cache.session_info(index) { + self.metrics.on_cached_request(); + let _ = sender.send(Ok(Some(info.clone()))); + None + } else { + Some(Request::SessionInfo(index, sender)) + } + }, Request::DmqContents(id, sender) => query!(dmq_contents(id), sender).map(|sender| Request::DmqContents(id, sender)), Request::InboundHrmpChannelsContents(id, sender) =>