Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3206)

Unified Diff: chrome/browser/resources/google_now/background.js

Issue 14743007: Retries with exponential backoff for dismissals (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: skare@ comments Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/google_now/background.js
diff --git a/chrome/browser/resources/google_now/background.js b/chrome/browser/resources/google_now/background.js
index 3c4bf8f5c5e95148f1d39da830bb396fc8de8779..0fdbd6724c10e7292d530e9fbf3dc12adacdf8ec 100644
--- a/chrome/browser/resources/google_now/background.js
+++ b/chrome/browser/resources/google_now/background.js
@@ -53,22 +53,21 @@ var INITIAL_POLLING_PERIOD_SECONDS = 5 * 60; // 5 minutes
*/
var MAXIMUM_POLLING_PERIOD_SECONDS = 60 * 60; // 1 hour
-var UPDATE_NOTIFICATIONS_ALARM_NAME = 'UPDATE';
-
/**
- * Period for retrying the server request for dismissing cards.
+ * Initial period for retrying the server request for dismissing cards.
*/
-var RETRY_DISMISS_PERIOD_SECONDS = 60; // 1 minute
+var INITIAL_RETRY_DISMISS_PERIOD_SECONDS = 60; // 1 minute
-var RETRY_DISMISS_ALARM_NAME = 'RETRY_DISMISS';
+/**
+ * Maximum period for retrying the server request for dismissing cards.
+ */
+var MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS = 60 * 60; // 1 hour
/**
* Time we keep dismissals after successful server dismiss requests.
*/
var DISMISS_RETENTION_TIME_MS = 20 * 60 * 1000; // 20 minutes
-var storage = chrome.storage.local;
-
/**
* Names for tasks that can be created by the extension.
*/
@@ -121,6 +120,17 @@ tasks.instrumentApiFunction(chrome.runtime.onStartup, 'addListener', 0);
tasks.instrumentApiFunction(chrome.tabs, 'create', 1);
tasks.instrumentApiFunction(storage, 'get', 1);
+var updateCardsAttempts = buildAttemptManager(
+ 'cards-update',
+ requestLocation,
+ INITIAL_POLLING_PERIOD_SECONDS,
+ MAXIMUM_POLLING_PERIOD_SECONDS);
+var dismissalAttempts = buildAttemptManager(
+ 'dismiss',
+ retryPendingDismissals,
+ INITIAL_RETRY_DISMISS_PERIOD_SECONDS,
+ MAXIMUM_RETRY_DISMISS_PERIOD_SECONDS);
+
/**
* Diagnostic event identifier.
* @enum {number}
@@ -293,13 +303,9 @@ function parseAndShowNotificationCards(response, callback) {
}
}
- scheduleNextUpdate(parsedResponse.expiration_timestamp_seconds);
+ updateCardsAttempts.start(parsedResponse.expiration_timestamp_seconds);
skare_ 2013/05/14 02:03:52 just as an opinion as a first-time reader, name fo
vadimt 2013/05/14 18:47:50 'Request' has connotations with a single network r
- // Now that we got a valid response from the server, reset the retry period
- // to the initial value. This retry period will be used the next time we
- // fail to get the server-provided period.
storage.set({
- retryDelaySeconds: INITIAL_POLLING_PERIOD_SECONDS,
activeNotifications: notificationsData,
recentDismissals: updatedRecentDismissals
});
@@ -372,23 +378,7 @@ function updateNotificationsCards(position) {
' @' + new Date());
tasks.add(UPDATE_CARDS_TASK_NAME, function(callback) {
console.log('updateNotificationsCards-task-begin');
- tasks.debugSetStepName('updateNotificationsCards-get-retryDelaySeconds');
- storage.get('retryDelaySeconds', function(items) {
- console.log('updateNotificationsCards-get-retryDelaySeconds ' +
- JSON.stringify(items));
- // Immediately schedule the update after the current retry period. Then,
- // we'll use update time from the server if available.
- scheduleNextUpdate(items.retryDelaySeconds);
-
- // TODO(vadimt): Consider interrupting waiting for the next update if we
- // detect that the network conditions have changed. Also, decide whether
- // the exponential backoff is needed both when we are offline and when
- // there are failures on the server side.
- var newRetryDelaySeconds =
- Math.min(items.retryDelaySeconds * 2 * (1 + 0.2 * Math.random()),
- MAXIMUM_POLLING_PERIOD_SECONDS);
- storage.set({retryDelaySeconds: newRetryDelaySeconds});
-
+ updateCardsAttempts.planForNext(function() {
processPendingDismissals(function(success) {
if (success) {
// The cards are requested only if there are no unsent dismissals.
@@ -460,7 +450,7 @@ function processPendingDismissals(callbackBoolean) {
function doProcessDismissals() {
if (items.pendingDismissals.length == 0) {
- chrome.alarms.clear(RETRY_DISMISS_ALARM_NAME);
+ dismissalAttempts.stop();
onFinish(true);
return;
}
@@ -490,7 +480,9 @@ function processPendingDismissals(callbackBoolean) {
*/
function retryPendingDismissals() {
tasks.add(RETRY_DISMISS_TASK_NAME, function(callback) {
- processPendingDismissals(function(success) { callback(); });
+ dismissalAttempts.planForNext(function() {
+ processPendingDismissals(function(success) { callback(); });
+ });
});
}
@@ -538,15 +530,7 @@ function onNotificationClosed(notificationId, byUser) {
chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed');
tasks.add(DISMISS_CARD_TASK_NAME, function(callback) {
- // Schedule retrying dismissing until all dismissals go through.
- // TODO(vadimt): Implement exponential backoff and unify it with getting
- // cards.
- var alarmInfo = {
- delayInMinutes: RETRY_DISMISS_PERIOD_SECONDS / 60,
- periodInMinutes: RETRY_DISMISS_PERIOD_SECONDS / 60
- };
-
- chrome.alarms.create(RETRY_DISMISS_ALARM_NAME, alarmInfo);
+ dismissalAttempts.start();
// Deleting the notification in case it was re-added while this task was
// scheduled, waiting for execution.
@@ -568,37 +552,19 @@ function onNotificationClosed(notificationId, byUser) {
}
/**
- * Schedules next update for notification cards.
- * @param {int} delaySeconds Length of time in seconds after which the alarm
- * event should fire.
- */
-function scheduleNextUpdate(delaySeconds) {
- console.log('scheduleNextUpdate ' + delaySeconds);
- // Schedule an alarm after the specified delay. 'periodInMinutes' is for the
- // case when we fail to re-register the alarm.
- var alarmInfo = {
- delayInMinutes: delaySeconds / 60,
- periodInMinutes: MAXIMUM_POLLING_PERIOD_SECONDS / 60
- };
-
- chrome.alarms.create(UPDATE_NOTIFICATIONS_ALARM_NAME, alarmInfo);
-}
-
-/**
* Initializes the event page on install or on browser startup.
*/
function initialize() {
+ // Create an update timer for a case when for some reason location request
+ // gets stuck.
+ updateCardsAttempts.start(MAXIMUM_POLLING_PERIOD_SECONDS);
+
var initialStorage = {
activeNotifications: {},
- recentDismissals: {},
- retryDelaySeconds: INITIAL_POLLING_PERIOD_SECONDS
+ recentDismissals: {}
};
storage.set(initialStorage);
- // Create an update timer for a case when for some reason location request
- // gets stuck.
- scheduleNextUpdate(MAXIMUM_POLLING_PERIOD_SECONDS);
-
requestLocation();
}
@@ -615,13 +581,6 @@ chrome.runtime.onStartup.addListener(function() {
initialize();
});
-chrome.alarms.onAlarm.addListener(function(alarm) {
- if (alarm.name == UPDATE_NOTIFICATIONS_ALARM_NAME)
- requestLocation();
- else if (alarm.name == RETRY_DISMISS_ALARM_NAME)
- retryPendingDismissals();
-});
-
chrome.notifications.onClicked.addListener(
function(notificationId) {
chrome.metricsPrivate.recordUserAction('GoogleNow.MessageClicked');
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/manifest.json » ('j') | chrome/browser/resources/google_now/manifest.json » ('J')

Powered by Google App Engine
This is Rietveld 408576698