From 747ab7f54340d74a7b6fccdc551fd035853d9230 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Mon, 11 May 2015 13:03:57 +0000 Subject: [PATCH 1/4] Merge remote-tracking branch 'origin/master' into fix/vfs-multi-attempt Conflicts: plugins/c9.vfs.client/endpoint.js --- package.json | 12 +++++------ plugins/c9.vfs.client/endpoint.js | 33 ++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 8328d0e0..e49a5744 100644 --- a/package.json +++ b/package.json @@ -60,15 +60,15 @@ "c9.ide.language.css": "#ef8a28943e", "c9.ide.language.generic": "#32986699ac", "c9.ide.language.html": "#bbe81afed1", - "c9.ide.language.html.diff": "#24f3608d26", + "c9.ide.language.html.diff": "#a7311cfc9f", "c9.ide.language.javascript": "#8479d0a9c1", - "c9.ide.language.javascript.immediate": "#0535804ada", + "c9.ide.language.javascript.immediate": "#9a2cce9121", "c9.ide.language.javascript.eslint": "#2db744b1a3", "c9.ide.language.javascript.tern": "#7aab8b0b6a", "c9.ide.language.javascript.infer": "#cfec494a3c", "c9.ide.language.jsonalyzer": "#dab3edfca5", "c9.ide.collab": "#e9dd74e31e", - "c9.ide.local": "#a9703b630c", + "c9.ide.local": "#2bfd7ff051", "c9.ide.find": "#6cc6d3379d", "c9.ide.find.infiles": "#72582de3cd", "c9.ide.find.replace": "#e4daf722b8", @@ -77,7 +77,7 @@ "c9.ide.ace.emmet": "#e5f1a92ac3", "c9.ide.ace.gotoline": "#4d1a93172c", "c9.ide.ace.keymaps": "#43445d6306", - "c9.ide.ace.repl": "#f3a62c1f2a", + "c9.ide.ace.repl": "#ada99852fa", "c9.ide.ace.split": "#0ae0151c78", "c9.ide.ace.statusbar": "#d95be89d53", "c9.ide.ace.stripws": "#cf0f42ac59", @@ -91,14 +91,14 @@ "c9.ide.imgeditor": "#ed89162aa7", "c9.ide.immediate": "#6845a93705", "c9.ide.installer": "#70bb0e85f4", - "c9.ide.mount": "#896ebf836e", + "c9.ide.mount": "#32e79866ee", "c9.ide.navigate": "#7c58c7f3d7", "c9.ide.newresource": "#f1f0624768", "c9.ide.openfiles": "#28a4f5af16", "c9.ide.preview": "#0bd8dd6e8c", "c9.ide.preview.browser": "#ac18aaf31d", "c9.ide.preview.markdown": "#ab8d30ad9f", - "c9.ide.pubsub": "#a85fb27eca", + "c9.ide.pubsub": "#92ec19ed3a", "c9.ide.readonly": "#f6f07bbe42", "c9.ide.recentfiles": "#7c099abf40", "c9.ide.remote": "#cd45e81d2f", diff --git a/plugins/c9.vfs.client/endpoint.js b/plugins/c9.vfs.client/endpoint.js index 6da0c793..a19d93dc 100644 --- a/plugins/c9.vfs.client/endpoint.js +++ b/plugins/c9.vfs.client/endpoint.js @@ -3,6 +3,9 @@ define(function(require, exports, module) { main.consumes = ["Plugin", "auth", "http", "api", "error_handler", "metrics"]; main.provides = ["vfs.endpoint"]; + + var PARALLEL_SEARCHES=3; + return main; function main(options, imports, register) { @@ -168,10 +171,24 @@ define(function(require, exports, module) { // check for version if (servers.length && !servers.filter(function(s) { return s.version !== version; }).length) return onProtocolChange(callback); - + + var nextServer = 0; + var foundServer = false; + + /* Create a callback that is only ever called once */ + var mainCallback = callback; + callback = function() { + if (!foundServer) { + foundServer = true; + var args = Array.prototype.slice.call(arguments); + return mainCallback.apply(this, args); + } + }; + // just take the first server that doesn't return an error - (function tryNext(i) { - if (i >= servers.length) { + function tryNext(i) { + if (foundServer) return false; + if (i >= servers.length) metrics.increment("vfs.failed.connect_all", 1, true); return callback(new Error("Disconnected: Could not reach your workspace. Please try again later.")); } @@ -233,7 +250,7 @@ define(function(require, exports, module) { if (err) { setTimeout(function() { - tryNext(i+1); + tryNext(++nextServer); }, 2000); return; } @@ -241,7 +258,13 @@ define(function(require, exports, module) { var vfs = rememberVfs(server, res.vfsid); callback(null, vfs.vfsid, server.url, server.region); }); - })(0); + }; + + + // Kick off some parallel runners to find a vfs server. + for (var s = 0; s < servers.length && s < PARALLEL_SEARCHES; s++) { + tryNext(nextServer++); + } } function onProtocolChange(callback) { From 7279d926f166b4676ff39c535e9232944282dfb4 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Mon, 11 May 2015 14:07:45 +0000 Subject: [PATCH 2/4] Only 2 parallel runners. Don't make both go to the same server --- plugins/c9.vfs.client/endpoint.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/c9.vfs.client/endpoint.js b/plugins/c9.vfs.client/endpoint.js index a19d93dc..ed82cf71 100644 --- a/plugins/c9.vfs.client/endpoint.js +++ b/plugins/c9.vfs.client/endpoint.js @@ -4,7 +4,7 @@ define(function(require, exports, module) { main.consumes = ["Plugin", "auth", "http", "api", "error_handler", "metrics"]; main.provides = ["vfs.endpoint"]; - var PARALLEL_SEARCHES=3; + var PARALLEL_SEARCHES=2; return main; @@ -172,7 +172,7 @@ define(function(require, exports, module) { if (servers.length && !servers.filter(function(s) { return s.version !== version; }).length) return onProtocolChange(callback); - var nextServer = 0; + var latestServer = 0; var foundServer = false; /* Create a callback that is only ever called once */ @@ -188,7 +188,7 @@ define(function(require, exports, module) { // just take the first server that doesn't return an error function tryNext(i) { if (foundServer) return false; - if (i >= servers.length) + if (i >= servers.length) { metrics.increment("vfs.failed.connect_all", 1, true); return callback(new Error("Disconnected: Could not reach your workspace. Please try again later.")); } @@ -250,7 +250,7 @@ define(function(require, exports, module) { if (err) { setTimeout(function() { - tryNext(++nextServer); + tryNext(++latestServer); }, 2000); return; } @@ -262,8 +262,16 @@ define(function(require, exports, module) { // Kick off some parallel runners to find a vfs server. + var attemptedServers = {}; // Keep a list of servers we've attempted so upon this first parallel attempt we don't just smash all ports on the same vfs server. for (var s = 0; s < servers.length && s < PARALLEL_SEARCHES; s++) { - tryNext(nextServer++); + latestServer = s; // Keep in sync with s, if runners fail we want them to try other vfs server's starting from nextServer + var server = servers[s]; + var serverMatch = server.url.match(/vfs-gce-[a-z]+-[0-9]+/); // server.url looks like: https://vfs-gce-ae-09-2.c9.io or https://vfs.c9.dev/vfs we're grabbing the base url of the host (without the -2) + var serverBaseUrl = serverMatch ? serverMatch[0] : server.url; + if (!attemptedServers[serverBaseUrl]) { + attemptedServers[serverBaseUrl] = true; + tryNext(s); + } } } From a4e8ee0e48dbd9d843929eb175972f0c08785c03 Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 13 May 2015 10:10:56 +0000 Subject: [PATCH 3/4] More functions, less comments --- plugins/c9.vfs.client/endpoint.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/plugins/c9.vfs.client/endpoint.js b/plugins/c9.vfs.client/endpoint.js index ed82cf71..e29d0cb0 100644 --- a/plugins/c9.vfs.client/endpoint.js +++ b/plugins/c9.vfs.client/endpoint.js @@ -261,18 +261,29 @@ define(function(require, exports, module) { }; - // Kick off some parallel runners to find a vfs server. - var attemptedServers = {}; // Keep a list of servers we've attempted so upon this first parallel attempt we don't just smash all ports on the same vfs server. - for (var s = 0; s < servers.length && s < PARALLEL_SEARCHES; s++) { - latestServer = s; // Keep in sync with s, if runners fail we want them to try other vfs server's starting from nextServer - var server = servers[s]; - var serverMatch = server.url.match(/vfs-gce-[a-z]+-[0-9]+/); // server.url looks like: https://vfs-gce-ae-09-2.c9.io or https://vfs.c9.dev/vfs we're grabbing the base url of the host (without the -2) - var serverBaseUrl = serverMatch ? serverMatch[0] : server.url; - if (!attemptedServers[serverBaseUrl]) { - attemptedServers[serverBaseUrl] = true; - tryNext(s); + function startParallelSearches (totalRunners) { + var attemptedServers = {}; + for (var s = 0; s < servers.length && s < totalRunners; s++) { + latestServer = s; + var server = servers[s]; + var serverHostname = getHostFromServerUrl(server.url); + if (!attemptedServers[serverHostname]) { + attemptedServers[serverHostname] = true; + tryNext(s); + } } } + + startParallelSearches(PARALLEL_SEARCHES); + } + + function getHostFromServerUrl(serverUrl) { + // server.url looks like: https://vfs-gce-ae-09-2.c9.io or https://vfs.c9.dev/vfs we're grabbing the base url of the host (without the -2) + var serverMatch = serverUrl.replace(/^(https:..[^.]+-\d+)(-\d+)(.*)/, "$1$3"); + if (serverMatch) { + return serverMatch[0]; + } + return serverUrl; } function onProtocolChange(callback) { From 91eb6a5d55ba4823fe425ba1f0ceceb3d5b50def Mon Sep 17 00:00:00 2001 From: Tim Robinson Date: Wed, 13 May 2015 10:12:56 +0000 Subject: [PATCH 4/4] Renaming things --- plugins/c9.vfs.client/endpoint.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/c9.vfs.client/endpoint.js b/plugins/c9.vfs.client/endpoint.js index e29d0cb0..d2abe6a2 100644 --- a/plugins/c9.vfs.client/endpoint.js +++ b/plugins/c9.vfs.client/endpoint.js @@ -266,9 +266,9 @@ define(function(require, exports, module) { for (var s = 0; s < servers.length && s < totalRunners; s++) { latestServer = s; var server = servers[s]; - var serverHostname = getHostFromServerUrl(server.url); - if (!attemptedServers[serverHostname]) { - attemptedServers[serverHostname] = true; + var serverHostUrl = getHostFromServerUrl(server.url); + if (!attemptedServers[serverHostUrl]) { + attemptedServers[serverHostUrl] = true; tryNext(s); } } @@ -279,9 +279,9 @@ define(function(require, exports, module) { function getHostFromServerUrl(serverUrl) { // server.url looks like: https://vfs-gce-ae-09-2.c9.io or https://vfs.c9.dev/vfs we're grabbing the base url of the host (without the -2) - var serverMatch = serverUrl.replace(/^(https:..[^.]+-\d+)(-\d+)(.*)/, "$1$3"); - if (serverMatch) { - return serverMatch[0]; + var serverHostUrl = serverUrl.replace(/^(https:..[^.]+-\d+)(-\d+)(.*)/, "$1$3"); + if (serverHostUrl) { + return serverHostUrl; } return serverUrl; }