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]