You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2019/12/02 09:25:59 UTC
[qpid-dispatch] branch master updated: DISPATCH-1500: improve
efficiency of parsing and processing for large MAU
This is an automated email from the ASF dual-hosted git repository.
gsim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/master by this push:
new 8a169c3 DISPATCH-1500: improve efficiency of parsing and processing for large MAU
8a169c3 is described below
commit 8a169c35a1b8035f173691fb669d94edba123b30
Author: Gordon Sim <gs...@redhat.com>
AuthorDate: Thu Nov 28 18:27:47 2019 +0000
DISPATCH-1500: improve efficiency of parsing and processing for large MAU
---
include/qpid/dispatch/parse.h | 3 +++
python/qpid_dispatch_internal/router/node.py | 21 +++++++++------------
src/parse.c | 10 ++++++++++
src/python_embedded.c | 7 ++++---
4 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/include/qpid/dispatch/parse.h b/include/qpid/dispatch/parse.h
index 8397742..7fed15d 100644
--- a/include/qpid/dispatch/parse.h
+++ b/include/qpid/dispatch/parse.h
@@ -243,6 +243,9 @@ qd_parsed_field_t *qd_parse_sub_key(qd_parsed_field_t *field, uint32_t idx);
*/
qd_parsed_field_t *qd_parse_sub_value(qd_parsed_field_t *field, uint32_t idx);
+qd_parsed_field_t *qd_field_first_child(qd_parsed_field_t *field);
+qd_parsed_field_t *qd_field_next_child(qd_parsed_field_t *field);
+
/**
* Convenience Function - Return true iff the field is a map.
*
diff --git a/python/qpid_dispatch_internal/router/node.py b/python/qpid_dispatch_internal/router/node.py
index 6ec5227..02cfee2 100644
--- a/python/qpid_dispatch_internal/router/node.py
+++ b/python/qpid_dispatch_internal/router/node.py
@@ -406,7 +406,7 @@ class RouterNode(object):
self.next_hop_router = None
self.cost = None
self.valid_origins = None
- self.mobile_addresses = []
+ self.mobile_addresses = set([])
self.mobile_address_sequence = 0
self.need_ls_request = True
self.need_mobile_request = False
@@ -542,7 +542,7 @@ class RouterNode(object):
def map_address(self, addr, treatment = -1):
- self.mobile_addresses.append(addr)
+ self.mobile_addresses.add(addr)
self.adapter.map_destination(addr, treatment, self.maskbit)
self.log(LOG_DEBUG, "Remote destination %s mapped to router %s" % (self._logify(addr), self.id))
@@ -555,19 +555,16 @@ class RouterNode(object):
def unmap_all_addresses(self):
self.mobile_address_sequence = 0
- while self.mobile_addresses:
- self.unmap_address(self.mobile_addresses[0])
-
+ for a in self.mobile_addresses:
+ self.adapter.unmap_destination(addr, self.maskbit)
+ self.log(LOG_DEBUG, "Remote destination %s unmapped from router %s" % (self._logify(addr), self.id))
- def overwrite_addresses(self, addrs):
+ def overwrite_addresses(self, addrs_list):
added = []
deleted = []
- for a in addrs:
- if a not in self.mobile_addresses:
- added.append(a)
- for a in self.mobile_addresses:
- if a not in addrs:
- deleted.append(a)
+ addrs = set(addrs_list)
+ added = addrs.difference(self.mobile_addresses)
+ deleted = self.mobile_addresses.difference(addrs)
for a in added:
self.map_address(a)
for a in deleted:
diff --git a/src/parse.c b/src/parse.c
index 78afc20..087b8d5 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -45,6 +45,16 @@ ALLOC_DEFINE(qd_parsed_field_t);
ALLOC_DECLARE(qd_parsed_turbo_t);
ALLOC_DEFINE(qd_parsed_turbo_t);
+qd_parsed_field_t* qd_field_first_child(qd_parsed_field_t *field)
+{
+ return DEQ_HEAD(field->children);
+}
+
+qd_parsed_field_t* qd_field_next_child(qd_parsed_field_t *field)
+{
+ return DEQ_NEXT(field);
+}
+
/**
* size = the number of bytes following tag:size (payload, including the count)
* count = the number of elements. Applies only to compound structures
diff --git a/src/python_embedded.c b/src/python_embedded.c
index c822925..154ee00 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -347,12 +347,13 @@ PyObject *qd_field_to_py(qd_parsed_field_t *field)
case QD_AMQP_LIST32: {
uint32_t count = qd_parse_sub_count(field);
result = PyList_New(count);
- for (uint32_t idx = 0; idx < count; idx++) {
- qd_parsed_field_t *sub = qd_parse_sub_value(field, idx);
- PyObject *pysub = qd_field_to_py(sub);
+ qd_parsed_field_t *item = qd_field_first_child(field);
+ for (uint32_t idx = 0; item && idx < count; idx++) {
+ PyObject *pysub = qd_field_to_py(item);
if (pysub == 0)
return 0;
PyList_SetItem(result, idx, pysub);
+ item = qd_field_next_child(item);
}
break;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org