Lines Matching refs:rollout

44  * PreferenceRollouts store info about an active or expired preference rollout.
49 * The current state of the rollout: "active", "rolled-back", "graduated".
51 * means that the rollout was previously active, but has been rolled back for
53 * rollout value, and so Normandy is no longer managing the preference.
55 * An array of preferences specifications involved in the rollout.
58 * telemetry related to this rollout. It should not be re-used by other
63 * PreferenceSpec describe how a preference should change during a rollout.
72 * The value the preference would have on the default branch if this rollout
78 const DB_NAME = "normandy-preference-rollout";
105 * Get a transaction for interacting with the rollout store.
128 // A set of rollout slugs that are obsolete based on the code in this build of
131 // graduation system cannot detect that the rollout should hand off to the
134 "pref-webrender-intel-rollout-70-release",
135 "bug-1703186-rollout-http3-support-release-88-89",
136 "rollout-doh-nightly-rollout-to-all-us-desktop-users-nightly-74-80-bug-1613481",
137 "rollout-doh-beta-rollout-to-all-us-desktop-users-v2-beta-74-80-bug-1613489",
138 "rollout-doh-us-staged-rollout-to-all-us-desktop-users-release-73-77-bug-1586331",
139 "bug-1648229-rollout-comcast-steering-rollout-release-78-80",
140 "bug-1732206-rollout-fission-release-rollout-release-94-95",
141 "bug-1745237-rollout-fission-beta-96-97-rollout-beta-96-97",
142 "bug-1750601-rollout-doh-steering-in-canada-staggered-starting-for-release-97-98",
146 * Update the rollout database with changes that happened during early startup.
150 for (const rollout of await this.getAllActive()) {
153 // Count the number of preferences in this rollout that are now redundant.
156 for (const prefSpec of rollout.preferences) {
170 if (prefMatchingDefaultCount === rollout.preferences.length) {
171 // Firefox's builtin defaults have caught up to the rollout, making all
172 // of the rollout's changes redundant, so graduate the rollout.
173 await this.graduate(rollout, "all-prefs-match");
174 // `this.graduate` writes the rollout to the db, so we don't need to do it anymore.
180 await getStore(db, "readwrite").put(rollout);
188 for (const rollout of await this.getAllActive()) {
189 if (this.GRADUATION_SET.has(rollout.slug)) {
190 await this.graduate(rollout, "in-graduation-set");
193 TelemetryEnvironment.setExperimentActive(rollout.slug, rollout.state, {
196 rollout.enrollmentId || TelemetryEvents.NO_ENROLLMENT_ID_MARKER,
204 for (const rollout of rollouts) {
205 rollout.enrollmentId = TelemetryEvents.NO_ENROLLMENT_ID_MARKER;
211 * Test wrapper that temporarily replaces the stored rollout data with fake
241 * Add a new rollout
242 * @param {PreferenceRollout} rollout
244 async add(rollout) {
245 if (!rollout.enrollmentId) {
249 return getStore(db, "readwrite").add(rollout);
253 * Update an existing rollout
254 * @param {PreferenceRollout} rollout
255 * @throws If a matching rollout does not exist.
257 async update(rollout) {
258 if (!(await this.has(rollout.slug))) {
260 `Tried to update ${rollout.slug}, but it doesn't already exist.`
264 return getStore(db, "readwrite").put(rollout);
298 await Promise.all(rollouts.map(rollout => store.put(rollout)));
302 * Test whether there is a rollout in storage with the given slug.
308 const rollout = await getStore(db, "readonly").get(slug);
309 return !!rollout;
313 * Get a rollout by slug
330 return rollouts.filter(rollout => rollout.state === this.STATE_ACTIVE);
335 * On startup, we read these to set the rollout values.
343 for (const rollout of await this.getAllActive()) {
344 for (const prefSpec of rollout.preferences) {
353 async graduate(rollout, reason) {
354 log.debug(`Graduating rollout: ${rollout.slug}`);
355 rollout.state = this.STATE_GRADUATED;
357 await getStore(db, "readwrite").put(rollout);
358 TelemetryEvents.sendEvent("graduate", "preference_rollout", rollout.slug, {
361 rollout.enrollmentId || TelemetryEvents.NO_ENROLLMENT_ID_MARKER,