Skip to content

Commit

Permalink
quic: set destroyed at timestamps for duration calculation
Browse files Browse the repository at this point in the history
PR-URL: #34262
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
jasnell committed Jul 10, 2020
1 parent 48a349e commit c176d5f
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 16 deletions.
41 changes: 25 additions & 16 deletions lib/internal/quic/core.js
Expand Up @@ -126,6 +126,7 @@ const {
AF_INET6,
NGTCP2_DEFAULT_MAX_PKTLEN,
IDX_QUIC_SESSION_STATS_CREATED_AT,
IDX_QUIC_SESSION_STATS_DESTROYED_AT,
IDX_QUIC_SESSION_STATS_HANDSHAKE_START_AT,
IDX_QUIC_SESSION_STATS_BYTES_RECEIVED,
IDX_QUIC_SESSION_STATS_BYTES_SENT,
Expand All @@ -143,13 +144,15 @@ const {
IDX_QUIC_SESSION_STATS_SMOOTHED_RTT,
IDX_QUIC_SESSION_STATS_LATEST_RTT,
IDX_QUIC_STREAM_STATS_CREATED_AT,
IDX_QUIC_STREAM_STATS_DESTROYED_AT,
IDX_QUIC_STREAM_STATS_BYTES_RECEIVED,
IDX_QUIC_STREAM_STATS_BYTES_SENT,
IDX_QUIC_STREAM_STATS_MAX_OFFSET,
IDX_QUIC_STREAM_STATS_FINAL_SIZE,
IDX_QUIC_STREAM_STATS_MAX_OFFSET_ACK,
IDX_QUIC_STREAM_STATS_MAX_OFFSET_RECV,
IDX_QUIC_SOCKET_STATS_CREATED_AT,
IDX_QUIC_SOCKET_STATS_DESTROYED_AT,
IDX_QUIC_SOCKET_STATS_BOUND_AT,
IDX_QUIC_SOCKET_STATS_LISTEN_AT,
IDX_QUIC_SOCKET_STATS_BYTES_RECEIVED,
Expand Down Expand Up @@ -1433,6 +1436,9 @@ class QuicSocket extends EventEmitter {

// Mark the QuicSocket as being destroyed.
state.state = kSocketDestroyed;
this[kHandle].stats[IDX_QUIC_SOCKET_STATS_DESTROYED_AT] =
process.hrtime.bigint();
state.stats = new BigInt64Array(this[kHandle].stats);

// Immediately close any sessions that may be remaining.
// If the udp socket is in a state where it is able to do so,
Expand Down Expand Up @@ -1531,24 +1537,21 @@ class QuicSocket extends EventEmitter {
}

get duration() {
// TODO(@jasnell): If the object is destroyed, it should
// use a fixed duration rather than calculating from now
return Number(process.hrtime.bigint() -
getStats(this, IDX_QUIC_SOCKET_STATS_CREATED_AT));
const end = getStats(this, IDX_QUIC_SOCKET_STATS_DESTROYED_AT) ||
process.hrtime.bigint();
return Number(end - getStats(this, IDX_QUIC_SOCKET_STATS_CREATED_AT));
}

get boundDuration() {
// TODO(@jasnell): If the object is destroyed, it should
// use a fixed duration rather than calculating from now
return Number(process.hrtime.bigint() -
getStats(this, IDX_QUIC_SOCKET_STATS_BOUND_AT));
const end = getStats(this, IDX_QUIC_SOCKET_STATS_DESTROYED_AT) ||
process.hrtime.bigint();
return Number(end - getStats(this, IDX_QUIC_SOCKET_STATS_BOUND_AT));
}

get listenDuration() {
// TODO(@jasnell): If the object is destroyed, it should
// use a fixed duration rather than calculating from now
return Number(process.hrtime.bigint() -
getStats(this, IDX_QUIC_SOCKET_STATS_LISTEN_AT));
const end = getStats(this, IDX_QUIC_SOCKET_STATS_DESTROYED_AT) ||
process.hrtime.bigint();
return Number(end - getStats(this, IDX_QUIC_SOCKET_STATS_LISTEN_AT));
}

get bytesReceived() {
Expand Down Expand Up @@ -1920,6 +1923,8 @@ class QuicSession extends EventEmitter {
this[kHandle] = undefined;
if (handle !== undefined) {
// Copy the stats for use after destruction
handle.stats[IDX_QUIC_SESSION_STATS_DESTROYED_AT] =
process.hrtime.bigint();
state.stats = new BigInt64Array(handle.stats);
state.idleTimeout = this[kInternalState].state.idleTimeout;

Expand Down Expand Up @@ -2148,8 +2153,9 @@ class QuicSession extends EventEmitter {
}

get duration() {
return Number(process.hrtime.bigint() -
getStats(this, IDX_QUIC_SESSION_STATS_CREATED_AT));
const end = getStats(this, IDX_QUIC_SESSION_STATS_DESTROYED_AT) ||
process.hrtime.bigint();
return Number(end - getStats(this, IDX_QUIC_SESSION_STATS_CREATED_AT));
}

get handshakeDuration() {
Expand Down Expand Up @@ -2972,6 +2978,8 @@ class QuicStream extends Duplex {
// object has been destroyed. Any attempt to use the object
// will segfault and crash the process.
if (handle !== undefined) {
handle.stats[IDX_QUIC_STREAM_STATS_DESTROYED_AT] =
process.hrtime.bigint();
state.stats = new BigInt64Array(handle.stats);
handle.destroy();
}
Expand Down Expand Up @@ -3139,8 +3147,9 @@ class QuicStream extends Duplex {
}

get duration() {
return Number(process.hrtime.bigint() -
getStats(this, IDX_QUIC_STREAM_STATS_CREATED_AT));
const end = getStats(this, IDX_QUIC_STREAM_STATS_DESTROYED_AT) ||
process.hrtime.bigint();
return Number(end - getStats(this, IDX_QUIC_STREAM_STATS_CREATED_AT));
}

get bytesReceived() {
Expand Down
1 change: 1 addition & 0 deletions src/quic/node_quic_session.h
Expand Up @@ -182,6 +182,7 @@ enum QuicSessionStateFields {
V(SENT_AT, sent_at, "Last Sent At") \
V(RECEIVED_AT, received_at, "Last Received At") \
V(CLOSING_AT, closing_at, "Closing") \
V(DESTROYED_AT, destroyed_at, "Destroyed At") \
V(BYTES_RECEIVED, bytes_received, "Bytes Received") \
V(BYTES_SENT, bytes_sent, "Bytes Sent") \
V(BIDI_STREAM_COUNT, bidi_stream_count, "Bidi Stream Count") \
Expand Down
1 change: 1 addition & 0 deletions src/quic/node_quic_socket.h
Expand Up @@ -71,6 +71,7 @@ enum QuicSocketStateFields {
V(CREATED_AT, created_at, "Created At") \
V(BOUND_AT, bound_at, "Bound At") \
V(LISTEN_AT, listen_at, "Listen At") \
V(DESTROYED_AT, destroyed_at, "Destroyed At") \
V(BYTES_RECEIVED, bytes_received, "Bytes Received") \
V(BYTES_SENT, bytes_sent, "Bytes Sent") \
V(PACKETS_RECEIVED, packets_received, "Packets Received") \
Expand Down
1 change: 1 addition & 0 deletions src/quic/node_quic_stream.h
Expand Up @@ -50,6 +50,7 @@ enum QuicStreamHeadersKind : int {
V(RECEIVED_AT, received_at, "Last Received At") \
V(ACKED_AT, acked_at, "Last Acknowledged At") \
V(CLOSING_AT, closing_at, "Closing At") \
V(DESTROYED_AT, destroyed_at, "Destroyed At") \
V(BYTES_RECEIVED, bytes_received, "Bytes Received") \
V(BYTES_SENT, bytes_sent, "Bytes Sent") \
V(MAX_OFFSET, max_offset, "Max Offset") \
Expand Down

0 comments on commit c176d5f

Please sign in to comment.