in below/store/src/cursor.rs [262:297]
fn update_or_advance_shard(&mut self, direction: Direction) -> Result<bool> {
let entries = get_index_files(&self.path)?;
let entries_iter: Box<dyn Iterator<Item = &String>> = match direction {
Direction::Forward => Box::new(entries.iter()),
Direction::Reverse => Box::new(entries.iter().rev()),
};
for entry in entries_iter {
let v: Vec<&str> = entry.split('_').collect();
if v.len() != 2 {
warn!(self.logger, "Invalid index file name: {}", entry);
continue;
}
let entry_shard = match v[1].parse::<u64>() {
Ok(val) => val,
_ => {
warn!(self.logger, "Cannot parse index shard: {}", entry);
continue;
}
};
if let Some(shard) = self.shard.as_ref() {
if entry_shard.cmp(shard) == direction.get_skip_order() {
continue;
}
}
// Try to refresh the current shard (any new entries appended?) or
// move to a different shard.
if self.update_shard(entry_shard)? {
return Ok(true);
}
}
Ok(false)
}