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