fn populate()

in content-addressed-cache/src/synchronizer.rs [156:231]


    fn populate(&self, keyset_id: &KeysetID, dest_cache: &dyn Cache) -> Result<PopulateResult> {
        let commit = self
            .repo
            .find_reference(&tag_fmt(&self.namespace, keyset_id))
            .context("Resolving reference")?;
        let kv_tree = commit.peel_to_tree().context("Resolving tree")?;

        let mut entry_count = 0;
        let mut new_entry_count = 0;
        let mut failed_entry_count = 0;
        for tree_entry in kv_tree.iter() {
            entry_count += 1;

            let object = match tree_entry.to_object(&self.repo) {
                Ok(object) => object,
                Err(_) => {
                    warn!(
                        "Could not find object for tree entry {:X?}",
                        tree_entry.name_bytes()
                    );
                    continue;
                }
            };
            let name = match tree_entry.name() {
                Some(name) => name,
                None => {
                    warn!("{:X?} not utf-8", tree_entry.name_bytes());
                    continue;
                }
            };
            let CompositeKey { kind, key } = match CompositeKey::from_str(name) {
                Ok(key) => key,
                Err(_) => {
                    warn!("Tree entry {} is not a composite_key", name);
                    continue;
                }
            };
            let blob = match object.as_blob() {
                Some(blob) => blob,
                None => {
                    warn!(?object, "Tree entry was not a blob");
                    continue;
                }
            };

            match dest_cache.get(kind, key) {
                Ok(Some(_)) => {
                    // Already present, do nothing.
                    continue;
                }
                Ok(None) => {
                    // Insert below.
                }
                Err(e) => {
                    // Insert below.
                    warn!(?kind, ?key, ?e, "Failed to get key from cache");
                }
            }

            match dest_cache.put(kind, key, blob.content()) {
                Ok(()) => {
                    new_entry_count += 1;
                }
                Err(e) => {
                    failed_entry_count += 1;
                    warn!(?object, ?e, "Failed to insert key into Cache");
                }
            }
        }

        Ok(PopulateResult {
            entry_count,
            new_entry_count,
            failed_entry_count,
        })
    }