122 lines
3.8 KiB
Diff
122 lines
3.8 KiB
Diff
From 1eb3d438f7cb658a1aa52ea5d7ff8b721fd4f0cc Mon Sep 17 00:00:00 2001
|
|
From: "Roger A. Light" <roger@atchoo.org>
|
|
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
|
|
|