Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d22eee50 authored by Dennis Shen's avatar Dennis Shen Committed by Gerrit Code Review
Browse files

Merge changes from topic "index_instead_of_offset" into main

* changes:
  aconfig: update storage write api
  aconfig: update storage read api
  aconfig: update storage file creation to allow storage files to store flag index instead of byte offset
  aconfig: update storage file to store flag index instead of file byte offset
parents e836a3a2 0efe4796
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ impl FlagTableNodeWrapper {
        package_id: u32,
        flag_name: &str,
        flag_type: StoredFlagType,
        flag_id: u16,
        flag_index: u16,
        num_buckets: u32,
    ) -> Self {
        let bucket_index = FlagTableNode::find_bucket_index(package_id, flag_name, num_buckets);
@@ -56,7 +56,7 @@ impl FlagTableNodeWrapper {
            package_id,
            flag_name: flag_name.to_string(),
            flag_type,
            flag_id,
            flag_index,
            next_offset: None,
        };
        Self { node, bucket_index }
+2 −2
Original line number Diff line number Diff line
@@ -41,14 +41,14 @@ pub fn create_flag_value(container: &str, packages: &[FlagPackage]) -> Result<Fl
    };

    for pkg in packages.iter() {
        let start_offset = pkg.boolean_offset as usize;
        let start_index = pkg.boolean_start_index as usize;
        let flag_ids = assign_flag_ids(pkg.package_name, pkg.boolean_flags.iter().copied())?;
        for pf in pkg.boolean_flags.iter() {
            let fid = flag_ids
                .get(pf.name())
                .ok_or(anyhow!(format!("missing flag id for {}", pf.name())))?;

            list.booleans[start_offset + (*fid as usize)] = pf.state() == ProtoFlagState::ENABLED;
            list.booleans[start_index + (*fid as usize)] = pf.state() == ProtoFlagState::ENABLED;
        }
    }

+11 −12
Original line number Diff line number Diff line
@@ -33,9 +33,9 @@ pub struct FlagPackage<'a> {
    pub package_id: u32,
    pub flag_names: HashSet<&'a str>,
    pub boolean_flags: Vec<&'a ProtoParsedFlag>,
    // offset of the first boolean flag in this flag package with respect to the start of
    // boolean flag value array in the flag value file
    pub boolean_offset: u32,
    // The index of the first boolean flag in this aconfig package among all boolean
    // flags in this container.
    pub boolean_start_index: u32,
}

impl<'a> FlagPackage<'a> {
@@ -45,7 +45,7 @@ impl<'a> FlagPackage<'a> {
            package_id,
            flag_names: HashSet::new(),
            boolean_flags: vec![],
            boolean_offset: 0,
            boolean_start_index: 0,
        }
    }

@@ -73,12 +73,11 @@ where
        }
    }

    // calculate package flag value start offset, in flag value file, each boolean
    // is stored as a single byte
    let mut boolean_offset = 0;
    // cacluate boolean flag start index for each package
    let mut boolean_start_index = 0;
    for p in packages.iter_mut() {
        p.boolean_offset = boolean_offset;
        boolean_offset += p.boolean_flags.len() as u32;
        p.boolean_start_index = boolean_start_index;
        boolean_start_index += p.boolean_flags.len() as u32;
    }

    packages
@@ -184,7 +183,7 @@ mod tests {
        assert!(packages[0].flag_names.contains("enabled_rw"));
        assert!(packages[0].flag_names.contains("disabled_rw"));
        assert!(packages[0].flag_names.contains("enabled_ro"));
        assert_eq!(packages[0].boolean_offset, 0);
        assert_eq!(packages[0].boolean_start_index, 0);

        assert_eq!(packages[1].package_name, "com.android.aconfig.storage.test_2");
        assert_eq!(packages[1].package_id, 1);
@@ -192,13 +191,13 @@ mod tests {
        assert!(packages[1].flag_names.contains("enabled_ro"));
        assert!(packages[1].flag_names.contains("disabled_ro"));
        assert!(packages[1].flag_names.contains("enabled_fixed_ro"));
        assert_eq!(packages[1].boolean_offset, 3);
        assert_eq!(packages[1].boolean_start_index, 3);

        assert_eq!(packages[2].package_name, "com.android.aconfig.storage.test_4");
        assert_eq!(packages[2].package_id, 2);
        assert_eq!(packages[2].flag_names.len(), 2);
        assert!(packages[2].flag_names.contains("enabled_ro"));
        assert!(packages[2].flag_names.contains("enabled_fixed_ro"));
        assert_eq!(packages[2].boolean_offset, 6);
        assert_eq!(packages[2].boolean_start_index, 6);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ impl PackageTableNodeWrapper {
        let node = PackageTableNode {
            package_name: String::from(package.package_name),
            package_id: package.package_id,
            boolean_offset: package.boolean_offset,
            boolean_start_index: package.boolean_start_index,
            next_offset: None,
        };
        let bucket_index = PackageTableNode::find_bucket_index(package.package_name, num_buckets);
+6 −5
Original line number Diff line number Diff line
@@ -100,7 +100,8 @@ pub struct FlagTableNode {
    pub package_id: u32,
    pub flag_name: String,
    pub flag_type: StoredFlagType,
    pub flag_id: u16,
    // within package flag index of this flag type
    pub flag_index: u16,
    pub next_offset: Option<u32>,
}

@@ -109,8 +110,8 @@ impl fmt::Debug for FlagTableNode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        writeln!(
            f,
            "Package Id: {}, Flag: {}, Type: {:?}, Offset: {}, Next: {:?}",
            self.package_id, self.flag_name, self.flag_type, self.flag_id, self.next_offset
            "Package Id: {}, Flag: {}, Type: {:?}, Index: {}, Next: {:?}",
            self.package_id, self.flag_name, self.flag_type, self.flag_index, self.next_offset
        )?;
        Ok(())
    }
@@ -125,7 +126,7 @@ impl FlagTableNode {
        result.extend_from_slice(&(name_bytes.len() as u32).to_le_bytes());
        result.extend_from_slice(name_bytes);
        result.extend_from_slice(&(self.flag_type as u16).to_le_bytes());
        result.extend_from_slice(&self.flag_id.to_le_bytes());
        result.extend_from_slice(&self.flag_index.to_le_bytes());
        result.extend_from_slice(&self.next_offset.unwrap_or(0).to_le_bytes());
        result
    }
@@ -137,7 +138,7 @@ impl FlagTableNode {
            package_id: read_u32_from_bytes(bytes, &mut head)?,
            flag_name: read_str_from_bytes(bytes, &mut head)?,
            flag_type: StoredFlagType::try_from(read_u16_from_bytes(bytes, &mut head)?)?,
            flag_id: read_u16_from_bytes(bytes, &mut head)?,
            flag_index: read_u16_from_bytes(bytes, &mut head)?,
            next_offset: match read_u32_from_bytes(bytes, &mut head)? {
                0 => None,
                val => Some(val),
Loading