Author: aconway
Date: Tue May 20 20:20:23 2014
New Revision: 1596392

URL: http://svn.apache.org/r1596392
Log:
DISPATCH-16: Trace log messages with address and first bytes of body.

Non-printable body bytes are quoted in hex as \xx.

Modified:
    qpid/dispatch/trunk/include/qpid/dispatch/iterator.h
    qpid/dispatch/trunk/src/iterator.c
    qpid/dispatch/trunk/src/message.c
    qpid/dispatch/trunk/tests/system_tests_broker.py

Modified: qpid/dispatch/trunk/include/qpid/dispatch/iterator.h
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/include/qpid/dispatch/iterator.h?rev=1596392&r1=1596391&r2=1596392&view=diff
==============================================================================
--- qpid/dispatch/trunk/include/qpid/dispatch/iterator.h (original)
+++ qpid/dispatch/trunk/include/qpid/dispatch/iterator.h Tue May 20 20:20:23 
2014
@@ -197,12 +197,31 @@ int qd_field_iterator_equal(qd_field_ite
 int qd_field_iterator_prefix(qd_field_iterator_t *iter, const char *prefix);
 
 /**
- * Return a copy of the iterator's view.
+ * Return the exact length of the iterator's view.
+ */
+int qd_field_iterator_length(qd_field_iterator_t *iter);
+
+/**
+ * Copy the iterator's view into buffer up to a maximum of n bytes.
+ * There is no trailing '\n' added.
+ * @return number of bytes copied.
+ */
+int qd_field_iterator_ncopy(qd_field_iterator_t *iter, unsigned char* buffer, 
int n);
+
+/**
+ * Return a new copy of the iterator's view, with a trailing '\0' added.
  * @return Copy of the view, free with free()
  */
 unsigned char *qd_field_iterator_copy(qd_field_iterator_t *iter);
 
 /**
+ * Copy the iterator's view into buffer as a null terminated string,
+ * up to a maximum of n bytes. Useful for log messages.
+ * @return buffer.
+ */
+char* qd_field_iterator_logstr(qd_field_iterator_t *iter, char* buffer, int n);
+
+/**
  * Return the contents of this iter into an iovec structure.  This is used in a
  * scatter/gather IO mechanism.  If the iterator spans multiple physical 
buffers,
  * the iovec structure will contain one pointer per buffer.

Modified: qpid/dispatch/trunk/src/iterator.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/iterator.c?rev=1596392&r1=1596391&r2=1596392&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/iterator.c (original)
+++ qpid/dispatch/trunk/src/iterator.c Tue May 20 20:20:23 2014
@@ -461,25 +461,36 @@ int qd_field_iterator_prefix(qd_field_it
     return 1;
 }
 
-
-unsigned char *qd_field_iterator_copy(qd_field_iterator_t *iter)
-{
-    int            length = 0;
-    int            idx    = 0;
-    unsigned char *copy;
-
+int qd_field_iterator_length(qd_field_iterator_t *iter) {
+    int length = 0;
     qd_field_iterator_reset(iter);
     while (!qd_field_iterator_end(iter)) {
         qd_field_iterator_octet(iter);
         length++;
     }
+    return length;
+}
 
+int qd_field_iterator_ncopy(qd_field_iterator_t *iter, unsigned char* buffer, 
int n) {
     qd_field_iterator_reset(iter);
-    copy = (unsigned char*) malloc(length + 1);
-    while (!qd_field_iterator_end(iter))
-        copy[idx++] = qd_field_iterator_octet(iter);
-    copy[idx] = '\0';
+    int i = 0;
+    while (!qd_field_iterator_end(iter) && i < n)
+       buffer[i++] = qd_field_iterator_octet(iter);
+    return i;
+}
+
+char* qd_field_iterator_logstr(qd_field_iterator_t *iter, char* buffer, int n) 
{
+    int i = qd_field_iterator_ncopy(iter, (unsigned char*)buffer, n-1);
+    buffer[i] = '\0';
+    return buffer;
+}
 
+unsigned char *qd_field_iterator_copy(qd_field_iterator_t *iter)
+{
+    int length = qd_field_iterator_length(iter);
+    unsigned char *copy = malloc(length+1);
+    int i = qd_field_iterator_ncopy(iter, copy, length+1);
+    copy[i] = '\0';
     return copy;
 }
 

Modified: qpid/dispatch/trunk/src/message.c
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/message.c?rev=1596392&r1=1596391&r2=1596392&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/message.c (original)
+++ qpid/dispatch/trunk/src/message.c Tue May 20 20:20:23 2014
@@ -25,6 +25,7 @@
 #include "message_private.h"
 #include "compose_private.h"
 #include <string.h>
+#include <ctype.h>
 #include <stdio.h>
 
 static const unsigned char * const MSG_HDR_LONG                 = (unsigned 
char*) "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x70";
@@ -63,13 +64,43 @@ void qd_message_initialize() {
 
 int qd_message_repr_len() { return qd_log_max_len(); }
 
+static int quote(char* bytes, int n, char* buffer, int len) {
+    int i = 0;
+    for (char* p = bytes; p < bytes+n && i < len; ++p) {
+       if (isprint(*p) || isspace(*p)) {
+           buffer[i++] = *p;
+       }
+       else {
+           int d = snprintf(buffer+i, len-i, "\\%02hhx", *p);
+           i += d;
+       }
+    }
+    return i;
+}
+
 /* TODO aconway 2014-05-13: more detailed message representation. */
 char* qd_message_repr(qd_message_t *msg, char* buffer, size_t len) {
-    qd_field_iterator_t* iter = qd_message_field_iterator((qd_message_t*)msg, 
QD_FIELD_TO);
-    char* to = iter? (char*)qd_field_iterator_copy(iter) : 0;
-    qd_field_iterator_free(iter);
-    snprintf(buffer, len, "Message(%p){to=%s}", msg, to? to:"");
-    free(to);
+    qd_message_check(msg, QD_DEPTH_BODY);
+    int i = 0;
+    --len;                     /* Save space for final '\0' */
+    i += snprintf(buffer+i, len-i, "Message(%p){to=", msg);
+    qd_field_iterator_t* iter =        0;
+    iter = qd_message_field_iterator(msg, QD_FIELD_TO);
+    if (iter) {
+       i += qd_field_iterator_ncopy(iter, (unsigned char*)buffer+i, len-i);
+       qd_field_iterator_free(iter);
+    }
+    iter = qd_message_field_iterator(msg, QD_FIELD_BODY);
+    if (iter) {
+       i += snprintf(buffer+i, len-i, " body='");
+       char body[8];           /* Initial bytes of body */
+       int bytes = qd_field_iterator_ncopy(iter, (unsigned char*)body, 
sizeof(body));
+       i += quote(body, bytes, buffer+i, len-i);
+       i += snprintf(buffer+i, len-i, "'");
+    }
+    i += snprintf(buffer+i, len-i, "}");
+    assert(i <= len);
+    buffer[i] = '\0';
     return buffer;
 }
 
@@ -847,10 +878,6 @@ int qd_message_check(qd_message_t *in_ms
     sys_mutex_lock(content->lock);
     result = qd_message_check_LH(content, depth);
     sys_mutex_unlock(content->lock);
-
-    char repr[qd_message_repr_len()];
-    qd_log(log_source, QD_LOG_TRACE, "%s check",
-          qd_message_repr(in_msg, repr, sizeof(repr)));
     return result;
 }
 
@@ -987,4 +1014,3 @@ void qd_message_compose_3(qd_message_t *
         buf = DEQ_HEAD(*field2_buffers);
     }
 }
-

Modified: qpid/dispatch/trunk/tests/system_tests_broker.py
URL: 
http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/system_tests_broker.py?rev=1596392&r1=1596391&r2=1596392&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/system_tests_broker.py (original)
+++ qpid/dispatch/trunk/tests/system_tests_broker.py Tue May 20 20:20:23 2014
@@ -86,9 +86,9 @@ class BrokerSystemTest(system_test.TestC
         address = router.addresses[0]+"/"+testq
         msgr.subscribe(address, flush=True)
         n = 20                  # Messages per broker
-        r = range(n*len(self.qpidd))
-        for i in r:
-            msgr.put(message(address=address, body=i))
+        r = ["x-%02d"%i for i in range(n*len(self.qpidd))]
+        for b in r:
+            msgr.put(message(address=address, body=b))
         messages = sorted(msgr.fetch().body for i in r)
         msgr.flush()
         self.assertEqual(messages, r)



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to