diff options
author | 2021-05-11 16:21:36 +0000 | |
---|---|---|
committer | 2021-05-11 16:21:36 +0000 | |
commit | 94a9ae334ed3c4690a3fc9d3d1ea7180784bcdf3 (patch) | |
tree | bd1f9a86539bb8f89e2d1bb7a24f82807dbe6930 /libs/binder/RpcSession.cpp | |
parent | 279589cbc31700cad9c0c6ae052c0788d6e10187 (diff) | |
parent | 76d2c1f066b1c2320d37c703b231d458b5fd224b (diff) |
Merge changes I9b5b2876,I3b93e0a9
* changes:
libbinder: RPC fixup retry logic
libbinder: vsock compiles on host
Diffstat (limited to 'libs/binder/RpcSession.cpp')
-rw-r--r-- | libs/binder/RpcSession.cpp | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/libs/binder/RpcSession.cpp b/libs/binder/RpcSession.cpp index d9b5c735a3..0471705ede 100644 --- a/libs/binder/RpcSession.cpp +++ b/libs/binder/RpcSession.cpp @@ -61,14 +61,10 @@ bool RpcSession::setupUnixDomainClient(const char* path) { return setupSocketClient(UnixSocketAddress(path)); } -#ifdef __BIONIC__ - bool RpcSession::setupVsockClient(unsigned int cid, unsigned int port) { return setupSocketClient(VsockSocketAddress(cid, port)); } -#endif // __BIONIC__ - bool RpcSession::setupInetClient(const char* addr, unsigned int port) { auto aiStart = InetSocketAddress::getAddrInfo(addr, port); if (aiStart == nullptr) return false; @@ -219,42 +215,52 @@ bool RpcSession::setupSocketClient(const RpcSocketAddress& addr) { // we've already setup one client for (size_t i = 0; i + 1 < numThreadsAvailable; i++) { - // TODO(b/185167543): avoid race w/ accept4 not being called on server - for (size_t tries = 0; tries < 5; tries++) { - if (setupOneSocketClient(addr, mId.value())) break; - usleep(10000); - } + // TODO(b/185167543): shutdown existing connections? + if (!setupOneSocketClient(addr, mId.value())) return false; } return true; } bool RpcSession::setupOneSocketClient(const RpcSocketAddress& addr, int32_t id) { - unique_fd serverFd( - TEMP_FAILURE_RETRY(socket(addr.addr()->sa_family, SOCK_STREAM | SOCK_CLOEXEC, 0))); - if (serverFd == -1) { - int savedErrno = errno; - ALOGE("Could not create socket at %s: %s", addr.toString().c_str(), strerror(savedErrno)); - return false; - } + for (size_t tries = 0; tries < 5; tries++) { + if (tries > 0) usleep(10000); + + unique_fd serverFd( + TEMP_FAILURE_RETRY(socket(addr.addr()->sa_family, SOCK_STREAM | SOCK_CLOEXEC, 0))); + if (serverFd == -1) { + int savedErrno = errno; + ALOGE("Could not create socket at %s: %s", addr.toString().c_str(), + strerror(savedErrno)); + return false; + } - if (0 != TEMP_FAILURE_RETRY(connect(serverFd.get(), addr.addr(), addr.addrSize()))) { - int savedErrno = errno; - ALOGE("Could not connect socket at %s: %s", addr.toString().c_str(), strerror(savedErrno)); - return false; - } + if (0 != TEMP_FAILURE_RETRY(connect(serverFd.get(), addr.addr(), addr.addrSize()))) { + if (errno == ECONNRESET) { + ALOGW("Connection reset on %s", addr.toString().c_str()); + continue; + } + int savedErrno = errno; + ALOGE("Could not connect socket at %s: %s", addr.toString().c_str(), + strerror(savedErrno)); + return false; + } - if (sizeof(id) != TEMP_FAILURE_RETRY(write(serverFd.get(), &id, sizeof(id)))) { - int savedErrno = errno; - ALOGE("Could not write id to socket at %s: %s", addr.toString().c_str(), - strerror(savedErrno)); - return false; - } + if (sizeof(id) != TEMP_FAILURE_RETRY(write(serverFd.get(), &id, sizeof(id)))) { + int savedErrno = errno; + ALOGE("Could not write id to socket at %s: %s", addr.toString().c_str(), + strerror(savedErrno)); + return false; + } - LOG_RPC_DETAIL("Socket at %s client with fd %d", addr.toString().c_str(), serverFd.get()); + LOG_RPC_DETAIL("Socket at %s client with fd %d", addr.toString().c_str(), serverFd.get()); - addClient(std::move(serverFd)); - return true; + addClient(std::move(serverFd)); + return true; + } + + ALOGE("Ran out of retries to connect to %s", addr.toString().c_str()); + return false; } void RpcSession::addClient(unique_fd fd) { |