]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: queue: simplify pendconn_unlink() regarding srv vs px
authorWilly Tarreau <w@1wt.eu>
Wed, 23 Jun 2021 14:54:16 +0000 (16:54 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 24 Jun 2021 08:52:31 +0000 (10:52 +0200)
Since the code paths became exactly the same except for what log field
to update, let's simplify the code and move further code out of the
lock. The queue position update and the test for server vs proxy do not
need to be inside the lock.

src/queue.c

index c48a363aa0d9ee9d5bf09da27ba04dd2e0372756..b7610d41bda6c674af73ff4a4cd05f7f7f5a1688 100644 (file)
@@ -172,41 +172,33 @@ static inline void pendconn_queue_unlock(struct pendconn *p)
  * connection is not really dequeued. It will be done during process_stream().
  * This function takes all the required locks for the operation. The pendconn
  * must be valid, though it doesn't matter if it was already unlinked. Prefer
- * pendconn_cond_unlink() to first check <p>. When the locks are already held,
- * please use __pendconn_unlink_{srv,prx}() instead.
+ * pendconn_cond_unlink() to first check <p>.
  */
 void pendconn_unlink(struct pendconn *p)
 {
-       int done = 0;
        struct queue  *q  = p->queue;
        struct proxy  *px = q->px;
        struct server *sv = q->sv;
+       uint oldidx;
+       int done = 0;
 
-       if (sv) {
-               /* queued in the server */
-               HA_SPIN_LOCK(QUEUE_LOCK, &q->lock);
-               if (p->node.node.leaf_p) {
-                       __pendconn_unlink_srv(p);
-                       done = 1;
-               }
-               HA_SPIN_UNLOCK(QUEUE_LOCK, &q->lock);
-               if (done) {
-                       _HA_ATOMIC_DEC(&q->length);
-                       _HA_ATOMIC_DEC(&px->totpend);
-               }
+       oldidx = _HA_ATOMIC_LOAD(&p->queue->idx);
+       HA_SPIN_LOCK(QUEUE_LOCK, &q->lock);
+       if (p->node.node.leaf_p) {
+               eb32_delete(&p->node);
+               done = 1;
        }
-       else {
-               /* queued in the proxy */
-               HA_SPIN_LOCK(QUEUE_LOCK, &q->lock);
-               if (p->node.node.leaf_p) {
-                       __pendconn_unlink_prx(p);
-                       done = 1;
-               }
-               HA_SPIN_UNLOCK(QUEUE_LOCK, &q->lock);
-               if (done) {
-                       _HA_ATOMIC_DEC(&q->length);
-                       _HA_ATOMIC_DEC(&px->totpend);
-               }
+       HA_SPIN_UNLOCK(QUEUE_LOCK, &q->lock);
+
+       if (done) {
+               oldidx -= p->queue_idx;
+               if (sv)
+                       p->strm->logs.srv_queue_pos += oldidx;
+               else
+                       p->strm->logs.prx_queue_pos += oldidx;
+
+               _HA_ATOMIC_DEC(&q->length);
+               _HA_ATOMIC_DEC(&px->totpend);
        }
 }