diff options
Diffstat (limited to 'qpid/cpp/src/qpid/cluster')
-rw-r--r-- | qpid/cpp/src/qpid/cluster/Connection.cpp | 10 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/cluster/Quorum_cman.cpp | 8 |
2 files changed, 13 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/cluster/Connection.cpp b/qpid/cpp/src/qpid/cluster/Connection.cpp index 4cc977d14a..6873827b81 100644 --- a/qpid/cpp/src/qpid/cluster/Connection.cpp +++ b/qpid/cpp/src/qpid/cluster/Connection.cpp @@ -156,8 +156,17 @@ bool Connection::checkUnsupported(const AMQBody& body) { return !message.empty(); } +struct GiveReadCreditOnExit { + Connection& connection; + int credit; + GiveReadCreditOnExit(Connection& connection_, int credit_) : + connection(connection_), credit(credit_) {} + ~GiveReadCreditOnExit() { connection.giveReadCredit(credit); } +}; + // Called in delivery thread, in cluster order. void Connection::deliveredFrame(const EventFrame& f) { + GiveReadCreditOnExit gc(*this, f.readCredit); assert(!catchUp); currentChannel = f.frame.getChannel(); if (f.frame.getBody() // frame can be emtpy with just readCredit @@ -171,7 +180,6 @@ void Connection::deliveredFrame(const EventFrame& f) { if (ss) ss->out(const_cast<AMQFrame&>(f.frame)); } } - giveReadCredit(f.readCredit); } // A local connection is closed by the network layer. diff --git a/qpid/cpp/src/qpid/cluster/Quorum_cman.cpp b/qpid/cpp/src/qpid/cluster/Quorum_cman.cpp index 277adaf7b1..507d9649b9 100644 --- a/qpid/cpp/src/qpid/cluster/Quorum_cman.cpp +++ b/qpid/cpp/src/qpid/cluster/Quorum_cman.cpp @@ -7,9 +7,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -33,8 +33,8 @@ namespace { boost::function<void()> errorFn; -void cmanCallbackFn(cman_handle_t handle, void */*privdata*/, int reason, int arg) { - if (reason == CMAN_REASON_STATECHANGE && arg == 0) { +void cmanCallbackFn(cman_handle_t handle, void */*privdata*/, int reason, int /*arg*/) { + if (reason == CMAN_REASON_STATECHANGE && !cman_is_quorate(handle)) { QPID_LOG(critical, "Lost contact with cluster quorum."); if (errorFn) errorFn(); cman_stop_notification(handle); |