You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2018/03/01 18:54:20 UTC

[1/3] qpid-proton git commit: PROTON-144: Don't encode nulls at the end of described lists - They represent default values and so don't need to actually be there

Repository: qpid-proton
Updated Branches:
  refs/heads/master d069b20de -> 1b9c09582


PROTON-144: Don't encode nulls at the end of described lists
- They represent default values and so don't need to actually be there


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/bd6b9719
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/bd6b9719
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/bd6b9719

Branch: refs/heads/master
Commit: bd6b9719d55162e43851f1bafa6c104b7d37df4c
Parents: d069b20
Author: Andrew Stitcher <as...@apache.org>
Authored: Tue Feb 27 16:24:47 2018 -0500
Committer: Andrew Stitcher <as...@apache.org>
Committed: Thu Mar 1 11:36:18 2018 -0500

----------------------------------------------------------------------
 proton-c/src/core/codec.c   |  6 +++++-
 proton-c/src/core/encoder.c | 38 +++++++++++++++++++++++++++++++++++---
 2 files changed, 40 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/bd6b9719/proton-c/src/core/codec.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/codec.c b/proton-c/src/core/codec.c
index b088f00..b4322d7 100644
--- a/proton-c/src/core/codec.c
+++ b/proton-c/src/core/codec.c
@@ -665,13 +665,16 @@ int pn_data_vfill(pn_data_t *data, const char *fmt, va_list ap)
     if (err) return err;
 
     pni_node_t *parent = pn_data_node(data, data->parent);
+    pni_node_t *current = pn_data_node(data, data->current);
     while (parent) {
       if (parent->atom.type == PN_DESCRIBED && parent->children == 2) {
+        current->described = true;
         pn_data_exit(data);
+        current = pn_data_node(data, data->current);
         parent = pn_data_node(data, data->parent);
       } else if (parent->atom.type == PN_NULL && parent->children == 1) {
         pn_data_exit(data);
-        pni_node_t *current = pn_data_node(data, data->current);
+        current = pn_data_node(data, data->current);
         current->down = 0;
         current->children = 0;
         parent = pn_data_node(data, data->parent);
@@ -1426,6 +1429,7 @@ static pni_node_t *pni_data_add(pn_data_t *data)
   node->down = 0;
   node->children = 0;
   node->data = false;
+  node->described = false;
   node->data_offset = 0;
   node->data_size = 0;
   data->current = pni_data_id(data, node);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/bd6b9719/proton-c/src/core/encoder.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/encoder.c b/proton-c/src/core/encoder.c
index f8145fc..26bc613 100644
--- a/proton-c/src/core/encoder.c
+++ b/proton-c/src/core/encoder.c
@@ -31,18 +31,20 @@
 
 struct pn_encoder_t {
   char *output;
-  size_t size;
   char *position;
   pn_error_t *error;
+  size_t size;
+  unsigned null_count;
 };
 
 static void pn_encoder_initialize(void *obj)
 {
   pn_encoder_t *encoder = (pn_encoder_t *) obj;
   encoder->output = NULL;
-  encoder->size = 0;
   encoder->position = NULL;
   encoder->error = pn_error();
+  encoder->size = 0;
+  encoder->null_count = 0;
 }
 
 static void pn_encoder_finalize(void *obj) {
@@ -237,6 +239,13 @@ static bool pn_is_first_in_array(pn_data_t *data, pni_node_t *parent, pni_node_t
   return parent->described && (!pn_data_node(data, node->prev)->prev);
 }
 
+/** True if node is in a described list - not the descriptor.
+ *  - In this case we can omit trailing nulls
+ */
+static bool pn_is_in_described_list(pn_data_t *data, pni_node_t *parent, pni_node_t *node) {
+  return parent && parent->atom.type == PN_LIST && parent->described;
+}
+
 typedef union {
   uint32_t i;
   uint32_t a[2];
@@ -261,7 +270,21 @@ static int pni_encoder_enter(void *ctx, pn_data_t *data, pni_node_t *node)
     }
   } else {
     code = pn_node2code(encoder, node);
-    pn_encoder_writef8(encoder, code);
+    // Omit trailing nulls for described lists
+    if (pn_is_in_described_list(data, parent, node)) {
+      if (code==PNE_NULL) {
+        encoder->null_count++;
+      } else {
+        // Output pending nulls, then the nodes code
+        for (unsigned i = 0; i<encoder->null_count; i++) {
+          pn_encoder_writef8(encoder, PNE_NULL);
+        }
+        encoder->null_count = 0;
+        pn_encoder_writef8(encoder, code);
+      }
+    } else {
+      pn_encoder_writef8(encoder, code);
+    }
   }
 
   switch (code) {
@@ -340,12 +363,21 @@ static int pni_encoder_exit(void *ctx, pn_data_t *data, pni_node_t *node)
       // backfill size
       size_t size = pos - node->start - 1;
       pn_encoder_writef8(encoder, size);
+      // Adjust count
+      if (encoder->null_count) {
+        pn_encoder_writef8(encoder, node->children-encoder->null_count);
+      }
     } else {
       // backfill size
       size_t size = pos - node->start - 4;
       pn_encoder_writef32(encoder, size);
+      // Adjust count
+      if (encoder->null_count) {
+        pn_encoder_writef32(encoder, node->children-encoder->null_count);
+      }
     }
     encoder->position = pos;
+    encoder->null_count = 0;
     return 0;
   default:
     return 0;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/3] qpid-proton git commit: PROTON-1754: Make AMQP frames have a lot more nulls where they can

Posted by as...@apache.org.
PROTON-1754: Make AMQP frames have a lot more nulls where they can


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/edb3aaa1
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/edb3aaa1
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/edb3aaa1

Branch: refs/heads/master
Commit: edb3aaa1587206b58842ccff843db71d4edf222d
Parents: bd6b971
Author: Andrew Stitcher <as...@apache.org>
Authored: Wed Feb 28 23:28:43 2018 -0500
Committer: Andrew Stitcher <as...@apache.org>
Committed: Thu Mar 1 11:36:35 2018 -0500

----------------------------------------------------------------------
 proton-c/src/core/message.c   | 10 +++++-----
 proton-c/src/core/transport.c | 31 +++++++++++++++++++++----------
 2 files changed, 26 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/edb3aaa1/proton-c/src/core/message.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/message.c b/proton-c/src/core/message.c
index c36b466..8f0bcf7 100644
--- a/proton-c/src/core/message.c
+++ b/proton-c/src/core/message.c
@@ -779,12 +779,12 @@ int pn_message_encode(pn_message_t *msg, char *bytes, size_t *size)
 int pn_message_data(pn_message_t *msg, pn_data_t *data)
 {
   pn_data_clear(data);
-  int err = pn_data_fill(data, "DL[o?B?IoI]", HEADER,
-                         msg->durable,
+  int err = pn_data_fill(data, "DL[?o?B?I?o?I]", HEADER,
+                         msg->durable, msg->durable,
                          msg->priority!=HEADER_PRIORITY_DEFAULT, msg->priority,
-                         msg->ttl, msg->ttl,
-                         msg->first_acquirer,
-                         msg->delivery_count);
+                         (bool)msg->ttl, msg->ttl,
+                         msg->first_acquirer, msg->first_acquirer,
+                         (bool)msg->delivery_count, msg->delivery_count);
   if (err)
     return pn_error_format(msg->error, err, "data error: %s",
                            pn_error_text(pn_data_error(data)));

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/edb3aaa1/proton-c/src/core/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/transport.c b/proton-c/src/core/transport.c
index c49ddd4..8fc9a75 100644
--- a/proton-c/src/core/transport.c
+++ b/proton-c/src/core/transport.c
@@ -982,11 +982,17 @@ static int pni_post_amqp_transfer_frame(pn_transport_t *transport, uint16_t ch,
 
  compute_performatives:
   pn_data_clear(transport->output_args);
-  int err = pn_data_fill(transport->output_args, "DL[IIzIoon?DLCooo]", TRANSFER,
-                         handle, id, tag->size, tag->start,
+  int err = pn_data_fill(transport->output_args, "DL[IIzI?o?on?DLC?o?o?o]", TRANSFER,
+                         handle,
+                         id,
+                         tag->size, tag->start,
                          message_format,
-                         settled, more_flag, (bool)code, code, state,
-                         resume, aborted, batchable);
+                         settled, settled,
+                         more_flag, more_flag,
+                         (bool)code, code, state,
+                         resume, resume,
+                         aborted, aborted,
+                         batchable, batchable);
   if (err) {
     pn_transport_logf(transport,
                       "error posting transfer frame: %s: %s", pn_code(err),
@@ -2081,9 +2087,12 @@ static int pni_flush_disp(pn_transport_t *transport, pn_session_t *ssn)
   uint64_t code = ssn->state.disp_code;
   bool settled = ssn->state.disp_settled;
   if (ssn->state.disp) {
-    int err = pn_post_frame(transport, AMQP_FRAME_TYPE, ssn->state.local_channel, "DL[oIIo?DL[]]", DISPOSITION,
-                            ssn->state.disp_type, ssn->state.disp_first, ssn->state.disp_last,
-                            settled, (bool)code, code);
+    int err = pn_post_frame(transport, AMQP_FRAME_TYPE, ssn->state.local_channel, "DL[oI?I?o?DL[]]", DISPOSITION,
+                            ssn->state.disp_type,
+                            ssn->state.disp_first,
+                            ssn->state.disp_last!=ssn->state.disp_first, ssn->state.disp_last,
+                            settled, settled,
+                            (bool)code, code);
     if (err) return err;
     ssn->state.disp_type = 0;
     ssn->state.disp_code = 0;
@@ -2114,8 +2123,9 @@ static int pni_post_disp(pn_transport_t *transport, pn_delivery_t *delivery)
     pn_data_clear(transport->disp_data);
     PN_RETURN_IF_ERROR(pni_disposition_encode(&delivery->local, transport->disp_data));
     return pn_post_frame(transport, AMQP_FRAME_TYPE, ssn->state.local_channel,
-      "DL[oIIo?DLC]", DISPOSITION,
-      role, state->id, state->id, delivery->local.settled,
+      "DL[oIn?o?DLC]", DISPOSITION,
+      role, state->id,
+      delivery->local.settled, delivery->local.settled,
       (bool)code, code, transport->disp_data);
   }
 
@@ -2352,7 +2362,8 @@ static int pni_process_link_teardown(pn_transport_t *transport, pn_endpoint_t *e
 
       int err =
           pn_post_frame(transport, AMQP_FRAME_TYPE, ssn_state->local_channel,
-                        "DL[Io?DL[sSC]]", DETACH, state->local_handle, !link->detached,
+                        "DL[I?o?DL[sSC]]", DETACH, state->local_handle,
+                        !link->detached, !link->detached,
                         (bool)name, ERROR, name, description, info);
       if (err) return err;
       pni_unmap_local_handle(link);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/3] qpid-proton git commit: PROTON-144: Encode zore length lists as LIST0 type - Fix some interop tests to expect this - Fix message overflow test to use an smaller buffer - The previous size no longer overfows

Posted by as...@apache.org.
PROTON-144: Encode zore length lists as LIST0 type
- Fix some interop tests to expect this
- Fix message overflow test to use an smaller buffer
  - The previous size no longer overfows


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/1b9c0958
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/1b9c0958
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/1b9c0958

Branch: refs/heads/master
Commit: 1b9c095828a00fb9a2206c8fe455bc88a1fb9490
Parents: edb3aaa
Author: Andrew Stitcher <as...@apache.org>
Authored: Thu Mar 1 10:56:32 2018 -0500
Committer: Andrew Stitcher <as...@apache.org>
Committed: Thu Mar 1 11:36:35 2018 -0500

----------------------------------------------------------------------
 proton-c/src/core/encoder.c          |   8 ++++++++
 proton-c/src/tests/message.c         |   4 ++--
 tests/interop/lists.amqp             | Bin 26 -> 18 bytes
 tests/python/proton_tests/interop.py |   2 ++
 4 files changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1b9c0958/proton-c/src/core/encoder.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/encoder.c b/proton-c/src/core/encoder.c
index 26bc613..505db47 100644
--- a/proton-c/src/core/encoder.c
+++ b/proton-c/src/core/encoder.c
@@ -349,6 +349,14 @@ static int pni_encoder_exit(void *ctx, pn_data_t *data, pni_node_t *node)
   pn_encoder_t *encoder = (pn_encoder_t *) ctx;
   char *pos;
 
+  // Special case 0 length list
+  if (node->atom.type==PN_LIST && node->children-encoder->null_count==0) {
+    encoder->position = node->start-1; // position of list opcode
+    pn_encoder_writef8(encoder, PNE_LIST0);
+    encoder->null_count = 0;
+    return 0;
+  }
+
   switch (node->atom.type) {
   case PN_ARRAY:
     if ((node->described && node->children == 1) || (!node->described && node->children == 0)) {

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1b9c0958/proton-c/src/tests/message.c
----------------------------------------------------------------------
diff --git a/proton-c/src/tests/message.c b/proton-c/src/tests/message.c
index 272e25f..5362b7d 100644
--- a/proton-c/src/tests/message.c
+++ b/proton-c/src/tests/message.c
@@ -31,8 +31,8 @@
 static void test_overflow_error(void)
 {
   pn_message_t *message = pn_message();
-  char buf[8];
-  size_t size = 8;
+  char buf[6];
+  size_t size = 6;
 
   int err = pn_message_encode(message, buf, &size);
   assert(err == PN_OVERFLOW);

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1b9c0958/tests/interop/lists.amqp
----------------------------------------------------------------------
diff --git a/tests/interop/lists.amqp b/tests/interop/lists.amqp
index db12fcf..f32bf4b 100644
Binary files a/tests/interop/lists.amqp and b/tests/interop/lists.amqp differ

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/1b9c0958/tests/python/proton_tests/interop.py
----------------------------------------------------------------------
diff --git a/tests/python/proton_tests/interop.py b/tests/python/proton_tests/interop.py
index b56298b..b330f22 100644
--- a/tests/python/proton_tests/interop.py
+++ b/tests/python/proton_tests/interop.py
@@ -63,6 +63,8 @@ class InteropTest(common.Test):
         # Re-encode and verify pre-computed and actual encoded size match.
         reencoded = self.data.encode()
         assert encoded_size == len(reencoded), "%d != %d" % (encoded_size, len(reencoded))
+        # verify round trip bytes
+        assert reencoded == encoded, "Value mismatch: %s != %s" % (reencoded, encoded)
 
     def decode_message_file(self, name):
         self.message.decode(self.get_data(name))


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org