···2525metrics-exporter-prometheus = { version = "0.18.1", features = ["http-listener"] }
2626mini-moka = "0.10"
2727n0-future = "0.1"
2828-repo-stream = { version = "0.5.0-alpha.3", features = ["jacquard"] }
2828+repo-stream = { version = "0.5.0-alpha.5", features = ["jacquard"] }
2929reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] }
3030rustls = { version = "0.23", default-features = false, features = ["aws-lc-rs"] }
3131rustversion = "1"
+52-47
src/mst/slice_tricks.rs
···2233use super::Span;
44use jacquard_common::types::string::Nsid;
55-use repo_stream::{MemCar, Output as WalkOutput, WalkItem};
55+use repo_stream::{MemCar, WalkItem};
66use std::cmp::Ordering;
77use std::collections::BTreeSet;
88···5151type CollectionSpan = Span<TerminatedNsid>;
52525353impl CollectionSpan {
5454- // fn contains_nsid(&self, collection: &Nsid<'_>) -> Option<bool> {
5555- // self.contains((&collection).into())
5656- // }
5757- // fn may_contain_nsid(&self, collection: &Nsid<'_>) -> bool {
5858- // self.may_contain(&collection.clone().into())
5959- // }
6054 /// get a list of NSIDs if the span has no gaps
5555+ ///
5656+ /// a CollectionSpan can be complete even if it contains gaps, as long as
5757+ /// those gaps are *within* collection-bounding keys
6158 fn complete(&self) -> Option<Vec<Nsid<'static>>> {
6259 self.is_complete()
6360 .then(|| self.things.keys().map(Into::into).collect())
···109106 }
110107 }
111108 }
109109+}
110110+111111+/// extract a span of collection NSIDs (with possible gaps) from a CAR slice
112112+fn span_from_slice(car: &mut MemCar) -> Result<CollectionSpan> {
113113+ let mut prev_gap = false;
114114+ let mut prev_collection = None;
115115+116116+ let mut span = CollectionSpan::empty();
117117+118118+ while let Some(item) = car.next()? {
119119+ assert!(
120120+ !matches!(item, WalkItem::Node { .. }),
121121+ "car.next() does not return nodes"
122122+ );
123123+ let Some(key) = item.key() else {
124124+ prev_gap = true;
125125+ continue;
126126+ };
127127+ let collection: Nsid<'_> = key
128128+ .parse::<Nsid<'_>>()
129129+ .map_err(|e| MstSliceTricksError::BadPath(format!("nsid parse: {e}")))?;
130130+131131+ if let Some(prev) = prev_collection {
132132+ // last-from-collection wins setting gap_after
133133+ span.things.insert(prev, prev_gap);
134134+ } else {
135135+ span.gap_before = prev_gap;
136136+ }
137137+138138+ prev_collection = Some((&collection).into());
139139+ }
140140+141141+ if let Some(prev) = prev_collection {
142142+ // last-from-collection wins setting gap_after
143143+ span.things.insert(prev, prev_gap);
144144+ } else {
145145+ span.gap_before = prev_gap;
146146+ }
147147+148148+ Ok(span)
149149+}
150150+151151+/// Estimate whether or not the full CAR is small, from a slice
152152+///
153153+/// pretty basic rn, just checks if its root node is layer 0 or 1 (hard max 200,
154154+/// 800 entries, respectively)
155155+fn likely_from_small_repo(car: &mut MemCar) -> bool {
156156+ car.height() <= 1
112157}
113158114159#[cfg(test)]
···269314 assert!(s.could_cover(&nsids(&["a.b.c.d"])));
270315 }
271316}
272272-273273-fn span_from_slice(car: &mut MemCar) -> Result<CollectionSpan> {
274274- let mut prev_gap = false;
275275- let mut prev_collection = None;
276276-277277- let mut span = CollectionSpan::empty();
278278-279279- while let Some(item) = car.next()? {
280280- match item {
281281- WalkItem::MissingSubtree { .. } => {
282282- prev_gap = true;
283283- }
284284- WalkItem::Record(WalkOutput { key, .. }) | WalkItem::MissingRecord { key, .. } => {
285285- let collection: Nsid<'_> = key
286286- .parse()
287287- .map_err(|e| MstSliceTricksError::BadPath(format!("nsid parse: {e}")))?;
288288- let terminated = (&collection).into();
289289-290290- if let Some(prev) = prev_collection {
291291- // last-from-collection wins setting gap_after
292292- span.things.insert(prev, prev_gap);
293293- } else {
294294- span.gap_before = prev_gap;
295295- }
296296-297297- prev_collection = Some(terminated);
298298- }
299299- WalkItem::Node { .. } => unreachable!("repostream mem::next doesn't output nodes"),
300300- }
301301- }
302302-303303- if let Some(prev) = prev_collection {
304304- // last-from-collection wins setting gap_after
305305- span.things.insert(prev, prev_gap);
306306- } else {
307307- span.gap_before = prev_gap;
308308- }
309309-310310- Ok(span)
311311-}
+1-1
src/sync/resync/describe_repo.rs
···104104 .map_err(|e| GetCollectionsError::InvalidData(format!("bad rev in commit: {e}")))?;
105105106106 // shuffle repo-stream raw cid => jacquard cid wrapper
107107- let data = mem_car.commit.data.clone().into();
107107+ let data = mem_car.commit.data.into();
108108109109 let proven_collections =
110110 crate::mst::collections::extract_from_slice(&mut mem_car).map_err(|e| {
+1-1
src/sync/resync/get_repo.rs
···7070 let rev = Tid::new(&mem_car.commit.rev)
7171 .map_err(|e| GetCollectionsError::InvalidData(format!("bad rev in commit: {e}")))?;
72727373- let data = mem_car.commit.data.clone().into();
7373+ let data = mem_car.commit.data.into();
74747575 let collections = crate::mst::collections::extract_from_full(mem_car)
7676 .await