wait-for-cassandra
Version:
Wait for a Cassandra connection to become available
96 lines (86 loc) • 3.66 kB
JavaScript
// Generated by CoffeeScript 1.10.0
(function() {
var Q, cassandra, durations, program, runScript, waitForCassandra;
Q = require('q');
cassandra = require('cassandra-driver');
program = require('commander');
durations = require('durations');
waitForCassandra = function(config, totalTimeout, quiet) {
var attempts, connectTimeout, connectWatch, deferred, ref, ref1, testConnection, watch;
if (totalTimeout == null) {
totalTimeout = 30000;
}
if (quiet == null) {
quiet = false;
}
deferred = Q.defer();
watch = durations.stopwatch().start();
connectWatch = durations.stopwatch();
connectTimeout = (ref = config != null ? (ref1 = config.socketOptions) != null ? ref1.connectTimeout : void 0 : void 0) != null ? ref : 1000;
attempts = 0;
testConnection = function() {
var client;
attempts += 1;
connectWatch.reset().start();
client = new cassandra.Client(config);
return client.connect(function(error) {
var connectDelay, totalRemaining;
if (error != null) {
if (!quiet) {
console.log("[" + error + "] Attempt " + attempts + " timed out. Time elapsed: " + watch);
}
if (watch.duration().millis() > totalTimeout) {
if (!quiet) {
console.log("Could not connect to Cassandra.");
}
client.shutdown();
return deferred.resolve(false);
} else {
client.shutdown();
totalRemaining = Math.min(connectTimeout, Math.max(0, totalTimeout - watch.duration().millis()));
connectDelay = Math.min(totalRemaining, Math.max(0, connectTimeout - connectWatch.duration().millis()));
return setTimeout(testConnection, connectDelay);
}
} else {
watch.stop();
if (!quiet) {
console.log("Connected. " + attempts + " attempts over " + watch);
}
client.shutdown();
return deferred.resolve(true);
}
});
};
testConnection();
return deferred.promise;
};
runScript = function() {
var config, connectTimeout, quiet, ref, ref1, ref2, ref3, ref4, ref5, totalTimeout;
program.option('-k, --keyspace <keyspace_name>', 'Cassandra keyspace to use (default is "system")').option('-h, --host <hostname>', 'Cassandra host (default is localhost)').option('-p, --port <port>', 'Cassandra port (default is 9042)', parseInt).option('-q, --quiet', 'Silence non-error output (default is false)').option('-t, --connect-timeout <milliseconds>', 'Individual connection attempt timeout (default is 1000)', parseInt).option('-T, --total-timeout <milliseconds>', 'Total timeout across all connect attempts (default is 30000)', parseInt).parse(process.argv);
connectTimeout = (ref = program.connectTimeout) != null ? ref : 1000;
totalTimeout = (ref1 = program.totalTimeout) != null ? ref1 : 30000;
quiet = (ref2 = program.quiet) != null ? ref2 : false;
config = {
contactPoints: [(ref3 = program.host) != null ? ref3 : 'localhost'],
keyspace: (ref4 = program.keyspace) != null ? ref4 : 'system',
protocolOptions: {
port: (ref5 = program.port) != null ? ref5 : 9042
},
socketOptions: {
connectTimeout: connectTimeout
}
};
return waitForCassandra(config, totalTimeout, quiet).then(function(connected) {
var code;
code = connected ? 0 : 1;
return process.exit(code);
});
};
module.exports = {
await: waitForCassandra,
run: runScript
};
if (require.main === module) {
runScript();
}
}).call(this);