You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2013/09/20 17:43:41 UTC

svn commit: r1525041 - in /qpid/trunk/qpid/cpp/src/qpid/messaging/amqp: ConnectionContext.cpp ConnectionContext.h

Author: gsim
Date: Fri Sep 20 15:43:41 2013
New Revision: 1525041

URL: http://svn.apache.org/r1525041
Log:
QPID-5147: improvements to error handling

Modified:
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp?rev=1525041&r1=1525040&r2=1525041&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp Fri Sep 20 15:43:41 2013
@@ -264,7 +264,7 @@ void ConnectionContext::attach(boost::sh
 {
     qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock);
     lnk->configure();
-    attach(lnk->sender);
+    attach(ssn, lnk->sender);
     checkClosed(ssn, lnk);
     lnk->verify();
     QPID_LOG(debug, "Attach succeeded to " << lnk->getTarget());
@@ -274,13 +274,13 @@ void ConnectionContext::attach(boost::sh
 {
     qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock);
     lnk->configure();
-    attach(lnk->receiver, lnk->capacity);
+    attach(ssn, lnk->receiver, lnk->capacity);
     checkClosed(ssn, lnk);
     lnk->verify();
     QPID_LOG(debug, "Attach succeeded from " << lnk->getSource());
 }
 
-void ConnectionContext::attach(pn_link_t* link, int credit)
+void ConnectionContext::attach(boost::shared_ptr<SessionContext> ssn, pn_link_t* link, int credit)
 {
     pn_link_open(link);
     QPID_LOG(debug, "Link attach sent for " << link << ", state=" << pn_link_state(link));
@@ -288,7 +288,7 @@ void ConnectionContext::attach(pn_link_t
     wakeupDriver();
     while (pn_link_state(link) & PN_REMOTE_UNINIT) {
         QPID_LOG(debug, "Waiting for confirmation of link attach for " << link << ", state=" << pn_link_state(link) << "...");
-        wait();
+        wait(ssn);
     }
 }
 
@@ -454,8 +454,15 @@ void ConnectionContext::checkClosed(boos
 {
     check();
     if ((pn_session_state(ssn->session) & REQUIRES_CLOSE) == REQUIRES_CLOSE) {
+        pn_condition_t* error = pn_session_remote_condition(ssn->session);
+        std::stringstream text;
+        if (pn_condition_is_set(error)) {
+            text << "Session ended by peer with " << pn_condition_get_name(error) << ": " << pn_condition_get_description(error);
+        } else {
+            text << "Session ended by peer";
+        }
         pn_session_close(ssn->session);
-        throw qpid::messaging::SessionError("Session ended by peer");
+        throw qpid::messaging::SessionError(text.str());
     } else if ((pn_session_state(ssn->session) & IS_CLOSED) == IS_CLOSED) {
         throw qpid::messaging::SessionError("Session has ended");
     }
@@ -497,14 +504,14 @@ void ConnectionContext::restartSession(b
 
     for (SessionContext::SenderMap::iterator i = s->senders.begin(); i != s->senders.end(); ++i) {
         QPID_LOG(debug, id << " reattaching sender " << i->first);
-        attach(i->second->sender);
+        attach(s, i->second->sender);
         i->second->verify();
         QPID_LOG(debug, id << " sender " << i->first << " reattached");
         i->second->resend();
     }
     for (SessionContext::ReceiverMap::iterator i = s->receivers.begin(); i != s->receivers.end(); ++i) {
         QPID_LOG(debug, id << " reattaching receiver " << i->first);
-        attach(i->second->receiver, i->second->capacity);
+        attach(s, i->second->receiver, i->second->capacity);
         i->second->verify();
         QPID_LOG(debug, id << " receiver " << i->first << " reattached");
     }
@@ -767,7 +774,7 @@ void ConnectionContext::open()
     if (state != DISCONNECTED) throw qpid::messaging::ConnectionError("Connection was already opened!");
     if (!driver) driver = DriverImpl::getDefault();
 
-    tryConnect();
+    autoconnect();
 }
 
 
@@ -936,6 +943,7 @@ bool ConnectionContext::tryConnect(const
         }
     } catch (const std::exception& e) {
         QPID_LOG(info, id << " Error while connecting: " << e.what());
+        state = DISCONNECTED;
     }
     transport = boost::shared_ptr<Transport>();
     return false;

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h?rev=1525041&r1=1525040&r2=1525041&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.h Fri Sep 20 15:43:41 2013
@@ -147,7 +147,7 @@ class ConnectionContext : public qpid::s
     void checkClosed(boost::shared_ptr<SessionContext>, boost::shared_ptr<SenderContext>);
     void checkClosed(boost::shared_ptr<SessionContext>, pn_link_t*);
     void wakeupDriver();
-    void attach(pn_link_t*, int credit=0);
+    void attach(boost::shared_ptr<SessionContext>, pn_link_t*, int credit=0);
     void autoconnect();
     bool tryConnect();
     bool tryConnect(const qpid::Url& url);



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org