You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2014/07/26 18:28:21 UTC

git commit: THRIFT-585 exceptions in the autogenerated send_METHOD functions are not propagated Client: Python (Twisted) Patch: Mattias de Zalenski, James Broadhead

Repository: thrift
Updated Branches:
  refs/heads/master 3c494114b -> 8345772f2


THRIFT-585 exceptions in the autogenerated send_METHOD functions are not propagated
Client: Python (Twisted)
Patch: Mattias de Zalenski, James Broadhead

This closes #165


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/8345772f
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/8345772f
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/8345772f

Branch: refs/heads/master
Commit: 8345772f299a308496ebaae6516f3f813469f829
Parents: 3c49411
Author: Jens Geyer <je...@apache.org>
Authored: Sat Jul 26 18:02:12 2014 +0200
Committer: Jens Geyer <je...@apache.org>
Committed: Sat Jul 26 18:02:12 2014 +0200

----------------------------------------------------------------------
 compiler/cpp/src/generate/t_py_generator.cc | 59 +++++++++++++++++++-----
 lib/py/src/transport/TTwisted.py            |  4 +-
 2 files changed, 49 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/8345772f/compiler/cpp/src/generate/t_py_generator.cc
----------------------------------------------------------------------
diff --git a/compiler/cpp/src/generate/t_py_generator.cc b/compiler/cpp/src/generate/t_py_generator.cc
index 5d23366..25ee45f 100644
--- a/compiler/cpp/src/generate/t_py_generator.cc
+++ b/compiler/cpp/src/generate/t_py_generator.cc
@@ -1279,19 +1279,23 @@ void t_py_generator::generate_service_client(t_service* tservice) {
       indent(f_service_) << "self._seqid += 1" << endl;
       if (!(*f_iter)->is_oneway()) {
         indent(f_service_) <<
-          "d = self._reqs[self._seqid] = defer.Deferred()" << endl;
+          "self._reqs[self._seqid] = defer.Deferred()" << endl;
+        indent(f_service_) <<
+          "d = defer.maybeDeferred(self.send_" << funname << ",";
       }
     } else if (gen_tornado_) {
       indent(f_service_) << "self._seqid += 1" << endl;
       if (!(*f_iter)->is_oneway()) {
         indent(f_service_) <<
           "self._reqs[self._seqid] = callback" << endl;
+        indent(f_service_) <<
+          "self.send_" << funname << "(";
       }
+    } else {
+      indent(f_service_) <<
+        "self.send_" << funname << "(";
     }
 
-    indent(f_service_) <<
-      "self.send_" << funname << "(";
-
     bool first = true;
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       if (first) {
@@ -1314,27 +1318,58 @@ void t_py_generator::generate_service_client(t_service* tservice) {
     f_service_ << ")" << endl;
 
     if (!(*f_iter)->is_oneway()) {
-      f_service_ << indent();
+
       if (gen_twisted_) {
-        f_service_ << "return d" << endl;
+        indent(f_service_) << "d.addCallbacks(self.cb_send_" << funname << "," << endl <<
+          indent() << indent() << "errback=self.eb_send_" << funname << "," << endl <<
+          indent() << indent() << "callbackArgs=(self._seqid,)," << endl <<
+          indent() << indent() << "errbackArgs=(self._seqid,))" << endl;
+        indent(f_service_) << "return d" << endl;
+
       } else if (gen_tornado_) {
+        f_service_ << indent();
         f_service_ << "self.recv_dispatch()" << endl;
       } else {
+        f_service_ << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           f_service_ << "return ";
         }
         f_service_ <<
           "self.recv_" << funname << "()" << endl;
       }
-    } else {
-      if (gen_twisted_) {
-        f_service_ <<
-          indent() << "return defer.succeed(None)" << endl;
-      }
     }
+
     indent_down();
     f_service_ << endl;
 
+    if (gen_twisted_) {
+      indent(f_service_) <<
+        "def cb_send_" << funname << "(self, _, seqid):" << endl;
+      indent_up();
+      if ((*f_iter)->is_oneway()) {
+        f_service_ <<
+          indent() << "d = self._reqs.pop(seqid)" << endl <<
+          indent() << "d.callback(None)" << endl;
+      } else {
+        f_service_ <<
+          indent() << "d = self._reqs[seqid]" << endl;
+      }
+      f_service_ << indent() << "return d" << endl;
+      indent_down();
+
+      f_service_ << endl;
+
+      indent(f_service_) <<
+        "def eb_send_" << funname << "(self, e, seqid):" << endl;
+      indent_up();
+      f_service_ <<
+        indent() << "d = self._reqs.pop(seqid)" << endl <<
+        indent() << "d.errback(e)" << endl <<
+        indent() << "return d" << endl;
+      indent_down();
+      f_service_ << endl;
+    }
+
     indent(f_service_) <<
       "def send_" << function_signature(*f_iter, false, MANDATORY_FOR_ONEWAY_ELSE_NONE) << ":" << endl;
 
@@ -1367,7 +1402,7 @@ void t_py_generator::generate_service_client(t_service* tservice) {
       f_service_ <<
         indent() << "args.write(oprot)" << endl <<
         indent() << "oprot.writeMessageEnd()" << endl <<
-        indent() << "oprot.trans.flush()" << endl;
+        indent() << "return oprot.trans.flush()" << endl;
     } else if (gen_tornado_) {
       f_service_ <<
         indent() << "args.write(oprot)" << endl <<

http://git-wip-us.apache.org/repos/asf/thrift/blob/8345772f/lib/py/src/transport/TTwisted.py
----------------------------------------------------------------------
diff --git a/lib/py/src/transport/TTwisted.py b/lib/py/src/transport/TTwisted.py
index 2b77414..0e03f08 100644
--- a/lib/py/src/transport/TTwisted.py
+++ b/lib/py/src/transport/TTwisted.py
@@ -42,7 +42,7 @@ class TMessageSenderTransport(TTransport.TTransportBase):
     def flush(self):
         msg = self.__wbuf.getvalue()
         self.__wbuf = StringIO()
-        self.sendMessage(msg)
+        return defer.maybeDeferred(self.sendMessage, msg)
 
     def sendMessage(self, message):
         raise NotImplementedError
@@ -55,7 +55,7 @@ class TCallbackTransport(TMessageSenderTransport):
         self.func = func
 
     def sendMessage(self, message):
-        self.func(message)
+        return self.func(message)
 
 
 class ThriftClientProtocol(basic.Int32StringReceiver):