workaround for #3382

On esp32, its possible that two threads (async_tcp, looptask) are sending out JSON via AsyncWebServer in parallel 
- serveJson() responds to json/si, and 
- updateInterfaces() is sending JSON state info using sendDataWs(). 

This workaround uses the INTERFACE_UPDATE_COOLDOWN timer  to delay the second webSocket send command so it does not (usually) interfere with the first.

It looks like the root cause that parts of AsyncWebServer are not thread-safe, and the payloads from a second ->send() call may corrupt the previous one if still being sent out.  The problem should be solved properly in AsyncWebServer, however until that happens, this workaround help to reduce the frequency of errors.
This commit is contained in:
Frank 2023-10-05 15:21:16 +02:00 committed by GitHub
parent 26e766ee19
commit e2886e83b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1080,6 +1080,8 @@ void serveJson(AsyncWebServerRequest* request)
JsonArray effects = lDoc.createNestedArray(F("effects")); JsonArray effects = lDoc.createNestedArray(F("effects"));
serializeModeNames(effects); // remove WLED-SR extensions from effect names serializeModeNames(effects); // remove WLED-SR extensions from effect names
lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names); lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
} else {
lastInterfaceUpdate = millis(); // softhack007 #3382 - delay re-sending of same JSON in updateInterfaces()
} }
//lDoc["m"] = lDoc.memoryUsage(); // JSON buffer usage, for remote debugging //lDoc["m"] = lDoc.memoryUsage(); // JSON buffer usage, for remote debugging
} }