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 2007/12/14 20:33:49 UTC

svn commit: r604272 - /incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp

Author: aconway
Date: Fri Dec 14 11:33:48 2007
New Revision: 604272

URL: http://svn.apache.org/viewvc?rev=604272&view=rev
Log:
Fix sequence numbers and sequence checks in perftest.

Modified:
    incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp?rev=604272&r1=604271&r2=604272&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/tests/perftest.cpp Fri Dec 14 11:33:48 2007
@@ -383,8 +383,7 @@
             for (size_t i=0; i<opts.count; i++) {
                 // Stamp the iteration into the message data, avoid
                 // any heap allocation.
-                char* data = const_cast<char*>(msg.getData().data());
-                *reinterpret_cast<uint32_t*>(data) = i;
+                const_cast<std::string&>(msg.getData()).replace(0, sizeof(uint32_t), reinterpret_cast<const char*>(&i), sizeof(uint32_t));
                 completion = session.messageTransfer(
                     arg::destination=destination,
                     arg::content=msg,
@@ -425,7 +424,17 @@
                           arg::exchange=ex,
                           arg::routingKey=key);
     }
-    
+
+    void verify(bool cond, const char* test, uint32_t expect, uint32_t actual) {
+        if (!cond) {
+            Message error(
+                QPID_MSG("Sequence error: expected  n" << test << expect << " but got " << actual),
+                "sub_done");
+            session.messageTransfer(arg::content=error);
+            throw Exception(error.getData());
+        }
+    }
+
     void run() {                // Subscribe
         try {
             SubscriptionManager subs(session);
@@ -439,29 +448,21 @@
 
             Message msg;
             AbsTime start=now();
-            size_t lastMsg=0;
+            size_t expect=0;
             for (size_t i = 0; i < opts.subQuota; ++i) {
                 msg=lq.pop();
                 // TODO aconway 2007-11-23: check message order for. 
-                // multiple publishers. Need an array of counters,
+                // multiple publishers. Need an acorray of counters,
                 // one per publisher and a publisher ID in the
                 // message. Careful not to introduce a lot of overhead
                 // here, e.g. no std::map, std::string etc.
                 //
                 // For now verify order only for a single publisher.
+                size_t n = *reinterpret_cast<const uint32_t*>(msg.getData().data());
                 if (opts.pubs == 1) {
-                    char* data = const_cast<char*>(msg.getData().data());
-                    size_t n = *reinterpret_cast<uint32_t*>(data);
-                    if (n < lastMsg) {
-                        // Report to control.
-                        Message error(
-                            QPID_MSG("Out-of-sequence messages, expected n>="
-                                     << lastMsg << " got " << n),
-                            "sub_done");
-                        session.messageTransfer(arg::content=error);
-                        return;
-                    }
-                    lastMsg=n;
+                    if (opts.subs == 1 || opts.mode == FANOUT) verify(n==expect, "==", expect, n);
+                    else verify(n>=expect, ">=", expect, n);
+                    expect = n+1;
                 }
             }
             if (opts.ack !=0)