@@ -365,26 +365,28 @@ class BindPromise {
365
365
NetworkAddress peerAddr;
366
366
double createTime = 0.0 ;
367
367
double startTime = 0.0 ;
368
+ double startHandshakeTime = 0.0 ;
368
369
369
370
public:
370
371
BindPromise (const char * errContext, UID errID) : errContext(errContext), errID(errID) {}
371
372
BindPromise (AuditedEvent auditedEvent, UID errID) : errContext(auditedEvent), errID(errID) {}
372
373
BindPromise (BindPromise const & r)
373
374
: p(r.p), errContext(r.errContext), errID(r.errID), peerAddr(r.peerAddr), createTime(r.createTime),
374
- startTime (r.startTime) {}
375
+ startTime (r.startTime), startHandshakeTime(r.startHandshakeTime) {}
375
376
BindPromise (BindPromise&& r) noexcept
376
377
: p(std::move(r.p)), errContext(r.errContext), errID(r.errID), peerAddr(r.peerAddr), createTime(r.createTime),
377
- startTime(r.startTime) {}
378
+ startTime(r.startTime), startHandshakeTime(r.startHandshakeTime) {}
378
379
379
380
Future<Void> getFuture () const { return p.getFuture (); }
380
381
381
382
NetworkAddress getPeerAddr () const { return peerAddr; }
382
383
383
384
void setPeerAddr (const NetworkAddress& addr) { peerAddr = addr; }
384
385
385
- void setTimeMetrics (double inputCreateTime, double inputStartTime) {
386
+ void setTimeMetrics (double inputCreateTime, double inputStartTime, double inputStartHandshakeTime ) {
386
387
createTime = inputCreateTime;
387
388
startTime = inputStartTime;
389
+ startHandshakeTime = inputStartHandshakeTime;
388
390
}
389
391
390
392
void operator ()(const boost::system::error_code& error, size_t bytesWritten = 0 ) {
@@ -399,11 +401,7 @@ class BindPromise {
399
401
else
400
402
traceEvent.emplace (SevWarn, std::get<const char *>(errContext), errID);
401
403
TraceEvent& evt = *traceEvent;
402
- evt.suppressFor (1.0 )
403
- .detail (" ErrorCode" , error.value ())
404
- .detail (" Message" , error.message ())
405
- .detail (" Duration" , currentTime - createTime)
406
- .detail (" ProcessTime" , currentTime - startTime);
404
+ evt.suppressFor (1.0 ).detail (" ErrorCode" , error.value ()).detail (" Message" , error.message ());
407
405
// There is no function in OpenSSL to use to check if an error code is from OpenSSL,
408
406
// but all OpenSSL errors have a non-zero "library" code set in bits 24-32, and linux
409
407
// error codes should never go that high.
@@ -415,6 +413,15 @@ class BindPromise {
415
413
evt.detail (" PeerAddr" , peerAddr);
416
414
evt.detail (" PeerAddress" , peerAddr);
417
415
}
416
+ if (createTime > 0 ) {
417
+ evt.detail (" Duration" , currentTime - createTime);
418
+ }
419
+ if (startTime > 0 ) {
420
+ evt.detail (" QueuingTime" , currentTime - startTime);
421
+ }
422
+ if (startHandshakeTime > 0 ) {
423
+ evt.detail (" ServiceTime" , currentTime - startHandshakeTime);
424
+ }
418
425
}
419
426
420
427
p.sendError (connection_failed ());
@@ -847,9 +854,10 @@ struct SSLHandshakerThread final : IThreadPoolReceiver {
847
854
return std::move (o).str ();
848
855
}
849
856
850
- void setTimeMetrics (double inputCreateTime, double inputStartTime) {
857
+ void setTimeMetrics (double inputCreateTime, double inputStartTime, double inputStartHandshakeTime ) {
851
858
createTime = inputCreateTime;
852
859
startTime = inputStartTime;
860
+ startHandshakeTime = inputStartHandshakeTime;
853
861
}
854
862
855
863
ThreadReturnPromise<Void> done;
@@ -858,10 +866,12 @@ struct SSLHandshakerThread final : IThreadPoolReceiver {
858
866
boost::system::error_code err;
859
867
double createTime = 0.0 ;
860
868
double startTime = 0.0 ;
869
+ double startHandshakeTime = 0.0 ;
861
870
};
862
871
863
872
void action (Handshake& h) {
864
873
try {
874
+ double currentTime = now ();
865
875
h.socket .next_layer ().non_blocking (false , h.err );
866
876
if (!h.err .failed ()) {
867
877
h.socket .handshake (h.type , h.err );
@@ -870,17 +880,23 @@ struct SSLHandshakerThread final : IThreadPoolReceiver {
870
880
h.socket .next_layer ().non_blocking (true , h.err );
871
881
}
872
882
if (h.err .failed ()) {
873
- double currentTime = now ();
874
- TraceEvent (SevWarn,
875
- h.type == ssl_socket::handshake_type::client ? " N2_ConnectHandshakeError" _audit
876
- : " N2_AcceptHandshakeError" _audit)
877
- .detail (" PeerAddr" , h.getPeerAddress ())
878
- .detail (" PeerAddress" , h.getPeerAddress ())
879
- .detail (" ErrorCode" , h.err .value ())
880
- .detail (" ErrorMsg" , h.err .message ().c_str ())
881
- .detail (" BackgroundThread" , true )
882
- .detail (" Duration" , currentTime - h.createTime )
883
- .detail (" ProcessTime" , currentTime - h.startTime );
883
+ TraceEvent evt (SevWarn,
884
+ h.type == ssl_socket::handshake_type::client ? " N2_ConnectHandshakeError" _audit
885
+ : " N2_AcceptHandshakeError" _audit);
886
+ evt.detail (" PeerAddr" , h.getPeerAddress ());
887
+ evt.detail (" PeerAddress" , h.getPeerAddress ());
888
+ evt.detail (" ErrorCode" , h.err .value ());
889
+ evt.detail (" ErrorMsg" , h.err .message ().c_str ());
890
+ evt.detail (" BackgroundThread" , true );
891
+ if (h.createTime > 0 ) {
892
+ evt.detail (" Duration" , currentTime - h.createTime );
893
+ }
894
+ if (h.startTime > 0 ) {
895
+ evt.detail (" QueuingTime" , currentTime - h.startTime );
896
+ }
897
+ if (h.startHandshakeTime > 0 ) {
898
+ evt.detail (" ServiceTime" , currentTime - h.startHandshakeTime );
899
+ }
884
900
h.done .sendError (connection_failed ());
885
901
} else {
886
902
h.done .send (Void ());
@@ -966,6 +982,8 @@ class SSLConnection final : public IConnection, ReferenceCounted<SSLConnection>
966
982
967
983
ACTOR static void doAcceptHandshake (Reference<SSLConnection> self, Promise<Void> connected) {
968
984
state Hold<int > holder;
985
+ state double startHandshakeTime = now ();
986
+ state bool doBackgroundHandshake = false ;
969
987
970
988
try {
971
989
Future<Void> onHandshook;
@@ -981,20 +999,31 @@ class SSLConnection final : public IConnection, ReferenceCounted<SSLConnection>
981
999
holder = Hold (&N2::g_net2->sslPoolHandshakesInProgress );
982
1000
auto handshake =
983
1001
new SSLHandshakerThread::Handshake (self->ssl_sock , boost::asio::ssl::stream_base::server);
984
- handshake->setTimeMetrics (self->createTime , self->startTime );
1002
+ handshake->setTimeMetrics (self->createTime , self->startTime , startHandshakeTime );
985
1003
onHandshook = handshake->done .getFuture ();
1004
+ doBackgroundHandshake = true ;
986
1005
N2::g_net2->sslHandshakerPool ->post (handshake);
987
1006
} else {
988
1007
// Otherwise use flow network thread
989
1008
g_net2->countServerTLSHandshakesOnMainThread ++;
990
1009
BindPromise p (" N2_AcceptHandshakeError" _audit, self->id );
991
1010
p.setPeerAddr (self->getPeerAddress ());
992
- p.setTimeMetrics (self->createTime , self->startTime );
1011
+ p.setTimeMetrics (self->createTime , self->startTime , startHandshakeTime );
993
1012
onHandshook = p.getFuture ();
1013
+ doBackgroundHandshake = false ;
994
1014
self->ssl_sock .async_handshake (boost::asio::ssl::stream_base::server, std::move (p));
995
1015
}
996
1016
wait (onHandshook);
997
1017
wait (delay (0 , TaskPriority::Handshake));
1018
+ double currentTime = now ();
1019
+ TraceEvent (SevInfo, " N2_AcceptHandshakeComplete" _audit)
1020
+ .suppressFor (1.0 )
1021
+ .detail (" PeerAddr" , self->getPeerAddress ())
1022
+ .detail (" PeerAddress" , self->getPeerAddress ())
1023
+ .detail (" BackgroundThread" , doBackgroundHandshake)
1024
+ .detail (" Duration" , currentTime - self->createTime )
1025
+ .detail (" QueuingTime" , currentTime - self->startTime )
1026
+ .detail (" ServiceTime" , currentTime - startHandshakeTime);
998
1027
connected.send (Void ());
999
1028
} catch (...) {
1000
1029
self->closeSocket ();
@@ -1021,9 +1050,7 @@ class SSLConnection final : public IConnection, ReferenceCounted<SSLConnection>
1021
1050
}
1022
1051
}
1023
1052
1024
- wait (g_network->networkInfo .handshakeLock ->take (FLOW_KNOBS->TLS_HANDSHAKE_FLOWLOCK_HIGH_PRIORITY
1025
- ? TaskPriority::AcceptSocket
1026
- : TaskPriority::DefaultYield));
1053
+ wait (g_network->networkInfo .handshakeLock ->take ());
1027
1054
state FlowLock::Releaser releaser (*g_network->networkInfo .handshakeLock );
1028
1055
1029
1056
Promise<Void> connected;
@@ -1058,6 +1085,8 @@ class SSLConnection final : public IConnection, ReferenceCounted<SSLConnection>
1058
1085
1059
1086
ACTOR static void doConnectHandshake (Reference<SSLConnection> self, Promise<Void> connected) {
1060
1087
state Hold<int > holder;
1088
+ state double startHandshakeTime = now ();
1089
+ state bool doBackgroundHandshake = false ;
1061
1090
1062
1091
try {
1063
1092
Future<Void> onHandshook;
@@ -1080,20 +1109,31 @@ class SSLConnection final : public IConnection, ReferenceCounted<SSLConnection>
1080
1109
holder = Hold (&N2::g_net2->sslPoolHandshakesInProgress );
1081
1110
auto handshake =
1082
1111
new SSLHandshakerThread::Handshake (self->ssl_sock , boost::asio::ssl::stream_base::client);
1083
- handshake->setTimeMetrics (self->createTime , self->startTime );
1112
+ handshake->setTimeMetrics (self->createTime , self->startTime , startHandshakeTime );
1084
1113
onHandshook = handshake->done .getFuture ();
1114
+ doBackgroundHandshake = true ;
1085
1115
N2::g_net2->sslHandshakerPool ->post (handshake);
1086
1116
} else {
1087
1117
// Otherwise use flow network thread
1088
1118
g_net2->countClientTLSHandshakesOnMainThread ++;
1089
1119
BindPromise p (" N2_ConnectHandshakeError" _audit, self->id );
1090
1120
p.setPeerAddr (self->getPeerAddress ());
1091
- p.setTimeMetrics (self->createTime , self->startTime );
1121
+ p.setTimeMetrics (self->createTime , self->startTime , startHandshakeTime );
1092
1122
onHandshook = p.getFuture ();
1123
+ doBackgroundHandshake = false ;
1093
1124
self->ssl_sock .async_handshake (boost::asio::ssl::stream_base::client, std::move (p));
1094
1125
}
1095
1126
wait (onHandshook);
1096
1127
wait (delay (0 , TaskPriority::Handshake));
1128
+ double currentTime = now ();
1129
+ TraceEvent (SevInfo, " N2_ConnectHandshakeComplete" _audit)
1130
+ .suppressFor (1.0 )
1131
+ .detail (" PeerAddr" , self->getPeerAddress ())
1132
+ .detail (" PeerAddress" , self->getPeerAddress ())
1133
+ .detail (" BackgroundThread" , doBackgroundHandshake)
1134
+ .detail (" Duration" , currentTime - self->createTime )
1135
+ .detail (" QueuingTime" , currentTime - self->startTime )
1136
+ .detail (" ServiceTime" , currentTime - startHandshakeTime);
1097
1137
connected.send (Void ());
1098
1138
} catch (...) {
1099
1139
self->closeSocket ();
0 commit comments