You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2015/10/11 01:01:36 UTC
[1/2] thrift git commit: THRIFT-3371: added test for abstract
namespace domain sockets.
Repository: thrift
Updated Branches:
refs/heads/master 30f465db9 -> 5d93b04f9
THRIFT-3371: added test for abstract namespace domain sockets.
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/dd08f6e4
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/dd08f6e4
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/dd08f6e4
Branch: refs/heads/master
Commit: dd08f6e43cf1d9eccf5e5de702106bbbbd9b2b07
Parents: 30f465d
Author: pavlo <pa...@sidefx.com>
Authored: Thu Oct 8 16:43:56 2015 -0400
Committer: Roger Meier <ro...@apache.org>
Committed: Sun Oct 11 00:47:27 2015 +0200
----------------------------------------------------------------------
test/cpp/src/TestClient.cpp | 21 +++++++++++++++++++--
test/cpp/src/TestServer.cpp | 23 ++++++++++++++++++++---
test/crossrunner/run.py | 4 +++-
test/crossrunner/test.py | 13 +++++++------
4 files changed, 49 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/thrift/blob/dd08f6e4/test/cpp/src/TestClient.cpp
----------------------------------------------------------------------
diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp
index e709899..1ab4d21 100644
--- a/test/cpp/src/TestClient.cpp
+++ b/test/cpp/src/TestClient.cpp
@@ -125,6 +125,7 @@ int main(int argc, char** argv) {
string transport_type = "buffered";
string protocol_type = "binary";
string domain_socket = "";
+ bool abstract_namespace = false;
bool noinsane = false;
boost::program_options::options_description desc("Allowed options");
@@ -139,6 +140,8 @@ int main(int argc, char** argv) {
"domain-socket",
boost::program_options::value<string>(&domain_socket)->default_value(domain_socket),
"Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")(
+ "abstract-namespace",
+ "Look for the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
"transport",
boost::program_options::value<string>(&transport_type)->default_value(transport_type),
"Transport: buffered, framed, http, evhttp")(
@@ -188,6 +191,10 @@ int main(int argc, char** argv) {
ssl = true;
}
+ if (vm.count("abstract-namespace")) {
+ abstract_namespace = true;
+ }
+
if (vm.count("noinsane")) {
noinsane = true;
}
@@ -206,7 +213,13 @@ int main(int argc, char** argv) {
socket = factory->createSocket(host, port);
} else {
if (domain_socket != "") {
- socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
+ if (abstract_namespace) {
+ std::string abstract_socket("\0", 1);
+ abstract_socket += domain_socket;
+ socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket));
+ } else {
+ socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
+ }
port = 0;
} else {
socket = boost::shared_ptr<TSocket>(new TSocket(host, port));
@@ -236,7 +249,11 @@ int main(int argc, char** argv) {
}
// Connection info
- cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: " << domain_socket;
+ cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: ";
+ if (abstract_namespace) {
+ cout << '@';
+ }
+ cout << domain_socket;
if (port != 0) {
cout << host << ":" << port;
}
http://git-wip-us.apache.org/repos/asf/thrift/blob/dd08f6e4/test/cpp/src/TestServer.cpp
----------------------------------------------------------------------
diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp
index 66d3bb2..51169af 100644
--- a/test/cpp/src/TestServer.cpp
+++ b/test/cpp/src/TestServer.cpp
@@ -546,6 +546,7 @@ int main(int argc, char** argv) {
string protocol_type = "binary";
string server_type = "simple";
string domain_socket = "";
+ bool abstract_namespace = false;
size_t workers = 4;
boost::program_options::options_description desc("Allowed options");
@@ -556,6 +557,8 @@ int main(int argc, char** argv) {
boost::program_options::value<string>(&domain_socket)
->default_value(domain_socket),
"Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)")(
+ "abstract-namespace",
+ "Create the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
"server-type",
boost::program_options::value<string>(&server_type)->default_value(server_type),
"type of server, \"simple\", \"thread-pool\", \"threaded\", or \"nonblocking\"")(
@@ -618,6 +621,10 @@ int main(int argc, char** argv) {
ssl = true;
}
+ if (vm.count("abstract-namespace")) {
+ abstract_namespace = true;
+ }
+
// Dispatcher
boost::shared_ptr<TProtocolFactory> protocolFactory;
if (protocol_type == "json") {
@@ -653,8 +660,14 @@ int main(int argc, char** argv) {
serverSocket = boost::shared_ptr<TServerSocket>(new TSSLServerSocket(port, sslSocketFactory));
} else {
if (domain_socket != "") {
- unlink(domain_socket.c_str());
- serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(domain_socket));
+ if (abstract_namespace) {
+ std::string abstract_socket("\0", 1);
+ abstract_socket += domain_socket;
+ serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(abstract_socket));
+ } else {
+ unlink(domain_socket.c_str());
+ serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(domain_socket));
+ }
port = 0;
} else {
serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(port));
@@ -677,7 +690,11 @@ int main(int argc, char** argv) {
// Server Info
cout << "Starting \"" << server_type << "\" server (" << transport_type << "/" << protocol_type
- << ") listen on: " << domain_socket;
+ << ") listen on: ";
+ if (abstract_namespace) {
+ cout << '@';
+ }
+ cout << domain_socket;
if (port != 0) {
cout << port;
}
http://git-wip-us.apache.org/repos/asf/thrift/blob/dd08f6e4/test/crossrunner/run.py
----------------------------------------------------------------------
diff --git a/test/crossrunner/run.py b/test/crossrunner/run.py
index e3300ba..ae7d366 100644
--- a/test/crossrunner/run.py
+++ b/test/crossrunner/run.py
@@ -204,7 +204,7 @@ class PortAllocator(object):
return port if ok else self._get_domain_port()
def alloc_port(self, socket_type):
- if socket_type == 'domain':
+ if socket_type in ('domain', 'abstract'):
return self._get_domain_port()
else:
return self._get_tcp_port()
@@ -226,6 +226,8 @@ class PortAllocator(object):
path = domain_socket_path(port)
if os.path.exists(path):
os.remove(path)
+ elif socket_type == 'abstract':
+ self._dom_ports.remove(port)
else:
self._ports.remove(port)
except IOError as err:
http://git-wip-us.apache.org/repos/asf/thrift/blob/dd08f6e4/test/crossrunner/test.py
----------------------------------------------------------------------
diff --git a/test/crossrunner/test.py b/test/crossrunner/test.py
index 512e664..3750ba3 100644
--- a/test/crossrunner/test.py
+++ b/test/crossrunner/test.py
@@ -60,10 +60,11 @@ class TestProgram(object):
cmd[0] = abs_if_exists(cmd[0])
return cmd
- def _socket_arg(self, socket, port):
+ def _socket_args(self, socket, port):
return {
- 'ip-ssl': '--ssl',
- 'domain': '--domain-socket=%s' % domain_socket_path(port),
+ 'ip-ssl': ['--ssl'],
+ 'domain': ['--domain-socket=%s' % domain_socket_path(port)],
+ 'abstract': ['--abstract-namespace', '--domain-socket=%s' % domain_socket_path(port)],
}.get(socket, None)
def build_command(self, port):
@@ -71,9 +72,9 @@ class TestProgram(object):
args = []
args.append('--protocol=' + self.protocol)
args.append('--transport=' + self.transport)
- socket_arg = self._socket_arg(self.socket, port)
- if socket_arg:
- args.append(socket_arg)
+ socket_args = self._socket_args(self.socket, port)
+ if socket_args:
+ args += socket_args
args.append('--port=%d' % port)
if self._join_args:
cmd.append('%s' % " ".join(args))
[2/2] thrift git commit: THRIFT-3371 Abstract namespace Unix domain
sockets broken in C++
Posted by ro...@apache.org.
THRIFT-3371 Abstract namespace Unix domain sockets broken in C++
This closes #637
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/5d93b04f
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/5d93b04f
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/5d93b04f
Branch: refs/heads/master
Commit: 5d93b04f9ee4b75dc9b82122fef2a759f88d9fdb
Parents: dd08f6e
Author: pavlo <pa...@sidefx.com>
Authored: Thu Oct 8 16:48:45 2015 -0400
Committer: Roger Meier <ro...@apache.org>
Committed: Sun Oct 11 00:48:59 2015 +0200
----------------------------------------------------------------------
lib/cpp/src/thrift/transport/TServerSocket.cpp | 12 ++++++++++++
lib/cpp/src/thrift/transport/TSocket.cpp | 13 +++++++++++++
2 files changed, 25 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/thrift/blob/5d93b04f/lib/cpp/src/thrift/transport/TServerSocket.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp
index daa1524..0c973ee 100644
--- a/lib/cpp/src/thrift/transport/TServerSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp
@@ -420,8 +420,20 @@ void TServerSocket::listen() {
struct sockaddr_un address;
address.sun_family = AF_UNIX;
memcpy(address.sun_path, path_.c_str(), len);
+
socklen_t structlen = static_cast<socklen_t>(sizeof(address));
+ if (!address.sun_path[0]) { // abstract namespace socket
+#ifdef __linux__
+ // sun_path is not null-terminated in this case and structlen determines its length
+ structlen -= sizeof(address.sun_path) - len;
+#else
+ GlobalOutput.perror("TSocket::open() Abstract Namespace Domain sockets only supported on linux: ", -99);
+ throw TTransportException(TTransportException::NOT_OPEN,
+ " Abstract Namespace Domain socket path not supported");
+#endif
+ }
+
do {
if (0 == ::bind(serverSocket_, (struct sockaddr*)&address, structlen)) {
break;
http://git-wip-us.apache.org/repos/asf/thrift/blob/5d93b04f/lib/cpp/src/thrift/transport/TSocket.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp
index d336bb4..6ce524b 100644
--- a/lib/cpp/src/thrift/transport/TSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSocket.cpp
@@ -314,7 +314,20 @@ void TSocket::openConnection(struct addrinfo* res) {
struct sockaddr_un address;
address.sun_family = AF_UNIX;
memcpy(address.sun_path, path_.c_str(), len);
+
socklen_t structlen = static_cast<socklen_t>(sizeof(address));
+
+ if (!address.sun_path[0]) { // abstract namespace socket
+#ifdef __linux__
+ // sun_path is not null-terminated in this case and structlen determines its length
+ structlen -= sizeof(address.sun_path) - len;
+#else
+ GlobalOutput.perror("TSocket::open() Abstract Namespace Domain sockets only supported on linux: ", -99);
+ throw TTransportException(TTransportException::NOT_OPEN,
+ " Abstract Namespace Domain socket path not supported");
+#endif
+ }
+
ret = connect(socket_, (struct sockaddr*)&address, structlen);
#else
GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);