fixed two more places where we don't correctly handle write errors on sockets
authorAndrew Tridgell <tridge@samba.org>
Tue, 15 May 2007 04:08:58 +0000 (14:08 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 15 May 2007 04:08:58 +0000 (14:08 +1000)
common/ctdb_io.c
tcp/tcp_connect.c

index 872da9670977a77ea1c6b358d1979ccc51589ec9..256b021bed69b0da884b159598aa7a6a527246e5 100644 (file)
@@ -170,9 +170,11 @@ static void queue_io_write(struct ctdb_queue *queue)
                }
 
                if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
+                       talloc_free(queue->fde);
+                       queue->fde = NULL;
+                       queue->fd = -1;
                        event_add_timed(queue->ctdb->ev, queue, timeval_zero(), 
                                        queue_dead, queue);
-                       EVENT_FD_NOT_WRITEABLE(queue->fde);
                        return;
                }
                if (n <= 0) return;
@@ -232,6 +234,9 @@ int ctdb_queue_send(struct ctdb_queue *queue, uint8_t *data, uint32_t length)
            !(queue->ctdb->flags & CTDB_FLAG_TORTURE)) {
                ssize_t n = write(queue->fd, data, length2);
                if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
+                       talloc_free(queue->fde);
+                       queue->fde = NULL;
+                       queue->fd = -1;
                        event_add_timed(queue->ctdb->ev, queue, timeval_zero(), 
                                        queue_dead, queue);
                        /* yes, we report success, as the dead node is 
index b3c5184527397702009f91124511a3316ba5992e..2ae41f31bd1451142fb3c8d5043d9b9875f7f8c2 100644 (file)
@@ -49,9 +49,7 @@ void ctdb_tcp_tnode_cb(uint8_t *data, size_t cnt, void *private_data)
 
        /* start a new connect cycle to try to re-establish the
           link */
-       close(tnode->fd);
        ctdb_queue_set_fd(tnode->queue, -1);
-       tnode->fd = -1;
        event_add_timed(node->ctdb->ev, node, timeval_zero(), 
                        ctdb_tcp_node_connect, node);
 }
@@ -157,6 +155,7 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te,
            errno != EINPROGRESS) {
                /* try again once a second */
                close(tnode->fd);
+               tnode->fd = -1;
                event_add_timed(ctdb->ev, node, timeval_current_ofs(1, 0), 
                                ctdb_tcp_node_connect, node);
                return;