You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ca...@codespot.com on 2011/11/29 13:28:03 UTC

[cassandra-node] 2 new revisions pushed by tomaz.muraus on 2011-11-29 12:26 GMT

2 new revisions:

Revision: 266b18e0f6dc
Author:   Tomaz Muraus <to...@tomaz.me>
Date:     Tue Nov 29 04:11:51 2011
Log:      Set a timeout for each step which is performed when a Connection  
to Ca...
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=266b18e0f6dc

Revision: 7cd24791bb99
Author:   Tomaz Muraus <to...@tomaz.me>
Date:     Tue Nov 29 04:24:56 2011
Log:      Add a test case for it.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=7cd24791bb99

==============================================================================
Revision: 266b18e0f6dc
Author:   Tomaz Muraus <to...@tomaz.me>
Date:     Tue Nov 29 04:11:51 2011
Log:      Set a timeout for each step which is performed when a Connection  
to Cassandra has been successfully established.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=266b18e0f6dc

Added:
  /lib/util.js
Modified:
  /lib/driver.js

=======================================
--- /dev/null
+++ /lib/util.js	Tue Nov 29 04:11:51 2011
@@ -0,0 +1,15 @@
+/**
+ * Wrap a function so that the original function will only be called once,
+ * regardless of how  many times the wrapper is called.
+ * @param {Function} fn The to wrap.
+ * @return {Function} A function which will call fn the first time it is  
called.
+ */
+exports.fireOnce = function fireOnce(fn) {
+  var fired = false;
+  return function wrapped() {
+    if (!fired) {
+      fired = true;
+      fn.apply(null, arguments);
+    }
+  };
+};
=======================================
--- /lib/driver.js	Thu Nov 17 12:35:50 2011
+++ /lib/driver.js	Tue Nov 29 04:11:51 2011
@@ -30,6 +30,7 @@
  var async = require('async');
  var Cassandra = require('./gen-nodejs/Cassandra');
  var ttypes = require('./gen-nodejs/cassandra_types');
+var util = require('./util');

  var genericPool = require('generic-pool');

@@ -47,6 +48,14 @@

  var DEFAULT_CONNECTION_TIMEOUT = 4000;

+/** Default timeout for each of the steps (login, learn, use) which are  
performed
+* when the Connection to the Cassandra server has been established. */
+var DEFAULT_STEP_TIMEOUTS = {
+  'login': 1000,
+  'learn': 2000,
+  'use': 1000,
+};
+
  /** converts object to a string using toString() method if it exists. */
  function stringify(x) {
    if (x.toString) {
@@ -433,9 +442,20 @@
      };

      async.series([
-      login,
-      learn,
-      use
+      function loginStep(callback) {
+        var wrappedCallback = wrapStepCallback('login',  
DEFAULT_STEP_TIMEOUTS.login, callback);
+        login(wrappedCallback);
+      },
+
+      function learnStep(callback) {
+        var wrappedCallback = wrapStepCallback('learn',  
DEFAULT_STEP_TIMEOUTS.learn, callback);
+        learn(wrappedCallback);
+      },
+
+      function useStep(callback) {
+        var wrappedCallback = wrapStepCallback('use',  
DEFAULT_STEP_TIMEOUTS.use, callback);
+        use(wrappedCallback);
+      },
      ],

      function(err) {
@@ -447,6 +467,27 @@
      });
    });

+  function timeoutStep(name, timeout, callback) {
+    var timeoutId = setTimeout(function stepTimeoutHandler() {
+      var err = new Error('Step "' + name + '" timed out.');
+      err.errno = constants.ETIMEDOUT;
+
+      callback(err);
+    }, timeout);
+
+    return timeoutId;
+  }
+
+  function wrapStepCallback(name, timeout, callback) {
+    callback = util.fireOnce(callback);
+    var timeoutId = timeoutStep(name, timeout, callback);
+
+    return function wrappedCallback(err) {
+      clearTimeout(timeoutId);
+      callback(err);
+    };
+  }
+
    function connectTimeout() {
      var err = new Error('ETIMEDOUT, Operation timed out');
      err.errno = constants.ETIMEDOUT;
@@ -461,6 +502,8 @@

    // kicks off the connection process.
    this.client = thrift.createClient(Cassandra, this.con);
+
+  // set a connection timeout handler
    timeoutId = setTimeout(connectTimeout, this.timeout);
  };


==============================================================================
Revision: 7cd24791bb99
Author:   Tomaz Muraus <to...@tomaz.me>
Date:     Tue Nov 29 04:24:56 2011
Log:      Add a test case for it.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=7cd24791bb99

Modified:
  /test/test_driver.js

=======================================
--- /test/test_driver.js	Thu Nov 17 12:23:47 2011
+++ /test/test_driver.js	Tue Nov 29 04:24:56 2011
@@ -19,6 +19,7 @@
  var assert = require('assert');
  var console = require('console');
  var EventEmitter = require('events').EventEmitter;
+var http = require('http');

  var logmagic = require('logmagic');
  var async = require('async');
@@ -771,7 +772,6 @@


  exports.testPooledConnectionFailover = function(test, assert) {
-  var server = null;
    var hosts =  
['google.com:8000', '127.0.0.1:6567', '127.0.0.2', '127.0.0.1:19170'];
    var conn = new PooledConnection({'hosts':  
hosts, 'keyspace': 'Keyspace1', use_bigints: true, 'timeout': 5000});

@@ -784,6 +784,33 @@
      }
    ],

+  function(err) {
+    conn.shutdown();
+    test.finish();
+  });
+};
+
+exports.testLearnStepTimeout = function(test, assert) {
+  var server = null;
+  var hosts = ['127.0.0.1:8688', '127.0.0.1:19170'];
+  var conn = new PooledConnection({'hosts':  
hosts, 'keyspace': 'Keyspace1', use_bigints: true, 'timeout': 5000});
+
+  async.series([
+    function startHttpServer(callback) {
+      server = http.createServer(function (req, res) {
+        res.end('test\n');
+      });
+      server.listen(8688, '127.0.0.1', callback);
+    },
+
+      function executeQueryPooledConnection(callback) {
+        conn.execute('UPDATE CfUgly SET A=1 WHERE KEY=1', [],  
function(err) {
+        assert.ifError(err);
+        callback();
+      });
+    }
+  ],
+
    function(err) {
      if (server) {
        server.close();