Commit 2062a6ba authored by Subodh Iyengar's avatar Subodh Iyengar Committed by Facebook Github Bot 0

Add logs for TFO succeded

Summary:
Add logs for TFO to AsyncSocket
and wangle

Reviewed By: knekritz

Differential Revision: D3906104

fbshipit-source-id: 9a79b6f91273f8017a5e0d72fe5bdc8eff645ebc
parent 2bb804ca
...@@ -1147,6 +1147,10 @@ void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const { ...@@ -1147,6 +1147,10 @@ void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const {
*address = addr_; *address = addr_;
} }
bool AsyncSocket::getTFOSucceded() const {
return detail::tfo_succeeded(fd_);
}
int AsyncSocket::setNoDelay(bool noDelay) { int AsyncSocket::setNoDelay(bool noDelay) {
if (fd_ < 0) { if (fd_ < 0) {
VLOG(4) << "AsyncSocket::setNoDelay() called on non-open socket " VLOG(4) << "AsyncSocket::setNoDelay() called on non-open socket "
......
...@@ -431,6 +431,20 @@ class AsyncSocket : virtual public AsyncTransportWrapper { ...@@ -431,6 +431,20 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
return tfoFinished_; 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 // Methods controlling socket options
/** /**
......
...@@ -2465,6 +2465,7 @@ TEST(AsyncSocketTest, ConnectTFO) { ...@@ -2465,6 +2465,7 @@ TEST(AsyncSocketTest, ConnectTFO) {
ASSERT_EQ(1, rcb.buffers.size()); ASSERT_EQ(1, rcb.buffers.size());
ASSERT_EQ(sizeof(buf), rcb.buffers[0].length); ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size())); EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
} }
TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) { TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) {
...@@ -2514,6 +2515,7 @@ TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) { ...@@ -2514,6 +2515,7 @@ TEST(AsyncSocketTest, ConnectTFOSupplyEarlyReadCB) {
ASSERT_EQ(1, rcb.buffers.size()); ASSERT_EQ(1, rcb.buffers.size());
ASSERT_EQ(sizeof(buf), rcb.buffers[0].length); ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size())); 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) { ...@@ -2543,10 +2545,9 @@ TEST(AsyncSocketTest, ConnectRefusedTFO) {
if (!socket->getTFOFinished()) { if (!socket->getTFOFinished()) {
EXPECT_EQ(STATE_FAILED, write1.state); EXPECT_EQ(STATE_FAILED, write1.state);
EXPECT_FALSE(socket->getTFOFinished());
} else { } else {
EXPECT_EQ(STATE_SUCCEEDED, write1.state); EXPECT_EQ(STATE_SUCCEEDED, write1.state);
EXPECT_TRUE(socket->getTFOFinished()); EXPECT_FALSE(socket->getTFOSucceded());
} }
EXPECT_EQ(STATE_FAILED, write2.state); EXPECT_EQ(STATE_FAILED, write2.state);
...@@ -2668,6 +2669,7 @@ TEST(AsyncSocketTest, TestTFOUnsupported) { ...@@ -2668,6 +2669,7 @@ TEST(AsyncSocketTest, TestTFOUnsupported) {
ASSERT_EQ(1, rcb.buffers.size()); ASSERT_EQ(1, rcb.buffers.size());
ASSERT_EQ(sizeof(buf), rcb.buffers[0].length); ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size())); EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
} }
TEST(AsyncSocketTest, TestTFOUnsupportedTimeout) { TEST(AsyncSocketTest, TestTFOUnsupportedTimeout) {
...@@ -2874,6 +2876,7 @@ TEST(AsyncSocketTest, ConnectTFOWithBigData) { ...@@ -2874,6 +2876,7 @@ TEST(AsyncSocketTest, ConnectTFOWithBigData) {
ASSERT_EQ(1, rcb.buffers.size()); ASSERT_EQ(1, rcb.buffers.size());
ASSERT_EQ(sizeof(buf), rcb.buffers[0].length); ASSERT_EQ(sizeof(buf), rcb.buffers[0].length);
EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size())); EXPECT_EQ(0, memcmp(rcb.buffers[0].buffer, buf.data(), buf.size()));
EXPECT_EQ(socket->getTFOFinished(), socket->getTFOSucceded());
} }
#endif #endif
...@@ -65,8 +65,9 @@ int main(int argc, char** argv) { ...@@ -65,8 +65,9 @@ int main(int argc, char** argv) {
sock.write((const uint8_t*)FLAGS_msg.data(), FLAGS_msg.size()); sock.write((const uint8_t*)FLAGS_msg.data(), FLAGS_msg.size());
LOG(ERROR) << "TFO attempted: " << sockAddr->getTFOAttempted(); LOG(INFO) << "TFO attempted: " << sockAddr->getTFOAttempted();
LOG(ERROR) << "TFO finished: " << sockAddr->getTFOFinished(); LOG(INFO) << "TFO finished: " << sockAddr->getTFOFinished();
LOG(INFO) << "TFO success: " << sockAddr->getTFOSucceded();
std::array<char, 1024> buf; std::array<char, 1024> buf;
int32_t bytesRead = 0; int32_t bytesRead = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment