@@ -103,7 +103,12 @@ impl traits::SecretStorage for Rc<RefCell<SecretStore>> {
103103
104104#[ derive( Debug , Default ) ]
105105pub struct EntryStore {
106- entries : HashMap < NamespaceId , Vec < AuthorisedEntry > > ,
106+ stores : HashMap < NamespaceId , NamespaceStore > ,
107+ }
108+
109+ #[ derive( Debug , Default ) ]
110+ pub struct NamespaceStore {
111+ entries : Vec < AuthorisedEntry > ,
107112 events : EventQueue < StoreEvent > ,
108113}
109114
@@ -199,8 +204,9 @@ impl traits::EntryReader for Rc<RefCell<EntryStore>> {
199204 range : & Range3d ,
200205 ) -> impl Iterator < Item = Result < AuthorisedEntry > > + ' a {
201206 let slf = self . borrow ( ) ;
202- slf. entries
207+ slf. stores
203208 . get ( & namespace)
209+ . map ( |s| & s. entries )
204210 . into_iter ( )
205211 . flatten ( )
206212 . filter ( |entry| range. includes_entry ( entry. entry ( ) ) )
@@ -216,10 +222,11 @@ impl traits::EntryReader for Rc<RefCell<EntryStore>> {
216222 path : & Path ,
217223 ) -> Result < Option < AuthorisedEntry > > {
218224 let inner = self . borrow ( ) ;
219- let Some ( entries) = inner. entries . get ( & namespace) else {
225+ let Some ( entries) = inner. stores . get ( & namespace) else {
220226 return Ok ( None ) ;
221227 } ;
222228 Ok ( entries
229+ . entries
223230 . iter ( )
224231 . find ( |e| {
225232 let e = e. entry ( ) ;
@@ -231,10 +238,11 @@ impl traits::EntryReader for Rc<RefCell<EntryStore>> {
231238
232239impl EntryStore {
233240 fn ingest_entry ( & mut self , entry : & AuthorisedEntry , origin : EntryOrigin ) -> Result < bool > {
234- let entries = self
235- . entries
241+ let store = self
242+ . stores
236243 . entry ( * entry. entry ( ) . namespace_id ( ) )
237244 . or_default ( ) ;
245+ let entries = & mut store. entries ;
238246 let new = entry. entry ( ) ;
239247 let mut to_prune = vec ! [ ] ;
240248 for ( i, existing) in entries. iter ( ) . enumerate ( ) {
@@ -258,7 +266,7 @@ impl EntryStore {
258266 }
259267 for i in to_prune {
260268 let pruned = entries. remove ( i) ;
261- self . events . insert ( move |id| {
269+ store . events . insert ( move |id| {
262270 StoreEvent :: Pruned (
263271 id,
264272 traits:: PruneEvent {
@@ -269,7 +277,8 @@ impl EntryStore {
269277 } ) ;
270278 }
271279 entries. push ( entry. clone ( ) ) ;
272- self . events
280+ store
281+ . events
273282 . insert ( |id| StoreEvent :: Ingested ( id, entry. clone ( ) , origin) ) ;
274283 Ok ( true )
275284 }
@@ -284,11 +293,23 @@ impl traits::EntryStorage for Rc<RefCell<EntryStore>> {
284293 }
285294
286295 fn snapshot ( & self ) -> Result < Self :: Snapshot > {
287- let entries = self . borrow ( ) . entries . clone ( ) ;
288- Ok ( Rc :: new ( RefCell :: new ( EntryStore {
289- entries,
290- events : EventQueue :: default ( ) ,
291- } ) ) )
296+ // This is quite ugly. But this is a quick memory impl only.
297+ // But we should really maybe strive to not expose snapshots.
298+ let stores = self
299+ . borrow ( )
300+ . stores
301+ . iter ( )
302+ . map ( |( key, value) | {
303+ (
304+ * key,
305+ NamespaceStore {
306+ entries : value. entries . clone ( ) ,
307+ events : Default :: default ( ) ,
308+ } ,
309+ )
310+ } )
311+ . collect ( ) ;
312+ Ok ( Rc :: new ( RefCell :: new ( EntryStore { stores } ) ) )
292313 }
293314
294315 fn ingest_entry ( & self , entry : & AuthorisedEntry , origin : EntryOrigin ) -> Result < bool > {
@@ -302,11 +323,18 @@ impl traits::EntryStorage for Rc<RefCell<EntryStore>> {
302323 area : Area ,
303324 params : SubscribeParams ,
304325 ) -> impl Stream < Item = traits:: StoreEvent > + Unpin + ' static {
326+ let progress_id = self
327+ . borrow_mut ( )
328+ . stores
329+ . entry ( namespace)
330+ . or_default ( )
331+ . events
332+ . next_progress_id ( ) ;
305333 EventStream {
306334 area,
307335 params,
308336 namespace,
309- progress_id : self . borrow ( ) . events . next_progress_id ( ) ,
337+ progress_id,
310338 store : Rc :: downgrade ( & self ) ,
311339 }
312340 }
@@ -345,16 +373,18 @@ struct EventStream {
345373impl Stream for EventStream {
346374 type Item = StoreEvent ;
347375 fn poll_next ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
348- let Some ( store ) = self . store . upgrade ( ) else {
376+ let Some ( inner ) = self . store . upgrade ( ) else {
349377 return Poll :: Ready ( None ) ;
350378 } ;
351- let mut store = store. borrow_mut ( ) ;
379+ let mut inner_mut = inner. borrow_mut ( ) ;
380+ let store = inner_mut. stores . entry ( self . namespace ) . or_default ( ) ;
352381 let res = ready ! ( store. events. poll_next(
353382 self . progress_id,
354383 |e| e. matches( self . namespace, & self . area, & self . params) ,
355384 cx,
356385 ) ) ;
357- drop ( store) ;
386+ drop ( inner_mut) ;
387+ drop ( inner) ;
358388 Poll :: Ready ( match res {
359389 None => None ,
360390 Some ( ( next_id, event) ) => {
0 commit comments