summary refs log tree commit diff
path: root/synapse/federation
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/federation')
-rw-r--r--synapse/federation/federation_server.py19
-rw-r--r--synapse/federation/transaction_queue.py22
2 files changed, 35 insertions, 6 deletions
diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py
index c48a41b5d5..d1ec0b9eac 100644
--- a/synapse/federation/federation_server.py
+++ b/synapse/federation/federation_server.py
@@ -118,7 +118,7 @@ class FederationServer(FederationBase):
 
                 def handle_failure(failure):
                     failure.trap(FederationError)
-                    self.enqueue_failure(failure.value, transaction.origin)
+                    self.send_failure(failure.value, transaction.origin)
 
                 d.addErrback(handle_failure)
 
@@ -132,7 +132,7 @@ class FederationServer(FederationBase):
                         edu.content
                     )
 
-            for failure in getattr(transaction, "failures", []):
+            for failure in getattr(transaction, "pdu_failures", []):
                 logger.info("Got failure %r", failure)
 
             results = yield defer.DeferredList(dl, consumeErrors=True)
@@ -143,11 +143,15 @@ class FederationServer(FederationBase):
                 ret.append({})
             else:
                 logger.exception(r[1])
-                ret.append({"error": str(r[1])})
+                ret.append({"error": str(r[1].value)})
 
         logger.debug("Returning: %s", str(ret))
 
-        response = ret
+        response = {
+            "pdus": dict(zip(
+                (p.event_id for p in pdu_list), ret
+            )),
+        }
 
         yield self.transaction_actions.set_response(
             transaction,
@@ -358,6 +362,13 @@ class FederationServer(FederationBase):
                 affected=pdu.event_id,
             )
 
+        raise FederationError(
+            "ERROR",
+            403,
+            "Forbidden",
+            affected=pdu.event_id,
+        )
+
         state = None
 
         auth_chain = []
diff --git a/synapse/federation/transaction_queue.py b/synapse/federation/transaction_queue.py
index bb20f2ebab..6faaa066fb 100644
--- a/synapse/federation/transaction_queue.py
+++ b/synapse/federation/transaction_queue.py
@@ -91,7 +91,7 @@ class TransactionQueue(object):
                 if not deferred.called:
                     deferred.errback(failure)
                 else:
-                    logger.warn("Failed to send pdu", failure)
+                    logger.warn("Failed to send pdu", failure.value)
 
             with PreserveLoggingContext():
                 self._attempt_new_transaction(destination).addErrback(eb)
@@ -116,7 +116,7 @@ class TransactionQueue(object):
             if not deferred.called:
                 deferred.errback(failure)
             else:
-                logger.warn("Failed to send edu", failure)
+                logger.warn("Failed to send edu", failure.value)
 
         with PreserveLoggingContext():
             self._attempt_new_transaction(destination).addErrback(eb)
@@ -133,6 +133,15 @@ class TransactionQueue(object):
             (failure, deferred)
         )
 
+        def eb(failure):
+            if not deferred.called:
+                deferred.errback(failure)
+            else:
+                logger.warn("Failed to send failure", failure.value)
+
+        with PreserveLoggingContext():
+            self._attempt_new_transaction(destination).addErrback(eb)
+
         yield deferred
 
     @defer.inlineCallbacks
@@ -249,6 +258,15 @@ class TransactionQueue(object):
                     transaction, json_data_cb
                 )
                 code = 200
+
+                if response:
+                    for e_id, r in getattr(response, "pdus", {}).items():
+                        if "error" in r:
+                            logger.warn(
+                                "Transaction returned error for %s: %s",
+                                e_id, r,
+                            )
+
             except HttpResponseException as e:
                 code = e.code
                 response = e.response