kopia lustrzana https://github.com/c9/core
Merge pull request +6614 from c9/fix/vfs-multi-attempt
Make vfs client use 2 parallel calls to find a vfs sererpull/43/merge
commit
e47d7de387
|
@ -3,6 +3,9 @@ define(function(require, exports, module) {
|
||||||
|
|
||||||
main.consumes = ["Plugin", "auth", "http", "api", "error_handler", "metrics"];
|
main.consumes = ["Plugin", "auth", "http", "api", "error_handler", "metrics"];
|
||||||
main.provides = ["vfs.endpoint"];
|
main.provides = ["vfs.endpoint"];
|
||||||
|
|
||||||
|
var PARALLEL_SEARCHES=2;
|
||||||
|
|
||||||
return main;
|
return main;
|
||||||
|
|
||||||
function main(options, imports, register) {
|
function main(options, imports, register) {
|
||||||
|
@ -169,8 +172,22 @@ define(function(require, exports, module) {
|
||||||
if (servers.length && !servers.filter(function(s) { return s.version !== version; }).length)
|
if (servers.length && !servers.filter(function(s) { return s.version !== version; }).length)
|
||||||
return onProtocolChange(callback);
|
return onProtocolChange(callback);
|
||||||
|
|
||||||
|
var latestServer = 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
|
// just take the first server that doesn't return an error
|
||||||
(function tryNext(i) {
|
function tryNext(i) {
|
||||||
|
if (foundServer) return false;
|
||||||
if (i >= servers.length) {
|
if (i >= servers.length) {
|
||||||
metrics.increment("vfs.failed.connect_all", 1, true);
|
metrics.increment("vfs.failed.connect_all", 1, true);
|
||||||
return callback(new Error("Disconnected: Could not reach your workspace. Please try again later."));
|
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) {
|
if (err) {
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
tryNext(i+1);
|
tryNext(++latestServer);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -241,7 +258,32 @@ define(function(require, exports, module) {
|
||||||
var vfs = rememberVfs(server, res.vfsid);
|
var vfs = rememberVfs(server, res.vfsid);
|
||||||
callback(null, vfs.vfsid, server.url, server.region);
|
callback(null, vfs.vfsid, server.url, server.region);
|
||||||
});
|
});
|
||||||
})(0);
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function startParallelSearches (totalRunners) {
|
||||||
|
var attemptedServers = {};
|
||||||
|
for (var s = 0; s < servers.length && s < totalRunners; s++) {
|
||||||
|
latestServer = s;
|
||||||
|
var server = servers[s];
|
||||||
|
var serverHostUrl = getHostFromServerUrl(server.url);
|
||||||
|
if (!attemptedServers[serverHostUrl]) {
|
||||||
|
attemptedServers[serverHostUrl] = 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 serverHostUrl = serverUrl.replace(/^(https:..[^.]+-\d+)(-\d+)(.*)/, "$1$3");
|
||||||
|
if (serverHostUrl) {
|
||||||
|
return serverHostUrl;
|
||||||
|
}
|
||||||
|
return serverUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onProtocolChange(callback) {
|
function onProtocolChange(callback) {
|
||||||
|
|
Ładowanie…
Reference in New Issue