Add logs for TFO succeded
authorSubodh Iyengar <subodh@fb.com>
Thu, 22 Sep 2016 08:01:42 +0000 (01:01 -0700)
committerFacebook Github Bot 0 <facebook-github-bot-0-bot@fb.com>
Thu, 22 Sep 2016 08:08:55 +0000 (01:08 -0700)
Summary:
Add logs for TFO to AsyncSocket
and wangle

Reviewed By: knekritz

Differential Revision: D3906104

fbshipit-source-id: 9a79b6f91273f8017a5e0d72fe5bdc8eff645ebc

folly/io/async/AsyncSocket.cpp
folly/io/async/AsyncSocket.h
folly/io/async/test/AsyncSocketTest2.cpp
folly/io/async/test/SocketClient.cpp

index 68ff62991bdd5ed7c80bf67dfe7b1b84e43bced6..beafbe5f11af0baf9109c4f4a4eb781dc55da979 100644 (file)
@@ -1147,6 +1147,10 @@ void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const {
   *address = addr_;
 }
 
+bool AsyncSocket::getTFOSucceded() const {
+  return detail::tfo_succeeded(fd_);
+}
+
 int AsyncSocket::setNoDelay(bool noDelay) {
   if (fd_ < 0) {
     VLOG(4) << "AsyncSocket::setNoDelay() called on non-open socket "
index ca4272b32796c9fc9731b0ffc298995b515ddaa2..30ae8d8461c9fa3befcc1548cdd2cf12ee20b47b 100644 (file)
@@ -431,6 +431,20 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
     return tfoFinished_;
   }
 
+  /**
+   * Returns whether or not TFO attempt succeded on this
+   * connection.
+   * For servers this is pretty straightforward API and can
+   * be invoked right after the connection is accepted. This API
+   * will perform one syscall.
+   * This API is a bit tricky to use for clients, since clients
+   * only know this for sure after the SYN-ACK is returned. So it's
+   * appropriate to call this only after the first application
+   * data is read from the socket when the caller knows that
+   * the SYN has been ACKed by the server.
+   */
+  bool getTFOSucceded() const;
+
   // Methods controlling socket options
 
   /**
index afd4f9e0b3628119f6d228483a184ae7d2a0797e..1e8227f9b8f79cce336988a8cb58dbef40a69b88 100644 (file)
@@ -2465,6 +2465,7 @@ TEST(AsyncSocketTest, ConnectTFO) {
   ASSERT_EQ(1, rcb.buffers.size());
   ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
   EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
+  EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
 }
 
 TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) {
@@ -2514,6 +2515,7 @@ TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) {
   ASSERT_EQ(1, rcb.buffers.size());
   ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
   EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
+  EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
 }
 
 /**
@@ -2543,10 +2545,9 @@ TEST(AsyncSocketTest, ConnectRefusedTFO) {
 
   if (!socket->getTFOFinished()) {
     EXPECT_EQ(STATE_FAILED, write1.state);
-    EXPECT_FALSE(socket->getTFOFinished());
   } else {
     EXPECT_EQ(STATE_SUCCEEDED, write1.state);
-    EXPECT_TRUE(socket->getTFOFinished());
+    EXPECT_FALSE(socket->getTFOSucceded());
   }
 
   EXPECT_EQ(STATE_FAILED, write2.state);
@@ -2668,6 +2669,7 @@ TEST(AsyncSocketTest, TestTFOUnsupported) {
   ASSERT_EQ(1, rcb.buffers.size());
   ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
   EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
+  EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
 }
 
 TEST(AsyncSocketTest, TestTFOUnsupportedTimeout) {
@@ -2874,6 +2876,7 @@ TEST(AsyncSocketTest, ConnectTFOWithBigData) {
   ASSERT_EQ(1, rcb.buffers.size());
   ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
   EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
+  EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
 }
 
 #endif
index 957ec9d04991e0ac77689047fce559f593250aa5..1a93ab95bcddc2e7c844065a602d3355ff032185 100644 (file)
@@ -65,8 +65,9 @@ int main(int argc, char** argv) {
 
   sock.write((const uint8_t*)FLAGS_msg.data(), FLAGS_msg.size());
 
-  LOG(ERROR) << "TFO attempted: " << sockAddr->getTFOAttempted();
-  LOG(ERROR) << "TFO finished: " << sockAddr->getTFOFinished();
+  LOG(INFO) << "TFO attempted: " << sockAddr->getTFOAttempted();
+  LOG(INFO) << "TFO finished: " << sockAddr->getTFOFinished();
+  LOG(INFO) << "TFO success: " << sockAddr->getTFOSucceded();
 
   std::array<char, 1024> buf;
   int32_t bytesRead = 0;