pgte / fugue

Unicorn for node.js
MIT License
396 stars 14 forks source link

Throw Exception when kill worker process #12

Open murvinlai opened 13 years ago

murvinlai commented 13 years ago

In my code, I spawn 5 workers. The app server has an internal counter. If it exceeds 20, then it will app.close(), then process.exit() after 1 second, to make sure all existing request of the app are probably handle before the process ends. so that fugue can respawn the worker again.

here is my code:

app.get('/test', function(sReq, sRes) { try { var myCounter = counter ++; console.log('test is called ' + myCounter);

        if (myCounter >= 20) {
            if (isServerClose) {
                console.log("--- server is closed --- " + myCounter);
                try {
                    sRes.send('ERROR 1 ');
                } catch (ex) {
                    console.log(ex);
                }
            } else {
                isServerClose = true;
                var pids = fugue.workerPids();
                console.log("--- server is going to stop --- " + myCounter + " Worker Id: " + fugue.workerId() + " ProcessId: " + process.pid );
                try {
                    sRes.send('ERROR 2 ');
                } catch (ex) {
                    console.log(ex);
                }
                app.close();
                if (! fugue.isMaster()) {    
                    setTimeout(function() {process.exit();}, 1000);
                }
            }
        } else {
            if (isServerClose) {
                console.log("--- server is closed --- " + myCounter);
                try {
                    sRes.send('ERROR 3 ');
                } catch (ex) {
                    console.log(ex);
                }
            } else {
                sRes.send('TEST');
            }   
        }
    } catch (ex2) {
        console.log("bigger problem now... " + JSON.stringify(ex2));
    }
});

When I do the test, let say , make 500 requests. Then it will crash.

net.js:841 throw new Error('The connection is not writable'); ^ Error: The connection is not writable at Socket._shutdown (net.js:841:11) at Socket.flush (net.js:521:12) at Socket.end (net.js:873:14) at Carrier. (/usr/local/lib/node/.npm/fugue/0.1.2/package/lib/fugue.js:297:18) at Carrier.emit (events.js:64:17) at /usr/local/lib/node/.npm/carrier/0.1.1/package/lib/carrier.js:40:16 at Array.forEach (native) at Socket. (/usr/local/lib/node/.npm/carrier/0.1.1/package/lib/carrier.js:26:13) at Socket.emit (events.js:64:17) at Socket._onReadable (net.js:678:14)

I think conn.end() call when the process doesn't exist anymore.

I don't know if it is a bug, or I kill the process in a wrong way. Please advice.