Add QPACK logging for each encoded header list to track whether encoding is blocked.
gfe-relnote: n/a, change to QUIC v99-only code. Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 272023695
Change-Id: I180a4e29d04c5786fabfb1b5d297b353e4d9104a
diff --git a/quic/core/qpack/qpack_encoder.cc b/quic/core/qpack/qpack_encoder.cc
index bd16f36..e7593dc 100644
--- a/quic/core/qpack/qpack_encoder.cc
+++ b/quic/core/qpack/qpack_encoder.cc
@@ -36,7 +36,8 @@
: decoder_stream_error_delegate_(decoder_stream_error_delegate),
decoder_stream_receiver_(this),
maximum_blocked_streams_(0),
- debug_visitor_(nullptr) {
+ debug_visitor_(nullptr),
+ header_list_count_(0) {
DCHECK(decoder_stream_error_delegate_);
}
@@ -288,6 +289,44 @@
}
if (debug_visitor_) {
+ ++header_list_count_;
+
+ if (dynamic_table_insertion_blocked) {
+ QUIC_HISTOGRAM_COUNTS(
+ "QuicSession.Qpack.HeaderListCountWhenInsertionBlocked",
+ header_list_count_, /* min = */ 1, /* max = */ 1000,
+ /* bucket_count = */ 50,
+ "The ordinality of a header list within a connection during the "
+ "encoding of which at least one dynamic table insertion was "
+ "blocked.");
+ } else {
+ QUIC_HISTOGRAM_COUNTS(
+ "QuicSession.Qpack.HeaderListCountWhenInsertionNotBlocked",
+ header_list_count_, /* min = */ 1, /* max = */ 1000,
+ /* bucket_count = */ 50,
+ "The ordinality of a header list within a connection during the "
+ "encoding of which no dynamic table insertion was blocked.");
+ }
+
+ if (blocked_stream_limit_exhausted) {
+ QUIC_HISTOGRAM_COUNTS(
+ "QuicSession.Qpack.HeaderListCountWhenBlockedStreamLimited",
+ header_list_count_, /* min = */ 1, /* max = */ 1000,
+ /* bucket_count = */ 50,
+ "The ordinality of a header list within a connection during the "
+ "encoding of which unacknowledged dynamic table entries could not be "
+ "referenced due to the limit on the number of blocked streams.");
+ } else {
+ QUIC_HISTOGRAM_COUNTS(
+ "QuicSession.Qpack.HeaderListCountWhenNotBlockedStreamLimited",
+ header_list_count_, /* min = */ 1, /* max = */ 1000,
+ /* bucket_count = */ 50,
+ "The ordinality of a header list within a connection during the "
+ "encoding of which the limit on the number of blocked streams did "
+ "not "
+ "prevent referencing unacknowledged dynamic table entries.");
+ }
+
debug_visitor_->OnHeaderListEncoded(dynamic_table_insertion_blocked,
blocked_stream_limit_exhausted);
}
diff --git a/quic/core/qpack/qpack_encoder.h b/quic/core/qpack/qpack_encoder.h
index c4aaced..6060798 100644
--- a/quic/core/qpack/qpack_encoder.h
+++ b/quic/core/qpack/qpack_encoder.h
@@ -16,6 +16,7 @@
#include "net/third_party/quiche/src/quic/core/qpack/qpack_header_table.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_exported_stats.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
namespace spdy {
@@ -171,7 +172,9 @@
QpackHeaderTable header_table_;
uint64_t maximum_blocked_streams_;
QpackBlockingManager blocking_manager_;
+ // TODO(bnc): Remove |debug_visitor_|.
DebugVisitor* debug_visitor_;
+ int header_list_count_;
};
} // namespace quic