While running on an x86 emulator with Android API level 24 I saw this while running CronetUrlRequestTest.testUploadWithBadLengthBufferAligned
07-18 06:54:57.154 6884 6893 E StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-18 06:54:57.154 6884 6893 E StrictMode: java.lang.Throwable: Explicit termination method 'close' not called
07-18 06:54:57.154 6884 6893 E StrictMode: at dalvik.system.CloseGuard.open(CloseGuard.java:180)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.net.AbstractPlainSocketImpl.create(AbstractPlainSocketImpl.java:103)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.net.Socket.createImpl(Socket.java:451)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.net.Socket.getImpl(Socket.java:517)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.net.Socket.setSoTimeout(Socket.java:1108)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.Connection.connectSocket(Connection.java:195)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.Connection.connect(Connection.java:172)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
07-18 06:54:57.154 6884 6893 E StrictMode: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
07-18 06:54:57.154 6884 6893 E StrictMode: at org.chromium.net.impl.JavaUrlRequest$OutputStreamDataSink$3.run(JavaUrlRequest.java:415)
07-18 06:54:57.154 6884 6893 E StrictMode: at org.chromium.net.impl.JavaUrlRequest$8.run(JavaUrlRequest.java:702)
07-18 06:54:57.154 6884 6893 E StrictMode: at org.chromium.net.impl.JavaUrlRequest$SerializingExecutor$1.run(JavaUrlRequest.java:141)
07-18 06:54:57.154 6884 6893 E StrictMode: at org.chromium.net.impl.JavaUrlRequest$1$1.run(JavaUrlRequest.java:204)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
07-18 06:54:57.154 6884 6893 E StrictMode: at org.chromium.net.impl.JavaCronetEngine$1$1.run(JavaCronetEngine.java:58)
07-18 06:54:57.154 6884 6893 E StrictMode: at java.lang.Thread.run(Thread.java:761)
07-18 06:54:57.154 6884 6893 W System.err: StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
I think HttpURLConnection.disconnect() is being properly called as per Issue 726193 , but after some digging I saw this comment:
"It's the caller's responsibility to close the request body and response body streams; otherwise resources may be leaked."
http://androidxref.com/7.0.0_r1/xref/external/okhttp/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java#563
Looks like JavaUrlRequest.OutputStreamDataSink.mOutputChannel (which wraps the uploads stream) is not closed when enterUploadErrorState() is called.
This code is quite tricky, e.g. finish() is called from different threads, and enterUploadErrorState() is called from outside JavaUrlRequest.OutputStreamDataSink so doesn't have access to mOutputChannel.
Comment 1 by bugdroid1@chromium.org
, Jul 19 2017