beforeEach(function () { sandbox = sinon.sandbox.create(); sandbox.stub(zkClient, "connect", function () { this.emit("connected"); }); sandbox.stub(zkClient, "getChildren", function (path, cb) { cb(zookeeper.Exception.create(zookeeper.Exception.CONNECTION_LOSS), null, 1); }); eventFired = false; });
self._client.create(ZK_CONFIG.leader_znode, zk.CreateMode.EPHEMERAL, function (error, path) { if (error) { if (error.code == zk.Exception.NODE_EXISTS) { // Oops too late return self.lookForLeader(); } else { return self.emiter.emit(Events.UNEXPECTED_ZK_ERROR, error); } } self.isLeader = true; self.emiter.emit(Events.GAINED_LEADERSHIP); });
self._client.getData(ZK_CONFIG.leader_znode, function watch (event) { // Someone else is already the leader if (event.type == zk.Event.NODE_DELETED) { self.emiter.emit(Events.LEADER_CHANGED); self.claimLeadership(); } }, function (error) { if (error && error.code == zk.Exception.NO_NODE) { // Leader spot available return self.claimLeadership(); } else if (error) { return self.emiter.emit(Events.UNEXPECTED_ZK_ERROR, error); } });
_addProvisionZkNodes(provisionList, cb) { async.eachLimit( provisionList.map( item => `${PROVISIONS}/${item}`), 20, (zkPath, done) => this._client.create(zkPath, err => { if (err && err.getCode() !== zookeeper.Exception.NODE_EXISTS) { this._log.error('error adding provision node', { zkPath: `${this._zkEndpoint}${zkPath}`, error: err }); return done(err); } this._log.debug('added new provision zk node', { zkPath: `${this._zkEndpoint}${zkPath}` }); return done(); }), cb); }
_populateZkHierarchy(cb) { async.each([ LEADERS, OWNERS, PROVISIONS, ], (zkPath, done) => this._client.create(zkPath, err => { if (err && err.getCode() !== zookeeper.Exception.NODE_EXISTS) { this._log.error('error populating zk node', { zkPath: `${this._zkEndpoint}${zkPath}`, error: err }); return done(err); } this._log.debug('populated zk node', { zkPath }); return done(); }), cb); }
it("Read no node error path", function (done) { zkClient.getData.restore(); sandbox.stub(zkClient, "getData", function(path,watch,cb) { setTimeout(function() { cb(zookeeper.Exception.create(zookeeper.Exception.NO_NODE), null, 1); }, 100); }); var scheduler = new Scheduler({tasks: { task1:{isSubmitted:true} },useZk: true, logging: {level: "debug"}, zkClient: zkClient, taskHelper: taskHelper}); scheduler.on("ready", function() { done(); }); clock.tick(100); clock.tick(100); });
// @returns `Promise` _createNode() { const zk = this._zookeeper; const consumer = this._consumer; return new Promise((resolve, reject) => { zk.exists(consumer, (err, stat) => { if (err) { return reject(err); } if (stat) { return resolve(); } zk.create(consumer, _nodeZookeeperClient.CreateMode.EPHEMERAL, (err, node) => { // Skip node exists error for concurrency if (err && err.getCode() === _nodeZookeeperClient.Exception.NODE_EXISTS) { return resolve(); } if (err) { return reject(err); } resolve(); }); }); }); }
(err, data) => { if (err && err.getCode() !== zookeeper.Exception.NO_NODE) { this._log.error('error in getData', { zkPath: this._zkEndpoint + myPath,
_readAllOffsets(topic, partition, offsetType, cb) { const zkPath = this._getOffsetZkPath(topic, partition, offsetType); this._zookeeper.getChildren(zkPath, (err, labels) => { if (err) { if (err.getCode() === zookeeper.Exception.NO_NODE) { // no label has been published yet return cb(null, []); } this._log.error( 'error getting list of offsets from zookeeper', { topic, partition, offsetType, error: err.message, }); return cb(err); } return async.mapLimit( labels, 10, (label, done) => this._readOffset( topic, partition, offsetType, label, (err, offset) => { if (err) { return done(err); } return done(null, { label, offset }); }), cb); }); }
it("Read zk OOB error", function (done) { var isReady = false; zkClient.getData.restore(); sandbox.stub(zkClient, "getData", function(path,watch,cb) { var self = this; setTimeout(function() { var err = zookeeper.Exception.create(zookeeper.Exception.CONNECTION_LOSS); self.emit("error", err); cb(err, null, 1); }, 100); }); var scheduler = Scheduler({tasks: { task1:{isSubmitted:true} },useZk: true, logging: {level: "debug"}, zkClient: zkClient, taskHelper: taskHelper}); scheduler.on("ready", function() { isReady = true; console.log("got to ready"); expect(true).to.be.false; }); setTimeout(function () { expect(isReady).to.be.false; done(); }, 400); clock.tick(100); clock.tick(400); });
it("Read other error path", function (done) { var isReady = false; zkClient.getData.restore(); sandbox.stub(zkClient, "getData", function(path,watch,cb) { setTimeout(function() { cb(zookeeper.Exception.create(zookeeper.Exception.CONNECTION_LOSS), null, 1); //cb(null, "434e8173-45ea-435e-905e-d577b260898c-2021", 1); }, 100); }); var scheduler = new Scheduler({tasks: { task1:{isSubmitted:true} },useZk: true, logging: {level: "debug"}, zkClient: zkClient, taskHelper: taskHelper}); scheduler.on("ready", function() { isReady = true; console.log("got to ready"); expect(true).to.be.false; }); setTimeout(function () { expect(isReady).to.be.false; done(); }, 400); clock.tick(100); clock.tick(400); });
it("Connect fail", function (done) { var isReady = false; zkClient.getData.restore(); sandbox.stub(zkClient, "getData", function(path,watch,cb) { setTimeout(function() { cb(zookeeper.Exception.create(zookeeper.Exception.CONNECTION_LOSS), null, 1); }, 100); }); var scheduler = Scheduler({tasks: { task1:{isSubmitted:true} },useZk: true, logging: {level: "debug"}, zkClient: zkClient}); scheduler.on("error", function(error) { console.log(JSON.stringify(error)); }); scheduler.on("ready", function() { isReady = true; console.log("got to ready"); }); setTimeout(function () { expect(isReady).to.be.false; done(); }, 400); clock.tick(100); clock.tick(400); });