From 1eb3d438f7cb658a1aa52ea5d7ff8b721fd4f0cc Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Tue, 10 Aug 2021 20:48:21 +0100 Subject: [PATCH] Fix CONNECT performance with many user-properties. --- lib/property_mosq.c | 14 ++++----- test/broker/01-connect-575314.py | 49 ++++++++++++++++++++++++++++++++ test/broker/Makefile | 1 + test/broker/test.py | 1 + 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100755 test/broker/01-connect-575314.py diff --git a/lib/property_mosq.c b/lib/property_mosq.c index 859e28b..6eccdbd 100644 --- a/lib/property_mosq.c +++ b/lib/property_mosq.c @@ -878,14 +878,14 @@ int mosquitto_property_check_all(int command, const mosquitto_property *properti if(rc) return rc; /* Check for duplicates */ - tail = p->next; - while(tail){ - if(p->identifier == tail->identifier - && p->identifier != MQTT_PROP_USER_PROPERTY){ - - return MOSQ_ERR_DUPLICATE_PROPERTY; + if(p->identifier != MQTT_PROP_USER_PROPERTY){ + tail = p->next; + while(tail){ + if(p->identifier == tail->identifier){ + return MOSQ_ERR_DUPLICATE_PROPERTY; + } + tail = tail->next; } - tail = tail->next; } p = p->next; diff --git a/test/broker/01-connect-575314.py b/test/broker/01-connect-575314.py new file mode 100755 index 0000000..4a8f314 --- /dev/null +++ b/test/broker/01-connect-575314.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# Check for performance of processing user-property on CONNECT + +from mosq_test_helper import * + +def do_test(): + rc = 1 + props = mqtt5_props.gen_string_pair_prop(mqtt5_props.PROP_USER_PROPERTY, "key", "value") + for i in range(0, 20000): + props += mqtt5_props.gen_string_pair_prop(mqtt5_props.PROP_USER_PROPERTY, "key", "value") + connect_packet_slow = mosq_test.gen_connect("connect-user-property", proto_ver=5, properties=props) + connect_packet_fast = mosq_test.gen_connect("a"*65000, proto_ver=5) + connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + + port = mosq_test.get_port() + broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) + + try: + t_start = time.monotonic() + sock = mosq_test.do_client_connect(connect_packet_slow, connack_packet, port=port) + t_stop = time.monotonic() + sock.close() + + t_diff_slow = t_stop - t_start + + t_start = time.monotonic() + sock = mosq_test.do_client_connect(connect_packet_fast, connack_packet, port=port) + t_stop = time.monotonic() + sock.close() + + t_diff_fast = t_stop - t_start + # 20 is chosen as a factor that works in plain mode and running under + # valgrind. The slow performance manifests as a factor of >100. Fast is <10. + if t_diff_slow / t_diff_fast < 20: + rc = 0 + except mosq_test.TestError: + pass + finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde.decode('utf-8')) + exit(rc) + + +do_test() +exit(0) diff --git a/test/broker/Makefile b/test/broker/Makefile index fa889ce..f560b6e 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -20,6 +20,7 @@ ptest : test-compile test : test-compile 01 02 03 04 05 06 07 08 09 10 11 12 01 : + ./01-connect-575314.py ./01-connect-anon-denied.py ./01-connect-bad-packet.py ./01-connect-disconnect-v5.py diff --git a/test/broker/test.py b/test/broker/test.py index 9a22262..6703f4b 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -5,6 +5,7 @@ import ptest tests = [ #(ports required, 'path'), + (1, './01-connect-575314.py'), (1, './01-connect-anon-denied.py'), (1, './01-connect-bad-packet.py'), (1, './01-connect-disconnect-v5.py'), -- 2.30.0