BUG/MINOR: stream: Don't update counters when TCP to H2 upgrades are performed

When a TCP to H2 upgrade is performed, the SF_IGNORE flag is set on the
stream before killing it. This happens when a TCP/SSL client connection is
routed to a HTTP backend and the h2 alpn detected. The SF_IGNORE flag was
added for this purpose, to skip some processing when the stream is aborted
before a mux upgrade. Some counters updates were skipped this way. But some
others are still updated.

Now, all counters update at the end of process_stream(), before releasing
the stream, are ignored if SF_IGNORE flag is set. Note this stream is
aborted because we switch from a mono-stream to a multi-stream
multiplexer. It works differently for TCP to H1 upgrades.

This patch should be backported as far as 2.0 after some observation period.
diff --git a/src/stream.c b/src/stream.c
index 718eaa5..1a41ea5 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -2399,39 +2399,41 @@
 		DISGUISE(write(1, trash.area, trash.data));
 	}
 
-	s->logs.t_close = tv_ms_elapsed(&s->logs.tv_accept, &now);
-	if (!(s->flags & SF_IGNORE))
+	if (!(s->flags & SF_IGNORE)) {
+		s->logs.t_close = tv_ms_elapsed(&s->logs.tv_accept, &now);
+
 		stream_process_counters(s);
 
-	if (s->txn && s->txn->status) {
-		int n;
+		if (s->txn && s->txn->status) {
+			int n;
 
-		n = s->txn->status / 100;
-		if (n < 1 || n > 5)
-			n = 0;
+			n = s->txn->status / 100;
+			if (n < 1 || n > 5)
+				n = 0;
 
-		if (sess->fe->mode == PR_MODE_HTTP) {
-			_HA_ATOMIC_ADD(&sess->fe->fe_counters.p.http.rsp[n], 1);
+			if (sess->fe->mode == PR_MODE_HTTP) {
+				_HA_ATOMIC_ADD(&sess->fe->fe_counters.p.http.rsp[n], 1);
+			}
+			if ((s->flags & SF_BE_ASSIGNED) &&
+			    (s->be->mode == PR_MODE_HTTP)) {
+				_HA_ATOMIC_ADD(&s->be->be_counters.p.http.rsp[n], 1);
+				_HA_ATOMIC_ADD(&s->be->be_counters.p.http.cum_req, 1);
+			}
 		}
-		if ((s->flags & SF_BE_ASSIGNED) &&
-		    (s->be->mode == PR_MODE_HTTP)) {
-			_HA_ATOMIC_ADD(&s->be->be_counters.p.http.rsp[n], 1);
-			_HA_ATOMIC_ADD(&s->be->be_counters.p.http.cum_req, 1);
+
+		/* let's do a final log if we need it */
+		if (!LIST_ISEMPTY(&sess->fe->logformat) && s->logs.logwait &&
+		    !(s->flags & SF_MONITOR) &&
+		    (!(sess->fe->options & PR_O_NULLNOLOG) || req->total)) {
+			/* we may need to know the position in the queue */
+			pendconn_free(s);
+			s->do_log(s);
 		}
-	}
 
-	/* let's do a final log if we need it */
-	if (!LIST_ISEMPTY(&sess->fe->logformat) && s->logs.logwait &&
-	    !(s->flags & SF_MONITOR) &&
-	    (!(sess->fe->options & PR_O_NULLNOLOG) || req->total)) {
-		/* we may need to know the position in the queue */
-		pendconn_free(s);
-		s->do_log(s);
+		/* update time stats for this stream */
+		stream_update_time_stats(s);
 	}
 
-	/* update time stats for this stream */
-	stream_update_time_stats(s);
-
 	/* the task MUST not be in the run queue anymore */
 	stream_free(s);
 	task_destroy(t);