Return-Path: X-Original-To: apmail-qpid-commits-archive@www.apache.org Delivered-To: apmail-qpid-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 28351D45C for ; Wed, 21 Nov 2012 19:31:48 +0000 (UTC) Received: (qmail 26995 invoked by uid 500); 21 Nov 2012 19:31:46 -0000 Delivered-To: apmail-qpid-commits-archive@qpid.apache.org Received: (qmail 26974 invoked by uid 500); 21 Nov 2012 19:31:46 -0000 Mailing-List: contact commits-help@qpid.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@qpid.apache.org Delivered-To: mailing list commits@qpid.apache.org Received: (qmail 26944 invoked by uid 99); 21 Nov 2012 19:31:46 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Nov 2012 19:31:46 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Nov 2012 19:31:43 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 7B27F23889E2 for ; Wed, 21 Nov 2012 19:31:22 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1412241 - in /qpid/trunk/qpid/cpp/src/qpid/messaging/amqp: ConnectionContext.cpp SenderContext.cpp SenderContext.h SessionContext.cpp SessionContext.h Date: Wed, 21 Nov 2012 19:31:21 -0000 To: commits@qpid.apache.org From: gsim@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121121193122.7B27F23889E2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: gsim Date: Wed Nov 21 19:31:20 2012 New Revision: 1412241 URL: http://svn.apache.org/viewvc?rev=1412241&view=rev Log: QPID-4451: wait for outgoing messages to settle when closing Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.cpp qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.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=1412241&r1=1412240&r2=1412241&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/ConnectionContext.cpp Wed Nov 21 19:31:20 2012 @@ -149,7 +149,14 @@ void ConnectionContext::close() qpid::sys::ScopedLock l(lock); if (state != CONNECTED) return; if (!(pn_connection_state(connection) & PN_LOCAL_CLOSED)) { - for (SessionMap::iterator i = sessions.begin(); i != sessions.end(); ++i){ + for (SessionMap::iterator i = sessions.begin(); i != sessions.end(); ++i) { + //wait for outstanding sends to settle + while (!i->second->settled()) { + QPID_LOG(debug, "Waiting for sends to settle before closing"); + wait();//wait until message has been confirmed + } + + if (!(pn_session_state(i->second->session) & PN_LOCAL_CLOSED)) { pn_session_close(i->second->session); } Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp?rev=1412241&r1=1412240&r2=1412241&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.cpp Wed Nov 21 19:31:20 2012 @@ -350,4 +350,10 @@ void SenderContext::configure(pn_terminu helper.setNodeProperties(target); } } + +bool SenderContext::settled() +{ + return processUnsettled() == 0; +} + }}} // namespace qpid::messaging::amqp Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h?rev=1412241&r1=1412240&r2=1412241&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SenderContext.h Wed Nov 21 19:31:20 2012 @@ -69,6 +69,7 @@ class SenderContext const std::string& getTarget() const; Delivery* send(const qpid::messaging::Message& message); void configure() const; + bool settled(); private: friend class ConnectionContext; typedef std::deque Deliveries; Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.cpp?rev=1412241&r1=1412240&r2=1412241&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.cpp Wed Nov 21 19:31:20 2012 @@ -144,4 +144,13 @@ void SessionContext::acknowledge(const q } } +bool SessionContext::settled() +{ + bool result = true; + for (SenderMap::iterator i = senders.begin(); i != senders.end(); ++i) { + if (!i->second->settled()) result = false; + } + return result; +} + }}} // namespace qpid::messaging::amqp Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.h URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.h?rev=1412241&r1=1412240&r2=1412241&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.h (original) +++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SessionContext.h Wed Nov 21 19:31:20 2012 @@ -59,6 +59,7 @@ class SessionContext boost::shared_ptr nextReceiver(qpid::messaging::Duration timeout); uint32_t getReceivable(); uint32_t getUnsettledAcks(); + bool settled(); private: friend class ConnectionContext; typedef std::map > SenderMap; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org For additional commands, e-mail: commits-help@qpid.apache.org