summaryrefslogtreecommitdiff
path: root/cpp/src/qpid
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2009-07-14 14:49:33 +0000
committerAlan Conway <aconway@apache.org>2009-07-14 14:49:33 +0000
commit141f7814e093845265b24c47509fb0a9047c1881 (patch)
tree7f4fda51f6bf4eec62f332d4c44bf353c08913a5 /cpp/src/qpid
parent8978cf64e20e9cc89aa973ea7cce2ed3c85ec568 (diff)
downloadqpid-python-141f7814e093845265b24c47509fb0a9047c1881.tar.gz
Minor cluster optimizations.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@793917 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid')
-rw-r--r--cpp/src/qpid/cluster/Cluster.cpp2
-rw-r--r--cpp/src/qpid/cluster/ErrorCheck.cpp18
-rw-r--r--cpp/src/qpid/cluster/ErrorCheck.h7
-rw-r--r--cpp/src/qpid/sys/ActivityTimer.h106
4 files changed, 11 insertions, 122 deletions
diff --git a/cpp/src/qpid/cluster/Cluster.cpp b/cpp/src/qpid/cluster/Cluster.cpp
index fc8faf08ec..3d46797679 100644
--- a/cpp/src/qpid/cluster/Cluster.cpp
+++ b/cpp/src/qpid/cluster/Cluster.cpp
@@ -414,7 +414,7 @@ LATENCY_TRACK(sys::LatencyTracker<const AMQBody*> doOutputTracker("DoOutput");)
deliverEventQueue.start();
}
// Process each frame through the error checker.
- if (settings.checkErrors) {
+ if (settings.checkErrors && error.isUnresolved()) {
error.delivered(e);
while (error.canProcess()) // There is a frame ready to process.
processFrame(error.getNext(), l);
diff --git a/cpp/src/qpid/cluster/ErrorCheck.cpp b/cpp/src/qpid/cluster/ErrorCheck.cpp
index 2af820c8a0..d498b252f5 100644
--- a/cpp/src/qpid/cluster/ErrorCheck.cpp
+++ b/cpp/src/qpid/cluster/ErrorCheck.cpp
@@ -67,8 +67,8 @@ void ErrorCheck::error(
}
void ErrorCheck::delivered(const EventFrame& e) {
- FrameQueue::iterator i = frames.insert(frames.end(), e);
- review(i);
+ frames.push_back(e);
+ review(frames.end()-1);
}
// Review a frame in the queue with respect to the current error.
@@ -84,7 +84,7 @@ ErrorCheck::FrameQueue::iterator ErrorCheck::review(const FrameQueue::iterator&
if (errorCheck->getType() < type) { // my error is worse than his
QPID_LOG(critical, cluster << " error " << frameSeq
<< " did not occur on " << i->getMemberId());
- throw Exception("Aborted by local failure that did not occur on all replicas");
+ throw Exception("Aborted by failure that did not occur on all replicas");
}
else { // his error is worse/same as mine.
QPID_LOG(debug, cluster << " error " << frameSeq
@@ -96,12 +96,12 @@ ErrorCheck::FrameQueue::iterator ErrorCheck::review(const FrameQueue::iterator&
else {
const ClusterConfigChangeBody* configChange = 0;
if (i->frame.getBody())
- configChange = dynamic_cast<const ClusterConfigChangeBody*>(i->frame.getMethod());
+ configChange = dynamic_cast<const ClusterConfigChangeBody*>(
+ i->frame.getMethod());
if (configChange) {
MemberSet members(ClusterMap::decode(configChange->getCurrent()));
QPID_LOG(debug, cluster << " apply config change to unresolved: "
<< members);
-
MemberSet intersect;
set_intersection(members.begin(), members.end(),
unresolved.begin(), unresolved.end(),
@@ -130,12 +130,4 @@ EventFrame ErrorCheck::getNext() {
return e;
}
-bool ErrorCheck::canProcess() const {
- return type == ERROR_TYPE_NONE && !frames.empty();
-}
-
-bool ErrorCheck::isUnresolved() const {
- return type != ERROR_TYPE_NONE;
-}
-
}} // namespace qpid::cluster
diff --git a/cpp/src/qpid/cluster/ErrorCheck.h b/cpp/src/qpid/cluster/ErrorCheck.h
index 51312046b8..550cd36b75 100644
--- a/cpp/src/qpid/cluster/ErrorCheck.h
+++ b/cpp/src/qpid/cluster/ErrorCheck.h
@@ -62,11 +62,14 @@ class ErrorCheck
/**@pre canProcess **/
EventFrame getNext();
- bool canProcess() const;
+ bool canProcess() const { return type == NONE && !frames.empty(); }
+
+ bool isUnresolved() const { return type != NONE; }
+
- bool isUnresolved() const;
private:
+ static const ErrorType NONE = framing::cluster::ERROR_TYPE_NONE;
typedef std::deque<EventFrame> FrameQueue;
FrameQueue::iterator review(const FrameQueue::iterator&);
void checkResolved();
diff --git a/cpp/src/qpid/sys/ActivityTimer.h b/cpp/src/qpid/sys/ActivityTimer.h
deleted file mode 100644
index d49e16bc4f..0000000000
--- a/cpp/src/qpid/sys/ActivityTimer.h
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef QPID_SYS_ACTIVITYTIMER_H
-#define QPID_SYS_ACTIVITYTIMER_H
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * 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
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/Time.h"
-#include "qpid/sys/Thread.h"
-#include <boost/current_function.hpp>
-#include <stdio.h>
-
-namespace qpid {
-namespace sys {
-
-/**
- * Measures and reports time spent in a particular segment of code.
- * This is real time so it includes time blocked/sleeping as well as time on CPU.
- *
- * Intended to be used via the QPID_ACTIVITY_TIMER macro for profiling
- * during development & debugging
- */
-class ActivityTimer
-{
- public:
-
- struct Stat { // Must be a POD
- uint64_t total, count;
- void sample(uint64_t value) { total += value; ++count; }
- uint64_t mean() { return count ? total/count : 0; }
- void reset() { total = count = 0; }
- };
-
- struct Data { // Must be a POD
- uint64_t start, entered;
- Stat active;
-
- void reset() {
- start = entered = 0;
- active.reset();
- }
-
- void enter(uint64_t now) {
- entered=now;
- if (!start) start = Duration(now);
- }
-
- void exit(uint64_t now) {
- active.sample(now - entered);
- }
- };
-
- ActivityTimer(Data& d, const char* fn, const char* file, int line, uint64_t reportInterval) : data(d) {
- uint64_t now = Duration(qpid::sys::now());
- if (data.start) {
- interval = now-data.start;
- if (interval > reportInterval)
- report(fn, file, line);
- }
- data.enter(now);
- }
-
- ~ActivityTimer() {
- data.exit(Duration(now()));
- }
-
- private:
- Data& data;
- uint64_t interval;
-
- void report(const char* fn, const char* file, int line) {
- long rate = (data.active.count*TIME_SEC)/interval;
- double percent = (data.active.total*100.0)/interval;
- printf("%s:%d: TIMER %ld/sec %f%% [%lu] %s\n",
- file, line, rate, percent, Thread::current().id(), fn);
- data.reset();
- }
-};
-
-}} // namespace qpid::sys
-
-/** Measures time between the point of declaration and the end of the innermost enclosing scope.
- * Can only have one in a given scope.
- */
-#define ACTIVITY_TIMER(REPORT_INTERVAL_SECS) \
- static __thread ::qpid::sys::ActivityTimer::Data qpid__ActivityTimerData__ = { 0, 0, { 0,0 }}; \
- ::qpid::sys::ActivityTimer qpid__ActivityTimerInstance__(qpid__ActivityTimerData__, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__, 2*::qpid::sys::TIME_SEC)
-
-#endif /*!QPID_SYS_ACTIVITYTIMER_H*/