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