Add DualClusterClient for live testing phase of backend/frontend split

This commit is contained in:
calzoneman 2016-04-23 19:53:18 -07:00
parent 295c2a41a8
commit b69bd82a72
6 changed files with 79 additions and 2 deletions

View File

@ -19,6 +19,7 @@ try {
}
var Config = require("./lib/config");
var Logger = require("./lib/logger");
const Switches = require("./lib/switches");
require("source-map-support").install();
Config.load("config.yaml");
@ -61,5 +62,16 @@ function handleLine(line) {
Logger.syslog.log("Deleted old channel tables");
}
});
} else if (line.indexOf("/switch") === 0) {
var args = line.split(" ");
args.shift();
if (args.length === 1) {
Logger.syslog.log("Switch " + args[0] + " is " +
(Switches.isActive(args[0]) ? "ON" : "OFF"));
} else if (args.length === 2) {
Switches.setActive(args[0], args[1].toLowerCase() === "on" ? true : false);
Logger.syslog.log("Switch " + args[0] + " is now " +
(Switches.isActive(args[0]) ? "ON" : "OFF"));
}
}
}

View File

@ -1,4 +1,6 @@
import { RedisClusterClient } from '../io/cluster/redisclusterclient';
import { DualClusterClient } from '../io/cluster/dualclusterclient';
import NullClusterClient from '../io/cluster/nullclusterclient';
import { FrontendPool } from 'cytube-common/lib/redis/frontendpool';
import RedisClientProvider from 'cytube-common/lib/redis/redisclientprovider';
import { loadFromToml } from 'cytube-common/lib/configuration/configloader';
@ -6,6 +8,9 @@ import path from 'path';
import { BackendConfiguration } from './backendconfiguration';
import logger from 'cytube-common/lib/logger';
import redisAdapter from 'socket.io-redis';
import LegacyConfig from '../config';
import IOConfiguration from '../configuration/ioconfig';
import * as Switches from '../switches';
const BACKEND_CONFIG_PATH = path.resolve(__dirname, '..', '..', 'backend.toml');
@ -67,7 +72,19 @@ class BackendModule {
this.redisClusterClient = new RedisClusterClient(this.getFrontendPool());
}
return this.redisClusterClient;
if (Switches.isActive(Switches.DUAL_BACKEND) && !this.nullClusterClient) {
this.nullClusterClient = new NullClusterClient(
IOConfiguration.fromOldConfig(LegacyConfig));
}
if (Switches.isActive(Switches.DUAL_BACKEND)) {
this.clusterClient = new DualClusterClient(this.nullClusterClient,
this.redisClusterClient);
} else {
this.clusterClient = this.redisClusterClient;
}
return this.clusterClient;
}
}

View File

@ -0,0 +1,27 @@
import logger from 'cytube-common/lib/logger';
import * as Switches from '../../switches';
class DualClusterClient {
constructor(authoritativeClient, altClient) {
this.authoritativeClient = authoritativeClient;
this.altClient = altClient;
}
getSocketConfig(channel) {
return this.authoritativeClient.getSocketConfig(channel).then(result => {
if (!Switches.isActive(Switches.DUAL_BACKEND)) {
return result;
}
return this.altClient.getSocketConfig(channel).then(altResult => {
result.alt = altResult.servers;
return result;
}).catch(error => {
logger.warn(`Error loading alt servers: ${error}`);
return result;
});
})
}
}
export { DualClusterClient };

View File

@ -1,3 +1,8 @@
import Promise from 'bluebird';
const ONE_SECOND = 1000;
const ERR_TIMEOUT = 'Timed out when retrieving server information';
class RedisClusterClient {
constructor(frontendPool) {
this.frontendPool = frontendPool;
@ -10,7 +15,7 @@ class RedisClusterClient {
}
return { servers: result };
});
}).timeout(ONE_SECOND, ERR_TIMEOUT);
}
}

View File

@ -48,6 +48,8 @@ import WebConfiguration from './configuration/webconfig';
import NullClusterClient from './io/cluster/nullclusterclient';
import session from './session';
import { LegacyModule } from './legacymodule';
import * as Switches from './switches';
console.log(Switches);
var Server = function () {
var self = this;
@ -62,6 +64,9 @@ var Server = function () {
// backend init
var initModule;
if (Config.get("new-backend")) {
if (Config.get("dual-backend")) {
Switches.setActive(Switches.DUAL_BACKEND, true);
}
const BackendModule = require('./backend/backendmodule').BackendModule;
initModule = new BackendModule();
} else {

11
src/switches.js Normal file
View File

@ -0,0 +1,11 @@
const switches = {};
export function isActive(switchName) {
return switches.hasOwnProperty(switchName) && switches[switchName] === true;
}
export function setActive(switchName, active) {
switches[switchName] = active;
}
export const DUAL_BACKEND = 'DUAL_BACKEND';