Commit 4c7a736d authored by Kyle Nekritz's avatar Kyle Nekritz Committed by Facebook Github Bot

Move address caching logic from AsyncSSLSocket to AsyncSocket.

Summary: So that it is available on other transports.

Reviewed By: Orvid

Differential Revision: D5302039

fbshipit-source-id: cbfdadd158061ed9a2b3ed3e0960ce66f0d545fd
parent d71b7361
...@@ -462,8 +462,8 @@ void AsyncSSLSocket::sslAccept( ...@@ -462,8 +462,8 @@ void AsyncSSLSocket::sslAccept(
// Cache local and remote socket addresses to keep them available // Cache local and remote socket addresses to keep them available
// after socket file descriptor is closed. // after socket file descriptor is closed.
if (cacheAddrOnFailure_ && -1 != getFd()) { if (cacheAddrOnFailure_) {
cacheLocalPeerAddr(); cacheAddresses();
} }
handshakeStartTime_ = std::chrono::steady_clock::now(); handshakeStartTime_ = std::chrono::steady_clock::now();
...@@ -665,19 +665,6 @@ void AsyncSSLSocket::invokeHandshakeCB() { ...@@ -665,19 +665,6 @@ void AsyncSSLSocket::invokeHandshakeCB() {
} }
} }
void AsyncSSLSocket::cacheLocalPeerAddr() {
SocketAddress address;
try {
getLocalAddress(&address);
getPeerAddress(&address);
} catch (const std::system_error& e) {
// The handle can be still valid while the connection is already closed.
if (e.code() != std::error_code(ENOTCONN, std::system_category())) {
throw;
}
}
}
void AsyncSSLSocket::connect( void AsyncSSLSocket::connect(
ConnectCallback* callback, ConnectCallback* callback,
const folly::SocketAddress& address, const folly::SocketAddress& address,
...@@ -755,8 +742,8 @@ void AsyncSSLSocket::sslConn( ...@@ -755,8 +742,8 @@ void AsyncSSLSocket::sslConn(
// Cache local and remote socket addresses to keep them available // Cache local and remote socket addresses to keep them available
// after socket file descriptor is closed. // after socket file descriptor is closed.
if (cacheAddrOnFailure_ && -1 != getFd()) { if (cacheAddrOnFailure_) {
cacheLocalPeerAddr(); cacheAddresses();
} }
verifyPeer_ = verifyPeer; verifyPeer_ = verifyPeer;
......
...@@ -811,8 +811,6 @@ class AsyncSSLSocket : public virtual AsyncSocket { ...@@ -811,8 +811,6 @@ class AsyncSSLSocket : public virtual AsyncSocket {
void invokeConnectSuccess() override; void invokeConnectSuccess() override;
void scheduleConnectTimeout() override; void scheduleConnectTimeout() override;
void cacheLocalPeerAddr();
void startSSLConnect(); void startSSLConnect();
static void sslInfoCallback(const SSL *ssl, int type, int val); static void sslInfoCallback(const SSL *ssl, int type, int val);
......
...@@ -1285,17 +1285,39 @@ bool AsyncSocket::isDetachable() const { ...@@ -1285,17 +1285,39 @@ bool AsyncSocket::isDetachable() const {
return !ioHandler_.isHandlerRegistered() && !writeTimeout_.isScheduled(); return !ioHandler_.isHandlerRegistered() && !writeTimeout_.isScheduled();
} }
void AsyncSocket::getLocalAddress(folly::SocketAddress* address) const { void AsyncSocket::cacheAddresses() {
if (fd_ >= 0) {
try {
cacheLocalAddress();
cachePeerAddress();
} catch (const std::system_error& e) {
if (e.code() != std::error_code(ENOTCONN, std::system_category())) {
VLOG(1) << "Error caching addresses: " << e.code().value() << ", "
<< e.code().message();
}
}
}
}
void AsyncSocket::cacheLocalAddress() const {
if (!localAddr_.isInitialized()) { if (!localAddr_.isInitialized()) {
localAddr_.setFromLocalAddress(fd_); localAddr_.setFromLocalAddress(fd_);
} }
*address = localAddr_;
} }
void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const { void AsyncSocket::cachePeerAddress() const {
if (!addr_.isInitialized()) { if (!addr_.isInitialized()) {
addr_.setFromPeerAddress(fd_); addr_.setFromPeerAddress(fd_);
} }
}
void AsyncSocket::getLocalAddress(folly::SocketAddress* address) const {
cacheLocalAddress();
*address = localAddr_;
}
void AsyncSocket::getPeerAddress(folly::SocketAddress* address) const {
cachePeerAddress();
*address = addr_; *address = addr_;
} }
......
...@@ -786,6 +786,13 @@ class AsyncSocket : virtual public AsyncTransportWrapper { ...@@ -786,6 +786,13 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
evbChangeCb_ = std::move(cb); evbChangeCb_ = std::move(cb);
} }
/**
* Attempt to cache the current local and peer addresses (if not already
* cached) so that they are available from getPeerAddress() and
* getLocalAddress() even after the socket is closed.
*/
void cacheAddresses();
/** /**
* writeReturn is the total number of bytes written, or WRITE_ERROR on error. * writeReturn is the total number of bytes written, or WRITE_ERROR on error.
* If no data has been written, 0 is returned. * If no data has been written, 0 is returned.
...@@ -1123,6 +1130,9 @@ class AsyncSocket : virtual public AsyncTransportWrapper { ...@@ -1123,6 +1130,9 @@ class AsyncSocket : virtual public AsyncTransportWrapper {
std::string withAddr(const std::string& s); std::string withAddr(const std::string& s);
void cacheLocalAddress() const;
void cachePeerAddress() const;
StateEnum state_; ///< StateEnum describing current state StateEnum state_; ///< StateEnum describing current state
uint8_t shutdownFlags_; ///< Shutdown state (ShutdownFlags) uint8_t shutdownFlags_; ///< Shutdown state (ShutdownFlags)
uint16_t eventFlags_; ///< EventBase::HandlerFlags settings uint16_t eventFlags_; ///< EventBase::HandlerFlags settings
......
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