Skip to content

Commit ecd8f5c

Browse files
Bug 2034610 - Reduce allocations in unenroll_for_gecko_pref (#7351)
We end up allocating a Vec<Vec<T>> and calling concat() instead of allocating a Vec<T> and passing a &mut Vec<T> in these functions.
1 parent 6bc810e commit ecd8f5c

2 files changed

Lines changed: 8 additions & 11 deletions

File tree

components/nimbus/src/stateful/enrollment.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,18 +167,16 @@ pub fn unenroll_for_pref(
167167
unenroll_reason: PrefUnenrollReason,
168168
triggering_pref_name: &str,
169169
gecko_pref_store: Option<&GeckoPrefStore>,
170-
) -> Result<Vec<EnrollmentChangeEvent>> {
171-
let mut events = vec![];
170+
events: &mut Vec<EnrollmentChangeEvent>,
171+
) -> Result<()> {
172172
let enr_store = db.get_store(StoreId::Enrollments);
173173
if let Ok(Some(existing_enrollment)) =
174174
enr_store.get::<ExperimentEnrollment, Writer>(writer, experiment_slug)
175175
{
176-
#[cfg(feature = "stateful")]
177176
existing_enrollment
178177
.maybe_revert_unchanged_gecko_pref_states(triggering_pref_name, gecko_pref_store);
179178

180-
let updated_enrollment =
181-
&existing_enrollment.on_pref_unenroll(unenroll_reason, &mut events);
179+
let updated_enrollment = &existing_enrollment.on_pref_unenroll(unenroll_reason, events);
182180
enr_store.put(writer, experiment_slug, updated_enrollment)?;
183181
} else {
184182
events.push(EnrollmentChangeEvent {
@@ -189,7 +187,7 @@ pub fn unenroll_for_pref(
189187
});
190188
}
191189

192-
Ok(events)
190+
Ok(())
193191
}
194192

195193
pub fn get_experiment_participation<'r>(

components/nimbus/src/stateful/nimbus_client.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ impl NimbusClient {
790790
pref_state: GeckoPrefState,
791791
pref_unenroll_reason: PrefUnenrollReason,
792792
) -> Result<Vec<EnrollmentChangeEvent>> {
793+
let mut events = Vec::new();
793794
if let Some(prefs) = self.gecko_prefs.clone() {
794795
{
795796
let mut pref_store_state = prefs.get_mutable_pref_state();
@@ -802,18 +803,17 @@ impl NimbusClient {
802803
let db = self.db()?;
803804
let mut writer = db.write()?;
804805

805-
let mut results = Vec::new();
806806
if let Some(enrollments) = enrollments {
807807
for experiment_slug in enrollments {
808-
let result = unenroll_for_pref(
808+
unenroll_for_pref(
809809
db,
810810
&mut writer,
811811
&experiment_slug,
812812
pref_unenroll_reason,
813813
&pref_state.gecko_pref.pref,
814814
self.gecko_prefs.as_deref(),
815+
&mut events,
815816
)?;
816-
results.push(result);
817817
}
818818
} else {
819819
warn!(
@@ -823,9 +823,8 @@ impl NimbusClient {
823823

824824
let mut state = self.mutable_state.lock().unwrap();
825825
self.end_initialize(db, writer, &mut state)?;
826-
return Ok(results.concat());
827826
}
828-
Ok(Vec::new())
827+
Ok(events)
829828
}
830829

831830
pub fn register_previous_gecko_pref_states(

0 commit comments

Comments
 (0)