Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: joyent/node
base: master
...
head fork: joyent/node
compare: v0.6
Checking mergeability… Don't worry, you can still create the pull request.
  • 8 commits
  • 6 files changed
  • 3 commit comments
  • 3 contributors
Commits on Aug 03, 2012
@piscisaureus piscisaureus net: make pause/resume work with connecting sockets
Calling resume() on a net connection for which the IP address is still
being resolved crashes node with an assertion error inside libuv.
Calling pause() before the socket is connected doesn't crash, but it
doesn't work either. This patch fixes it.

Ref: #3118
7d7bca6
@bnoordhuis bnoordhuis deps: upgrade libuv to d6a96de 974ee7b
@isaacs isaacs 2012.08.03 Version 0.6.21 (maintenance)
* sunos: work around OS bug to prevent fs.watch() from spinning (Bryan Cantrill)

* net: make pause/resume work with connecting sockets (Bert Belder)
55ddf54
@isaacs isaacs Merge branch 'v0.6.21-release' into v0.6 30cfe27
@isaacs isaacs now working on 0.6.22 2dcaef6
Commits on Aug 04, 2012
@isaacs isaacs Check the version before building tarball
I keep forgetting to do this.  It's such a stupid thing.
2a1f022
@isaacs isaacs Makefile: Refuse to build release from unclean repo
Root cause of an error during the 0.7.11 release
c527366
@isaacs isaacs build: Regenerate docs for tarball and releases 7e6dea4
View
9 ChangeLog
@@ -1,4 +1,11 @@
-2012.07.10 Version 0.6.20 (maintenance)
+2012.08.03 Version 0.6.21 (maintenance)
+
+* sunos: work around OS bug to prevent fs.watch() from spinning (Bryan Cantrill)
+
+* net: make pause/resume work with connecting sockets (Bert Belder)
+
+
+2012.07.10 Version 0.6.20 (maintenance), 952e513379169ec1b40909d1db056e9bf4294899
* npm: Upgrade to 1.1.37 (isaacs)
View
30 Makefile
@@ -120,19 +120,19 @@ $(apidoc_dirs):
out/doc/api/assets/%: doc/api_assets/% out/doc/api/assets/
cp $< $@
-out/doc/changelog.html: ChangeLog doc/changelog-head.html doc/changelog-foot.html tools/build-changelog.sh
+out/doc/changelog.html: ChangeLog doc/changelog-head.html doc/changelog-foot.html tools/build-changelog.sh node
bash tools/build-changelog.sh
-out/doc/%.html: doc/%.html
+out/doc/%.html: doc/%.html node
cat $< | sed -e 's|__VERSION__|'$(VERSION)'|g' > $@
out/doc/%: doc/%
cp -r $< $@
-out/doc/api/%.json: doc/api/%.markdown
+out/doc/api/%.json: doc/api/%.markdown node
out/Release/node tools/doc/generate.js --format=json $< > $@
-out/doc/api/%.html: doc/api/%.markdown
+out/doc/api/%.html: doc/api/%.markdown node
out/Release/node tools/doc/generate.js --format=html --template=doc/template.html $< > $@
email.md: ChangeLog tools/email-footer.md
@@ -207,7 +207,27 @@ $(PKG):
--doc tools/osx-pkg.pmdoc \
--out $(PKG)
-$(TARBALL): out/doc
+$(TARBALL): node doc
+ @if [ "$(shell git status --porcelain | egrep -v '^\?\? ')" = "" ]; then \
+ exit 0 ; \
+ else \
+ echo "" >&2 ; \
+ echo "The git repository is not clean." >&2 ; \
+ echo "Please commit changes before building release tarball." >&2 ; \
+ echo "" >&2 ; \
+ git status --porcelain | egrep -v '^\?\?' >&2 ; \
+ echo "" >&2 ; \
+ exit 1 ; \
+ fi
+ @if [ $(shell ./node --version) = "$(VERSION)" ]; then \
+ exit 0; \
+ else \
+ echo "" >&2 ; \
+ echo "$(shell ./node --version) doesn't match $(VERSION)." >&2 ; \
+ echo "Did you remember to update src/node_version.cc?" >&2 ; \
+ echo "" >&2 ; \
+ exit 1 ; \
+ fi
git archive --format=tar --prefix=$(TARNAME)/ HEAD | tar xf -
mkdir -p $(TARNAME)/doc/api
cp doc/node.1 $(TARNAME)/doc/node.1
View
20 deps/uv/src/unix/sunos.c
@@ -110,7 +110,7 @@ static void uv__fs_event_rearm(uv_fs_event_t *handle) {
static void uv__fs_event_read(EV_P_ ev_io* w, int revents) {
- uv_fs_event_t *handle;
+ uv_fs_event_t *handle = NULL;
uv_loop_t *loop_;
timespec_t timeout;
port_event_t pe;
@@ -120,15 +120,25 @@ static void uv__fs_event_read(EV_P_ ev_io* w, int revents) {
loop_ = container_of(w, uv_loop_t, fs_event_watcher);
do {
- /* TODO use port_getn() */
+ uint_t n = 1;
+
+ /*
+ * Note that our use of port_getn() here (and not port_get()) is deliberate:
+ * there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout
+ * causes port_get() to return success instead of ETIME when there aren't
+ * actually any events (!); by using port_getn() in lieu of port_get(),
+ * we can at least workaround the bug by checking for zero returned events
+ * and treating it as we would ETIME.
+ */
do {
memset(&timeout, 0, sizeof timeout);
- r = port_get(loop_->fs_fd, &pe, &timeout);
+ r = port_getn(loop_->fs_fd, &pe, 1, &n, &timeout);
}
while (r == -1 && errno == EINTR);
- if (r == -1 && errno == ETIME)
+ if ((r == -1 && errno == ETIME) || n == 0)
break;
+
handle = (uv_fs_event_t *)pe.portev_user;
assert((r == 0) && "unexpected port_get() error");
@@ -143,7 +153,7 @@ static void uv__fs_event_read(EV_P_ ev_io* w, int revents) {
}
while (handle->fd != PORT_DELETED);
- if (handle->fd != PORT_DELETED)
+ if (handle != NULL && handle->fd != PORT_DELETED)
uv__fs_event_rearm(handle);
}
View
13 lib/net.js
@@ -83,6 +83,7 @@ function initSocketHandle(self) {
self._flags = 0;
self._connectQueueSize = 0;
+ self._paused = false;
self.destroyed = false;
self.errorEmitted = false;
self.bytesRead = 0;
@@ -201,8 +202,10 @@ Object.defineProperty(Socket.prototype, 'bufferSize', {
Socket.prototype.pause = function() {
+ this._paused = true;
+
if (this._handle) {
- this._handle.readStop();
+ if (!this._connecting) this._handle.readStop();
// this adds an undesireable boundary crossing for pipe streams.
// the .unref() method is omitted on TCP streams, because it is
@@ -213,8 +216,10 @@ Socket.prototype.pause = function() {
Socket.prototype.resume = function() {
+ this._paused = false;
+
if (this._handle) {
- this._handle.readStart();
+ if (!this._connecting) this._handle.readStart();
// this adds an undesireable boundary crossing for pipe streams.
// the .ref() method is omitted on TCP streams, because it is
@@ -636,7 +641,7 @@ function afterConnect(status, handle, req, readable, writable) {
self.writable = writable;
timers.active(self);
- if (self.readable) {
+ if (self.readable && !self._paused) {
handle.readStart();
}
@@ -867,7 +872,7 @@ function onconnection(clientHandle) {
});
socket.readable = socket.writable = true;
- socket.resume();
+ clientHandle.readStart();
self.connections++;
socket.server = self;
View
2  src/node_version.h
@@ -28,7 +28,7 @@
#define NODE_MAJOR_VERSION 0
#define NODE_MINOR_VERSION 6
-#define NODE_PATCH_VERSION 21
+#define NODE_PATCH_VERSION 22
#define NODE_VERSION_IS_RELEASE 0
#ifndef NODE_STRINGIFY
View
101 test/simple/test-net-pause-resume-connecting.js
@@ -0,0 +1,101 @@
+// 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.
+
+var common = require('../common'),
+ assert = require('assert'),
+ net = require('net');
+
+var connections = 0,
+ dataEvents = 0,
+ conn;
+
+
+// Server
+var server = net.createServer(function(conn) {
+ connections++;
+ conn.end('This was the year he fell to pieces.');
+
+ if (connections === 5)
+ server.close();
+});
+
+server.listen(common.PORT);
+
+
+// Client 1
+conn = require('net').createConnection(common.PORT, 'localhost');
+conn.resume();
+conn.on('data', onDataOk);
+
+
+// Client 2
+conn = require('net').createConnection(common.PORT, 'localhost');
+conn.pause();
+conn.resume();
+conn.on('data', onDataOk);
+
+
+// Client 3
+conn = require('net').createConnection(common.PORT, 'localhost');
+conn.pause();
+conn.on('data', onDataError);
+scheduleTearDown(conn);
+
+
+// Client 4
+conn = require('net').createConnection(common.PORT, 'localhost');
+conn.resume();
+conn.pause();
+conn.resume();
+conn.on('data', onDataOk);
+
+
+// Client 5
+conn = require('net').createConnection(common.PORT, 'localhost');
+conn.resume();
+conn.resume();
+conn.pause();
+conn.on('data', onDataError);
+scheduleTearDown(conn);
+
+
+// Client helper functions
+function onDataError() {
+ assert(false);
+}
+
+function onDataOk() {
+ dataEvents++;
+}
+
+function scheduleTearDown(conn) {
+ setTimeout(function() {
+ conn.removeAllListeners('data');
+ conn.resume();
+ }, 100);
+}
+
+
+// Exit sanity checks
+process.on('exit', function() {
+ assert.strictEqual(connections, 5);
+ assert.strictEqual(dataEvents, 3);
+});

Showing you all comments on commits in this comparison.

@bnoordhuis

Why this change? Otherwise LGTM.

@piscisaureus

because resume() does stuff that makes no sense for freshly minted sockets (like .ref()).

@bnoordhuis

Noted. I ask because v0.8 / master calls resume() and it seems to work.

Something went wrong with that request. Please try again.