@@ -92,18 +92,26 @@ impl Manager {
9292 self . repos . insert ( did, state) ;
9393 repos += 1 ;
9494 }
95- let mut queue = 0 ;
95+
96+ let mut cursor = self . firehose . last_key_value ( ) ?. map ( |( k, _) | k. into ( ) ) . unwrap_or_default ( ) ;
97+ let mut queue_drained = 0 ;
98+ let mut queue_pending = 0 ;
9699 for res in self . queue . keys ( ) {
97100 let key = res?;
98101 #[ expect( clippy:: unwrap_used) ]
99102 let key = std:: str:: from_utf8 ( & key) . unwrap ( ) ;
100103 #[ expect( clippy:: unwrap_used) ]
101- self . resolver . resolve ( key. split ( '>' ) . next ( ) . unwrap ( ) ) ?;
102- queue += 1 ;
104+ let did = key. split ( '>' ) . next ( ) . unwrap ( ) ;
105+ if self . resolver . resolve ( did) ?. is_some ( ) {
106+ self . scan_did ( & mut cursor, did) ?;
107+ queue_drained += 1 ;
108+ } else {
109+ queue_pending += 1 ;
110+ }
103111 }
104- let mut seq = self . firehose . last_key_value ( ) ? . map ( | ( k , _ ) | k . into ( ) ) . unwrap_or_default ( ) ;
105- tracing:: info!( %hosts, %repos, %queue , %seq , "loaded state" ) ;
106- while self . update ( & mut seq ) . await ? { }
112+
113+ tracing:: info!( %hosts, %repos, %queue_drained , %queue_pending , %cursor , "loaded state" ) ;
114+ while self . update ( & mut cursor ) . await ? { }
107115 tracing:: info!( "shutting down validator" ) ;
108116 SHUTDOWN . store ( true , Ordering :: Relaxed ) ;
109117 Ok ( ( ) )
@@ -266,83 +274,87 @@ impl Manager {
266274 self . hosts . insert ( host. clone ( ) , ( seq, time) ) ;
267275 }
268276
269- let mut batch: Option < Batch > = None ;
270277 for did in self . resolver . poll ( ) . await ? {
271- let Some ( ( pds, key) ) = self . resolver . resolve ( & did) ? else {
272- continue ;
273- } ;
278+ self . scan_did ( cursor, & did) ?;
279+ }
274280
275- for res in self . queue . prefix ( & did) {
276- let ( k, input) = res?;
277- batch. get_or_insert_with ( || DB . batch ( ) ) . remove ( & self . queue , k. clone ( ) ) ;
278-
279- #[ expect( clippy:: unwrap_used) ]
280- let host = std:: str:: from_utf8 ( & k) . unwrap ( ) . split ( '>' ) . nth ( 1 ) . unwrap ( ) ;
281- let span = tracing:: debug_span!( "msg_read" , %host, len = %input. len( ) ) ;
282- let _enter = span. enter ( ) ;
283-
284- #[ expect( clippy:: unwrap_used) ]
285- let event = SubscribeReposEvent :: parse ( & input) ?. unwrap ( ) ; // already parsed
286- let type_ = event. type_ ( ) ;
287- let seq = event. seq ( ) ;
288- let time = event. time ( ) ;
289- let did = event. did ( ) ;
290- let span = tracing:: debug_span!( "msg_data" , type = %type_, %seq, %time, %did) ;
291- let _enter = span. enter ( ) ;
292-
293- #[ expect( clippy:: unwrap_used) ]
294- let ( commit, head) = event. commit ( ) ?. unwrap ( ) ; // already parsed
295- let span =
296- tracing:: debug_span!( "validate" , rev = %commit. rev, data = %commit. data, %head) ;
297- let _enter = span. enter ( ) ;
298-
299- if let Some ( pds) = pds {
300- if host != pds {
301- tracing:: debug!( %pds, "hostname pds mismatch" ) ;
302- continue ;
303- }
281+ Ok ( true )
282+ }
283+
284+ fn scan_did ( & mut self , cursor : & mut Cursor , did : & str ) -> Result < ( ) , ManagerError > {
285+ let Some ( ( pds, key) ) = self . resolver . resolve ( did) ? else { unreachable ! ( ) } ;
286+
287+ let mut batch: Option < Batch > = None ;
288+ for res in self . queue . prefix ( & did) {
289+ let ( k, input) = res?;
290+ batch. get_or_insert_with ( || DB . batch ( ) ) . remove ( & self . queue , k. clone ( ) ) ;
291+
292+ #[ expect( clippy:: unwrap_used) ]
293+ let host = std:: str:: from_utf8 ( & k) . unwrap ( ) . split ( '>' ) . nth ( 1 ) . unwrap ( ) ;
294+ let span = tracing:: debug_span!( "msg_read" , %host, len = %input. len( ) ) ;
295+ let _enter = span. enter ( ) ;
296+
297+ #[ expect( clippy:: unwrap_used) ]
298+ let event = SubscribeReposEvent :: parse ( & input) ?. unwrap ( ) ; // already parsed
299+ let type_ = event. type_ ( ) ;
300+ let seq = event. seq ( ) ;
301+ let time = event. time ( ) ;
302+ let did = event. did ( ) ;
303+ let span = tracing:: debug_span!( "msg_data" , type = %type_, %seq, %time, %did) ;
304+ let _enter = span. enter ( ) ;
305+
306+ #[ expect( clippy:: unwrap_used) ]
307+ let ( commit, head) = event. commit ( ) ?. unwrap ( ) ; // already parsed
308+ let span =
309+ tracing:: debug_span!( "validate" , rev = %commit. rev, data = %commit. data, %head) ;
310+ let _enter = span. enter ( ) ;
311+
312+ if let Some ( pds) = pds {
313+ if host != pds {
314+ tracing:: debug!( %pds, "hostname pds mismatch" ) ;
315+ continue ;
304316 }
317+ }
305318
306- // verify signature
307- match utils:: verify_commit_sig ( & commit, key) {
308- Ok ( valid) => {
309- if !valid {
310- tracing:: debug!( ?key, "signature mismatch" ) ;
311- continue ;
312- }
313- }
314- Err ( err) => {
315- tracing:: debug!( %err, ?key, "signature check error" ) ;
319+ // verify signature
320+ match utils:: verify_commit_sig ( & commit, key) {
321+ Ok ( valid) => {
322+ if !valid {
323+ tracing:: debug!( ?key, "signature mismatch" ) ;
316324 continue ;
317325 }
318326 }
327+ Err ( err) => {
328+ tracing:: debug!( %err, ?key, "signature check error" ) ;
329+ continue ;
330+ }
331+ }
319332
320- // verify commit message
321- let rev = commit. rev ;
322- let data = commit. data ;
323- let entry = self . repos . entry ( commit. did ) ;
324- if let SubscribeReposEvent :: Commit ( commit) = & event {
325- // TODO: should still validate records existing in blocks, etc
326- if let Entry :: Occupied ( prev) = & entry {
327- let prev = prev. get ( ) ;
328- let span = tracing:: debug_span!( "previous" , rev = %prev. rev, data = %prev. data, head = %prev. head) ;
329- let _enter = span. enter ( ) ;
330- if !utils:: verify_commit_event ( commit, data, prev) {
331- continue ;
332- }
333+ // verify commit message
334+ let rev = commit. rev ;
335+ let data = commit. data ;
336+ let entry = self . repos . entry ( commit. did ) ;
337+ if let SubscribeReposEvent :: Commit ( commit) = & event {
338+ // TODO: should still validate records existing in blocks, etc
339+ if let Entry :: Occupied ( prev) = & entry {
340+ let prev = prev. get ( ) ;
341+ let span = tracing:: debug_span!( "previous" , rev = %prev. rev, data = %prev. data, head = %prev. head) ;
342+ let _enter = span. enter ( ) ;
343+ if !utils:: verify_commit_event ( commit, data, prev) {
344+ continue ;
333345 }
334346 }
335-
336- let msg = event. serialize ( input. len ( ) , cursor. next ( ) ) ?;
337- self . firehose . insert ( * cursor, msg) ?;
338- entry. insert ( RepoState { rev, data, head } ) ;
339347 }
348+
349+ let msg = event. serialize ( input. len ( ) , cursor. next ( ) ) ?;
350+ self . firehose . insert ( * cursor, msg) ?;
351+ entry. insert ( RepoState { rev, data, head } ) ;
340352 }
341353 if let Some ( batch) = batch {
342354 batch. commit ( ) ?;
343355 }
344356
345- Ok ( true )
357+ Ok ( ( ) )
346358 }
347359}
348360
0 commit comments