You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2008/11/05 18:09:34 UTC
svn commit: r711623 - in /incubator/qpid/trunk/qpid/cpp/src:
qpid/cluster/Cluster.cpp qpid/cluster/Connection.cpp
qpid/cluster/Connection.h tests/cluster_test.cpp tests/run_test
tests/vg_check
Author: aconway
Date: Wed Nov 5 09:09:33 2008
New Revision: 711623
URL: http://svn.apache.org/viewvc?rev=711623&view=rev
Log:
Cluster: clean up connections when a member leaves the cluster.
Fixed a memory error in cluster_test and some reporting errors in test scripts.
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.h
incubator/qpid/trunk/qpid/cpp/src/tests/cluster_test.cpp
incubator/qpid/trunk/qpid/cpp/src/tests/run_test
incubator/qpid/trunk/qpid/cpp/src/tests/vg_check
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Cluster.cpp Wed Nov 5 09:09:33 2008
@@ -565,6 +565,17 @@
}
mgmtObject->set_members(urlstr);
}
+
+ //close connections belonging to members that have now been excluded
+ for (ConnectionMap::iterator i = connections.begin(); i != connections.end();) {
+ MemberId member = i->first.getMember();
+ if (member != myId && !map.isMember(member)) {
+ i->second->left();
+ connections.erase(i++);
+ } else {
+ i++;
+ }
+ }
}
std::ostream& operator<<(std::ostream& o, const Cluster& cluster) {
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.cpp Wed Nov 5 09:09:33 2008
@@ -141,6 +141,7 @@
}
}
+// A local connection is closed by the network layer.
void Connection::closed() {
try {
if (catchUp) {
@@ -165,12 +166,19 @@
}
}
+// Self-delivery of close message, close the connection.
void Connection::deliverClose () {
assert(!catchUp);
connection.closed();
cluster.erase(self);
}
+// Member of a shadow connection left the cluster.
+void Connection::left() {
+ assert(isShadow());
+ connection.closed();
+}
+
// Decode data from local clients.
size_t Connection::decode(const char* buffer, size_t size) {
if (catchUp) { // Handle catch-up locally.
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.h?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/cluster/Connection.h Wed Nov 5 09:09:33 2008
@@ -89,6 +89,9 @@
void idleOut() { connection.idleOut(); }
void idleIn() { connection.idleIn(); }
+ /** Called if the connectors member has left the cluster */
+ void left();
+
// ConnectionCodec methods
size_t decode(const char* buffer, size_t size);
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/cluster_test.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/cluster_test.cpp?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/cluster_test.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/cluster_test.cpp Wed Nov 5 09:09:33 2008
@@ -117,12 +117,13 @@
void ClusterFixture::add() {
if (size() != size_t(localIndex)) { // fork a broker process.
std::ostringstream os; os << "fork" << size();
+ std::string prefix = os.str();
const char* argv[] = {
"qpidd " __FILE__ ,
"--load-module=../.libs/cluster.so",
"--cluster-name", name.c_str(),
"--auth=no", "--no-data-dir",
- "--log-prefix", os.str().c_str(),
+ "--log-prefix", prefix.c_str(),
};
size_t argc = sizeof(argv)/sizeof(argv[0]);
forkedBrokers.push_back(shared_ptr<ForkedBroker>(new ForkedBroker(argc, argv)));
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/run_test
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/run_test?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/run_test (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/run_test Wed Nov 5 09:09:33 2008
@@ -49,7 +49,7 @@
test -n "$VALGRIND" && VALGRIND="$VALGRIND $VALGRIND_OPTS"
# Hide output unless there's an error.
libtool --mode=execute $VALGRIND "$@" 2>&1 || ERROR=1
- test -n "$VALGRIND" && { vg_check $VG_LOG* || ERROR=1 ; }
+ test -n "$VALGRIND" && { vg_check $VG_LOG || ERROR=1 ; }
else
# This is a non-libtool shell script, just execute it.
exec "$@"
Modified: incubator/qpid/trunk/qpid/cpp/src/tests/vg_check
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/vg_check?rev=711623&r1=711622&r2=711623&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/vg_check (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/vg_check Wed Nov 5 09:09:33 2008
@@ -1,6 +1,7 @@
# Check for valgrind errors. Sourced by test scripts.
vg_failed() {
+ echo "Valgrind error log in $VG_LOG." 1>&2
cat $VG_LOG 1>&2
echo $1 1>&2
exit 1
@@ -12,10 +13,10 @@
test -f $VG_LOG || vg_failed Valgrind log file $VG_LOG missing.
# Ensure there is an ERROR SUMMARY line.
grep -E '^==[0-9]+== ERROR SUMMARY:' $VG_LOG > /dev/null || \
- vg_failed "No valgrind ERROR SUMMARY line in $$vg_failed."
+ vg_failed "No valgrind ERROR SUMMARY line in $VG_LOG."
# Ensure that the number of errors is 0.
grep -E '^==[0-9]+== ERROR SUMMARY: [^0]' $VG_LOG > /dev/null && \
- vg_failed "Valgrind reported errors in $vg_out; see above."
+ vg_failed "Valgrind reported errors in $VG_LOG; see above."
# Check for leaks.
grep -E '^==[0-9]+== +.* lost: [^0]' $VG_LOG && \
vg_failed "Found memory leaks (see log file, $VG_LOG); see above."