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);