ctdb: move ctdb_io.c to use TLIST_*() macros
authorAndrew Tridgell <tridge@samba.org>
Thu, 4 Feb 2010 03:14:18 +0000 (14:14 +1100)
committerAndrew Tridgell <tridge@samba.org>
Thu, 4 Feb 2010 04:35:30 +0000 (15:35 +1100)
This will make large packet queues much more efficient

common/ctdb_io.c

index 47681d2a5660788a0c8e3813dadb5f9593c4216d..3fa784da96fe051dbee7e6c169ed0e25a9dda120 100644 (file)
@@ -45,13 +45,7 @@ struct ctdb_queue_pkt {
 struct ctdb_queue {
        struct ctdb_context *ctdb;
        struct ctdb_partial partial; /* partial input packet */
-       struct ctdb_queue_pkt *out_queue;
-       /* This field is used to track the last added item so we
-          can append new items to the end cheaply.
-          This relies of that items are always appended to the tail
-          and that when reamoving items we only remove the head.
-       */
-       struct ctdb_queue_pkt *out_queue_last_added;
+       struct ctdb_queue_pkt *out_queue, *out_queue_tail;
        uint32_t out_queue_length;
        struct fd_event *fde;
        int fd;
@@ -200,7 +194,8 @@ static void queue_io_write(struct ctdb_queue *queue)
                if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
                        if (pkt->length != pkt->full_length) {
                                /* partial packet sent - we have to drop it */
-                               DLIST_REMOVE(queue->out_queue, pkt);
+                               TLIST_REMOVE(queue->out_queue, queue->out_queue_tail,
+                                            pkt);
                                queue->out_queue_length--;
                                talloc_free(pkt);
                        }
@@ -219,7 +214,7 @@ static void queue_io_write(struct ctdb_queue *queue)
                        return;
                }
 
-               DLIST_REMOVE(queue->out_queue, pkt);
+               TLIST_REMOVE(queue->out_queue, queue->out_queue_tail, pkt);
                queue->out_queue_length--;
                talloc_free(pkt);
        }
@@ -300,18 +295,8 @@ int ctdb_queue_send(struct ctdb_queue *queue, uint8_t *data, uint32_t length)
                EVENT_FD_WRITEABLE(queue->fde);
        }
 
-       /* This relies on that when adding items to the queue, we always add
-          them to the tail and that when removing items we only remove
-          the head of queue item.
-          The last_added item thus allows non n^2 behaviour when appending to
-          very long queues.
-       */
-       if (queue->out_queue == NULL) {
-               DLIST_ADD(queue->out_queue, pkt);
-       } else {
-               DLIST_ADD_END(queue->out_queue_last_added, pkt, struct ctdb_queue_pkt *);
-       }
-       queue->out_queue_last_added = pkt;
+       TLIST_ADD_END(queue->out_queue, queue->out_queue_tail, pkt);
+
        queue->out_queue_length++;
 
        if (queue->ctdb->tunable.verbose_memory_names != 0) {