Skip to content

Commit

Permalink
feat: Add Repository::drop_index and ::drop_data_from_index
Browse files Browse the repository at this point in the history
  • Loading branch information
aawsome committed May 13, 2024
1 parent e7ee2f1 commit ee46589
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 5 deletions.
6 changes: 6 additions & 0 deletions crates/core/src/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,12 @@ impl GlobalIndex {
}
}
}

pub(crate) fn drop_data(self) -> Self {
Self {
index: Arc::new(self.into_index().drop_data()),
}
}
}

impl ReadGlobalIndex for GlobalIndex {}
17 changes: 17 additions & 0 deletions crates/core/src/index/binarysorted.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,23 @@ pub(crate) struct TypeIndex {
#[derive(Debug)]
pub struct Index(BlobTypeMap<TypeIndex>);

impl Index {
/// drop all index entries related to data blobs
pub(crate) fn drop_data(self) -> Self {
Self(self.0.map(|blob_type, i| {
if blob_type == BlobType::Data {
TypeIndex {
packs: Vec::new(),
entries: EntriesVariants::None,
total_size: 0,
}
} else {
i
}
}))
}
}

impl IndexCollector {
#[must_use]
pub fn new(tpe: IndexType) -> Self {
Expand Down
4 changes: 3 additions & 1 deletion crates/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,5 +148,7 @@ pub use crate::{
repofile::snapshotfile::{
PathList, SnapshotGroup, SnapshotGroupCriterion, SnapshotOptions, StringList,
},
repository::{IndexedFull, OpenStatus, Repository, RepositoryOptions},
repository::{
IndexedFull, IndexedIds, IndexedTree, Open, OpenStatus, Repository, RepositoryOptions,
},
};
67 changes: 63 additions & 4 deletions crates/core/src/repository.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1264,18 +1264,25 @@ pub trait IndexedTree: Open {
type I: ReadGlobalIndex;

fn index(&self) -> &Self::I;
fn into_open(self) -> impl Open;
}

/// A repository which is indexed such that all tree blobs are contained in the index
/// and additionally the `Id`s of data blobs are also contained in the index.
pub trait IndexedIds: IndexedTree {}
pub trait IndexedIds: IndexedTree {
fn into_indexed_tree(self) -> impl IndexedTree;
}

impl<P, S: IndexedTree> IndexedTree for Repository<P, S> {
type I = S::I;

fn index(&self) -> &Self::I {
self.status.index()
}

fn into_open(self) -> impl Open {
self.status.into_open()
}
}

#[derive(Clone, Copy, Debug)]
Expand Down Expand Up @@ -1330,6 +1337,12 @@ pub struct IndexedStatus<T, S: Open> {
open: S,
}

#[derive(Debug, Clone, Copy)]
/// A type of an index, that only contains [`Id`]s.
///
/// Used for the [`IndexedTrees`] state of a repository in [`IndexedStatus`].
pub struct TreeIndex;

#[derive(Debug, Clone, Copy)]
/// A type of an index, that only contains [`Id`]s.
///
Expand All @@ -1351,13 +1364,35 @@ impl<T, S: Open> IndexedTree for IndexedStatus<T, S> {
fn index(&self) -> &Self::I {
&self.index
}

fn into_open(self) -> impl Open {
self.open
}
}

impl<S: Open> IndexedIds for IndexedStatus<IdIndex, S> {}
impl<S: Open> IndexedIds for IndexedStatus<IdIndex, S> {
fn into_indexed_tree(self) -> impl IndexedTree {
Self {
index: self.index.drop_data(),
..self
}
}
}

impl<S: Open> IndexedIds for IndexedStatus<FullIndex, S> {}
impl<S: Open> IndexedIds for IndexedStatus<FullIndex, S> {
fn into_indexed_tree(self) -> impl IndexedTree {
Self {
index: self.index.drop_data(),
..self
}
}
}

impl<P, S: IndexedFull> IndexedIds for Repository<P, S> {}
impl<P, S: IndexedFull> IndexedIds for Repository<P, S> {
fn into_indexed_tree(self) -> impl IndexedTree {
self.status.into_indexed_tree()
}
}

impl<S: Open> IndexedFull for IndexedStatus<FullIndex, S> {
fn get_blob_or_insert_with(
Expand Down Expand Up @@ -1533,6 +1568,18 @@ impl<P, S: IndexedTree> Repository<P, S> {
) -> RusticResult<FindMatches> {
Tree::find_matching_nodes(self.dbe(), self.index(), ids, matches)
}

/// drop the `Repository` index leaving an `Open` `Repository`
pub fn drop_index(self) -> Repository<P, impl Open> {
Repository {
name: self.name,
be: self.be,
be_hot: self.be_hot,
opts: self.opts,
pb: self.pb,
status: self.status.into_open(),
}
}
}

impl<P: ProgressBars, S: IndexedTree> Repository<P, S> {
Expand Down Expand Up @@ -1758,6 +1805,18 @@ impl<P, S: IndexedFull> Repository<P, S> {
pub fn get_blob_cached(&self, id: &Id, tpe: BlobType) -> RusticResult<Bytes> {
self.get_blob_or_insert_with(id, || self.index().blob_from_backend(self.dbe(), tpe, id))
}

/// drop the data pack information from the `Repository` index leaving an `IndexedTree` `Repository`
pub fn drop_data_from_index(self) -> Repository<P, impl IndexedTree> {
Repository {
name: self.name,
be: self.be,
be_hot: self.be_hot,
opts: self.opts,
pb: self.pb,
status: self.status.into_indexed_tree(),
}
}
}

impl<P: ProgressBars, S: IndexedFull> Repository<P, S> {
Expand Down

0 comments on commit ee46589

Please sign in to comment.