Closed WillSarah closed 6 years ago
I assume you are not using the GZIP option, right? As the v2.0.0 log points to https://github.com/matomo-org/piwik-sdk-android/blob/v2.0.0/piwik-sdk/src/main/java/org/piwik/sdk/dispatcher/Dispatcher.java#L247
The obvious cause would be that we forget to clean up our resources, but I can't see that in the code.
Both the output stream and the urlconnection get closed in the finally
statements.
On what Android versions is this reproducible?
Do you have a minimal example that I can use to reproduce this?
I've expanded the demo app to spam 2000 dispatches against a server returning code 301
but I can't get it to crash or show the logs you posted. Tired on API26 and API16.
The only noteworthy thing I see is
E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'end' not called
at dalvik.system.CloseGuard.open(CloseGuard.java:184)
at java.util.zip.Inflater.<init>(Inflater.java:82)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:96)
at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
at libcore.net.http.HttpEngine.initContentStream(HttpEngine.java:528)
at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:836)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
at org.piwik.sdk.dispatcher.DefaultPacketSender.send(DefaultPacketSender.java:57)
at org.piwik.sdk.dispatcher.DefaultDispatcher$1.run(DefaultDispatcher.java:179)
at java.lang.Thread.run(Thread.java:856)
I'm looking into this currently.
Correct, not using the GZIP option as of now. Might be worth pointing out that we also set the dispatch interval to 0 as per the customers request (via tracker.setDispatchInterval()).
We saw this on a Pixel (1st generation) with 8.1.0 and a Nexus 6P with 8.1.0 but did not actively test the scenario on other devices at the time.
Currently we don't have a minimal example available, if I find the time to create one I'll add it here.
The strictmode violation in https://github.com/matomo-org/piwik-sdk-android/issues/199#issuecomment-380084111 is caused by the error stream not being consumed.
If the server returns a non OK (200er) code, then the response can contain an error stream, which apparently should be consumed, or at least closed, even if not used.
I'll submit a few change to the dev
branch. Try it, if it still occurs then I'll need a way to reproduce this.
@WillSarah Merged #200 into dev
⬅️
If this fixes it, a 3.0.1
release would be warranted.
@d4rken - It seems that this indeed fixes the crashes that occured before. I tried reproducing the issue with Charles (as the backend is working now) with version 3.0.0 and did get some crashes related to the "too many files open" scenario (like "java.lang.RuntimeException: Could not read input channel file descriptors from parcel") that are not occuring with the version from dev.
Also I will try to use a dispatchTimeInterval > 0, as using 0 currently means that there is no sleep time between call retries (DefaultDispatcher:162), which leads to a ton of calls in a short time.
Thumbs up for a 3.0.1 version and thanks alot!
We are currently using the Piwik SDK in one client app. Last week the staging environment was undergoing maintenance and was not reachable for a few days / returning HTTP 500 error codes for every call made by the Piwik SDK.
It seems that the SDK then retries the calls without a retry limit until the app crashes with a SSLException "Unable to create application data", which seems to indicate a resource exhaustion due to too many threads/files etc. (At least according to this issue in the OkHttp repo). This behaviour was logged with the version 2.0.0 of the Piwik SDK integrated, but could also be reproduced with the 3.0.0 version of the Piwik SDK.
In the described case, the SDK always retries the calls without a retry limit, indicated by the endlessly repeating logs like this:
After a while multiple SocketExceptions appear in the logs:
After a few minutes, the app then crashes with the following exception, preceded by "AppData::create pipe (2) failed: Too many open files":