You need to sign in before continuing.
-
This saves some allocations. This also meant having to set the C++ standard to 2014. The getCopy() methods of sessions and mqttpackets can't be changed, because of access errors (private).
-
This is a preparation for MQTT5, because when there are receivers and publishers with different protocols, you can't always just write out the same packet. You can sometimes though, so that's what the copy factory determines.
-
This entails making copies of the original packet when necessary, because QoS 0 doesn't have a packet id. I tried to keep it to an absolute minimum and do some precarious optmizations for it. There are tests though.
-
Functionally, this doesn't change anything.
-
When clients connect, they get the retained messages. There is no need to do that while holding the subscriptions lock.
-
One fix is client destruction happening on the correct thread (when kicking another one off with existing client ID). This caused deadlocks on the subscriptions lock during a race condition when doKeepAliveCheck() also ran. A related deadlock was that the queued functions were executed while holding the lock taskQueueMutex. Together with the subscriptions lock, that was executed in the $SYS topic function, this also caused deadlocks.
-
The initial concept of iterating over a vector being fast didn't help, and made having many subscribers to one topic very slow.
-
Mandatory normative statement MQTT-3.1.2-6.
-
When there are many sessions, the copying action can actually take some time, and memory. A vector is faster and uses (a little) less memory. This is a theoretical fix, without benchmarks to support it.
-
Empty leaves weren't removed, causing increase in memory use.
-
One was confirmed: writing an mqtt packet into a client that disconnected after checking the weak pointer for validity. The rest made sense to change as well.
-
Files are simple serialized bytes prefaced by lengths. File is hashed to verify integrity. This was also a good way preventing unexpected errors when trying to crash the parser by having it load a different file. This change includes some refactoring that was necessary: - It 'fixes' looking at the wrong thread's authentiction. This is still wrong though. It will be fixed by a thread local pointer in the next commit. - Deadlocks with yourself are handled in rwlockguard. - QoSPacketQueue is now a class. - Probably other tweaks.
-
This performs a whole lot better.
-
Also include a few stats.
-
Unsubscribing paths that didn't exist caused creation of null nodes, which subsequent use of the tree crashed on.
-
My IDE didn't understand them for finding symbols, apparently.
-
Fix websocket crash case Fix infinite loop on lying about websocket frame sizes This fixes infinite loops when you send a frame type that is not handled.
-
Also changed the disconnect reason a little: it now shows them all, so I don't have to worry about which one is more important.
-
This includes a timer mechanism.
-
Connected to this is preventing duplicate subscriptions. It's a bit unclear what to do when you get a subscription for the same topic with a different QoS? Change the Qos? Ignore?
-
Also includes fixes to packet parsing that I couldn't make a separate commit for. When it comes to QoS 1, these things are still left, off the top of my head: - vector for qos queue? It helps with ordering and is CPU cache friendly. - Store subscription QoS. - Do retained messages have QoS? - Give session client's name, to access it later.