From a2851b62345c59ab5d41d8e3d0da1bad8a9c59d3 Mon Sep 17 00:00:00 2001 From: isaacs Date: Fri, 17 Feb 2012 10:10:02 -0800 Subject: [PATCH] Revert "cluster: propagate bind errors" This reverts commit 30e462e91937ced3847af3fe9c393ebd32294b68. --- lib/net.js | 24 ++--- test/simple/test-cluster-bind-twice-v1.js | 77 --------------- test/simple/test-cluster-bind-twice-v2.js | 115 ---------------------- 3 files changed, 6 insertions(+), 210 deletions(-) delete mode 100644 test/simple/test-cluster-bind-twice-v1.js delete mode 100644 test/simple/test-cluster-bind-twice-v2.js diff --git a/lib/net.js b/lib/net.js index a797ed6fed730e..e41e96ae1d386a 100644 --- a/lib/net.js +++ b/lib/net.js @@ -756,26 +756,14 @@ Server.prototype._listen2 = function(address, port, addressType) { function listen(self, address, port, addressType) { - if (!process.env.NODE_WORKER_ID) { + if (process.env.NODE_WORKER_ID) { + require('cluster')._getServer(address, port, addressType, function(handle) { + self._handle = handle; + self._listen2(address, port, addressType); + }); + } else { self._listen2(address, port, addressType); - return; } - - require('cluster')._getServer(address, port, addressType, function(handle) { - // OS X doesn't necessarily signal EADDRINUSE from bind(), it may defer - // the error until later. libuv mimics this behaviour to provide - // consistent behaviour across platforms but that means we could very - // well have a socket that is not actually bound... that's why we do - // this ghetto port check and raise EADDRINUSE if the requested and the - // actual port differ except if port == 0 because that means "any port". - if (port && port != handle.getsockname().port) { - self.emit('error', errnoException('EADDRINUSE', 'bind')); - return; - } - - self._handle = handle; - self._listen2(address, port, addressType); - }); } diff --git a/test/simple/test-cluster-bind-twice-v1.js b/test/simple/test-cluster-bind-twice-v1.js deleted file mode 100644 index 068842fa535f8e..00000000000000 --- a/test/simple/test-cluster-bind-twice-v1.js +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// This test starts two clustered HTTP servers on the same port. It expects the -// first cluster to succeed and the second cluster to fail with EADDRINUSE. - -var common = require('../common'); -var assert = require('assert'); -var cluster = require('cluster'); -var fork = require('child_process').fork; -var http = require('http'); - -var id = process.argv[2]; - -if (!id) { - var a = fork(__filename, ['one']); - var b = fork(__filename, ['two']); - - a.on('message', function(m) { - assert.equal(m, 'READY'); - b.send('START'); - }); - - var ok = false; - - b.on('message', function(m) { - assert.equal(m, 'EADDRINUSE'); - a.kill(); - b.kill(); - ok = true; - }); - - process.on('exit', function() { - a.kill(); - b.kill(); - assert(ok); - }); -} -else if (id === 'one') { - if (cluster.isMaster) cluster.fork(); - http.createServer(assert.fail).listen(common.PORT, function() { - process.send('READY'); - }); -} -else if (id === 'two') { - if (cluster.isMaster) cluster.fork(); - process.on('message', function(m) { - assert.equal(m, 'START'); - var server = http.createServer(assert.fail); - server.listen(common.PORT, assert.fail); - server.on('error', function(e) { - assert.equal(e.code, 'EADDRINUSE'); - process.send(e.code); - }); - }); -} -else { - assert(0); // bad command line argument -} diff --git a/test/simple/test-cluster-bind-twice-v2.js b/test/simple/test-cluster-bind-twice-v2.js deleted file mode 100644 index 1842cce260c941..00000000000000 --- a/test/simple/test-cluster-bind-twice-v2.js +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// This test starts two clustered HTTP servers on the same port. It expects the -// first cluster to succeed and the second cluster to fail with EADDRINUSE. -// -// The test may seem complex but most of it is plumbing that routes messages -// from the child processes back to the "super" master. As a tree it looks -// something like this: -// -// -// / \ -// -// / \ -// -// -// The first worker starts a server on a fixed port and fires a ready message -// that is routed to the second worker. When it tries to bind, it expects to -// see an EADDRINUSE error. -// -// See https://github.com/joyent/node/issues/2721 for more details. - -var common = require('../common'); -var assert = require('assert'); -var cluster = require('cluster'); -var fork = require('child_process').fork; -var http = require('http'); - -var id = process.argv[2]; - -if (!id) { - var a = fork(__filename, ['one']); - var b = fork(__filename, ['two']); - - a.on('message', function(m) { - if (typeof m === 'object') return; - assert.equal(m, 'READY'); - b.send('START'); - }); - - var ok = false; - - b.on('message', function(m) { - if (typeof m === 'object') return; // ignore system messages - assert.equal(m, 'EADDRINUSE'); - a.kill(); - b.kill(); - ok = true; - }); - - process.on('exit', function() { - a.kill(); - b.kill(); - assert(ok); - }); -} -else if (id === 'one') { - if (cluster.isMaster) return startWorker(); - - http.createServer(assert.fail).listen(common.PORT, function() { - process.send('READY'); - }); -} -else if (id === 'two') { - if (cluster.isMaster) return startWorker(); - - var ok = false; - process.on('SIGTERM', process.exit); - process.on('exit', function() { - assert(ok); - }); - - process.on('message', function(m) { - if (typeof m === 'object') return; // ignore system messages - assert.equal(m, 'START'); - var server = http.createServer(assert.fail); - server.listen(common.PORT, assert.fail); - server.on('error', function(e) { - assert.equal(e.code, 'EADDRINUSE'); - process.send(e.code); - ok = true; - }); - }); -} -else { - assert(0); // bad command line argument -} - -function startWorker() { - var worker = cluster.fork(); - worker.on('message', process.send); - process.on('message', worker.send.bind(worker)); - process.on('SIGTERM', function() { - worker.kill(); - process.exit(); - }); -}