From 28c68eb4fd68f42affbf4db2c94bc0e27be04ea5 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 17 Apr 2017 12:10:29 -0700 Subject: [PATCH] Decrease JX.Leader lease duration from 16,000ms to 1,500ms and usurp more aggressively Summary: Ref T12573. `JX.Leader` synchronizes the Aphlict connection across multiple windows. Currently, we only test to see if the leader window has been closed every 16 seconds. Instead, test every 1.5 seconds. Also, make windows keep trying to become the leader forever. This was removed previously (in D15806) but I think that change decreased robustness here. Test Plan: - Opened two windows to the "Realtime" tab in DarkConsole. - Saw one become the leader and one become a follower. - (Optionally, wait for 10 seconds here to test the "keep trying to become the leader" behavior.) - Closed the leader. - Saw the follower become the leader after ~1.5 seconds. Reviewers: chad Reviewed By: chad Maniphest Tasks: T12573 Differential Revision: https://secure.phabricator.com/D17703 --- resources/celerity/map.php | 76 +++++++++++--------- webroot/rsrc/externals/javelin/lib/Leader.js | 12 ++-- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 92106cd1cf..7bfd9cb40c 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -10,8 +10,8 @@ return array( 'conpherence.pkg.css' => 'a34d59bd', 'conpherence.pkg.js' => '5f86c17d', 'core.pkg.css' => '959330a2', - 'core.pkg.js' => 'deabcef7', - 'darkconsole.pkg.js' => 'e7393ebb', + 'core.pkg.js' => '941db947', + 'darkconsole.pkg.js' => '061371d8', 'differential.pkg.css' => '90b30783', 'differential.pkg.js' => 'ddfeb49b', 'diffusion.pkg.css' => '91c5d3a6', @@ -20,7 +20,7 @@ return array( 'maniphest.pkg.css' => '4845691a', 'maniphest.pkg.js' => '5ab2753f', 'rsrc/css/aphront/aphront-bars.css' => '231ac33c', - 'rsrc/css/aphront/dark-console.css' => 'f54bf286', + 'rsrc/css/aphront/dark-console.css' => '07dd8d38', 'rsrc/css/aphront/dialog-view.css' => '685c7e2d', 'rsrc/css/aphront/list-filter-view.css' => '5d6f0526', 'rsrc/css/aphront/multi-column.css' => '84cc6640', @@ -234,7 +234,7 @@ return array( 'rsrc/externals/javelin/lib/DOM.js' => '805b806a', 'rsrc/externals/javelin/lib/History.js' => 'd4505101', 'rsrc/externals/javelin/lib/JSON.js' => '69adf288', - 'rsrc/externals/javelin/lib/Leader.js' => 'fea0eb47', + 'rsrc/externals/javelin/lib/Leader.js' => '7f243deb', 'rsrc/externals/javelin/lib/Mask.js' => '8a41885b', 'rsrc/externals/javelin/lib/Quicksand.js' => '6b8ef10b', 'rsrc/externals/javelin/lib/Request.js' => '94b750d2', @@ -363,7 +363,7 @@ return array( 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/js/application/aphlict/Aphlict.js' => '5359e785', 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'caade6f2', - 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'fb20ac8d', + 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'd82b1ff9', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '5e2634b9', 'rsrc/js/application/aphlict/behavior-desktop-notifications-control.js' => 'd5a2d665', 'rsrc/js/application/calendar/behavior-day-view.js' => '4b3c4443', @@ -482,7 +482,6 @@ return array( 'rsrc/js/core/behavior-autofocus.js' => '7319e029', 'rsrc/js/core/behavior-badge-view.js' => '8ff5e24c', 'rsrc/js/core/behavior-choose-control.js' => '327a00d1', - 'rsrc/js/core/behavior-dark-console.js' => 'f411b6ae', 'rsrc/js/core/behavior-detect-timezone.js' => '4c193c96', 'rsrc/js/core/behavior-device.js' => 'bb1dd507', 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '484a6e22', @@ -521,6 +520,9 @@ return array( 'rsrc/js/core/behavior-user-menu.js' => '31420f77', 'rsrc/js/core/behavior-watch-anchor.js' => '9f36c42d', 'rsrc/js/core/behavior-workflow.js' => '0a3f3021', + 'rsrc/js/core/darkconsole/DarkLog.js' => 'c8e1ffe3', + 'rsrc/js/core/darkconsole/DarkMessage.js' => 'c48cccdd', + 'rsrc/js/core/darkconsole/behavior-dark-console.js' => '3725c90c', 'rsrc/js/core/phtize.js' => 'd254d646', 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => 'b95d6f7d', 'rsrc/js/phui/behavior-phui-file-upload.js' => 'b003d4fb', @@ -536,7 +538,7 @@ return array( 'symbols' => array( 'almanac-css' => 'dbb9b3af', 'aphront-bars' => '231ac33c', - 'aphront-dark-console-css' => 'f54bf286', + 'aphront-dark-console-css' => '07dd8d38', 'aphront-dialog-view-css' => '685c7e2d', 'aphront-list-filter-view-css' => '5d6f0526', 'aphront-multi-column-view-css' => '84cc6640', @@ -584,7 +586,7 @@ return array( 'javelin-aphlict' => '5359e785', 'javelin-behavior' => '61cbc29a', 'javelin-behavior-aphlict-dropdown' => 'caade6f2', - 'javelin-behavior-aphlict-listen' => 'fb20ac8d', + 'javelin-behavior-aphlict-listen' => 'd82b1ff9', 'javelin-behavior-aphlict-status' => '5e2634b9', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', 'javelin-behavior-aphront-drag-and-drop-textarea' => '484a6e22', @@ -603,7 +605,7 @@ return array( 'javelin-behavior-conpherence-pontificate' => '55616e04', 'javelin-behavior-conpherence-search' => '9bbf3762', 'javelin-behavior-countdown-timer' => 'e4cc26b3', - 'javelin-behavior-dark-console' => 'f411b6ae', + 'javelin-behavior-dark-console' => '3725c90c', 'javelin-behavior-dashboard-async-panel' => '469c0d9e', 'javelin-behavior-dashboard-move-panels' => '408bf173', 'javelin-behavior-dashboard-query-panel-select' => '453c5375', @@ -720,7 +722,7 @@ return array( 'javelin-history' => 'd4505101', 'javelin-install' => '05270951', 'javelin-json' => '69adf288', - 'javelin-leader' => 'fea0eb47', + 'javelin-leader' => '7f243deb', 'javelin-magical-init' => '3010e992', 'javelin-mask' => '8a41885b', 'javelin-quicksand' => '6b8ef10b', @@ -774,6 +776,8 @@ return array( 'phabricator-content-source-view-css' => '4b8b05d4', 'phabricator-core-css' => '9f4cb463', 'phabricator-countdown-css' => '16c52f5c', + 'phabricator-darklog' => 'c8e1ffe3', + 'phabricator-darkmessage' => 'c48cccdd', 'phabricator-dashboard-css' => 'fe5b1869', 'phabricator-drag-and-drop-file-upload' => '58dea2fa', 'phabricator-draggable-list' => 'bea6e7f4', @@ -1118,6 +1122,16 @@ return array( 'javelin-dom', 'javelin-workflow', ), + '3725c90c' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-util', + 'javelin-dom', + 'javelin-request', + 'phabricator-keyboard-shortcut', + 'phabricator-darklog', + 'phabricator-darkmessage', + ), '3ab51e2c' => array( 'javelin-behavior', 'javelin-behavior-device', @@ -1475,6 +1489,9 @@ return array( 'javelin-behavior', 'javelin-history', ), + '7f243deb' => array( + 'javelin-install', + ), '8018ee50' => array( 'javelin-install', 'javelin-util', @@ -2066,6 +2083,20 @@ return array( 'javelin-dom', 'phabricator-draggable-list', ), + 'd82b1ff9' => array( + 'javelin-behavior', + 'javelin-aphlict', + 'javelin-stratcom', + 'javelin-request', + 'javelin-uri', + 'javelin-dom', + 'javelin-json', + 'javelin-router', + 'javelin-util', + 'javelin-leader', + 'javelin-sound', + 'phabricator-notification', + ), 'd835b03a' => array( 'javelin-behavior', 'javelin-dom', @@ -2173,14 +2204,6 @@ return array( 'f12cbc9f' => array( 'phui-oi-list-view-css', ), - 'f411b6ae' => array( - 'javelin-behavior', - 'javelin-stratcom', - 'javelin-util', - 'javelin-dom', - 'javelin-request', - 'phabricator-keyboard-shortcut', - ), 'f50152ad' => array( 'phui-timeline-view-css', ), @@ -2203,20 +2226,6 @@ return array( 'javelin-install', 'javelin-dom', ), - 'fb20ac8d' => array( - 'javelin-behavior', - 'javelin-aphlict', - 'javelin-stratcom', - 'javelin-request', - 'javelin-uri', - 'javelin-dom', - 'javelin-json', - 'javelin-router', - 'javelin-util', - 'javelin-leader', - 'javelin-sound', - 'phabricator-notification', - ), 'fbe497e7' => array( 'javelin-behavior', 'javelin-util', @@ -2242,9 +2251,6 @@ return array( 'javelin-view-visitor', 'javelin-util', ), - 'fea0eb47' => array( - 'javelin-install', - ), ), 'packages' => array( 'conpherence.pkg.css' => array( diff --git a/webroot/rsrc/externals/javelin/lib/Leader.js b/webroot/rsrc/externals/javelin/lib/Leader.js index 80ba7fcc44..c96e95a339 100644 --- a/webroot/rsrc/externals/javelin/lib/Leader.js +++ b/webroot/rsrc/externals/javelin/lib/Leader.js @@ -33,6 +33,8 @@ JX.install('Leader', { events: ['onBecomeLeader', 'onReceiveBroadcast'], statics: { + _leaseDuration: 1500, + _interval: null, _timeout: null, _broadcastKey: 'JX.Leader.broadcast', @@ -130,8 +132,10 @@ JX.install('Leader', { // If we haven't installed an update timer yet, do so now. This will // renew our lease every 5 seconds, making sure we hold it until the // tab is closed. - if (!self._interval && lease.until > now + 10000) { - self._interval = window.setInterval(self._write, 5000); + var interval = parseInt(self._leaseDuration / 3, 10); + + if (!self._interval && lease.until > now + (interval * 2)) { + self._interval = window.setInterval(self._write, interval); } self._becomeLeader(); @@ -227,7 +231,7 @@ JX.install('Leader', { _write: function() { var self = JX.Leader; - var str = [self._id, ((+new Date()) + 16000)].join(':'); + var str = [self._id, ((+new Date()) + self._leaseDuration)].join(':'); window.localStorage.setItem(self._leaderKey, str); }, @@ -311,8 +315,8 @@ JX.install('Leader', { */ _usurp: function() { var self = JX.Leader; - self.call(JX.bag); self._timeout = null; + self.call(JX.bag); },