deptofdefense / AndroidTacticalAssaultKit-CIV

Other
899 stars 320 forks source link

Black tiles are persistent on the map when tile download fails #141

Open matt-msi opened 2 years ago

matt-msi commented 2 years ago

We have seen a few times where loading an imported map causes strange artifacts. The only way to recover from this condition is by zooming in and out several times or restarting the application. Is it possible for the application to retry failed tile downloads automatically?

map shows blank spaces tiles not loading

map shows dark patches after loading imported map

10-05 13:22:59.455 W/atakmap.app.ci( 6373): Long monitor contention with owner TileProxy[a. Google Hybrid]-1 (6871) at void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long)(OSMDroidTileContainer.java:366) waiters=1 in void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long) for 556ms
10-05 13:22:59.456 I/dvm_lock_sample( 6373): [com.atakmap.app.civ,0,TileProxy[a. Google Hybrid]-1,556,OSMDroidTileContainer.java,-1,void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long),-,366,void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long),100]
10-05 13:22:59.545 I/MediaProvider( 3971): Deleted 1 items on external_primary due to com.atakmap.app.civ
10-05 13:22:59.649 I/MediaProvider( 3971): Deleted 1 items on external_primary due to com.atakmap.app.civ
10-05 13:22:59.681 W/atakmap.app.ci( 6373): Long monitor contention with owner TileProxy[a. Google Hybrid]-1 (6871) at void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long)(OSMDroidTileContainer.java:366) waiters=2 in void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long) for 733ms
10-05 13:22:59.681 I/dvm_lock_sample( 6373): [com.atakmap.app.civ,0,TileProxy[a. Google Hybrid]-0,733,OSMDroidTileContainer.java,-1,void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long),-,366,void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long),100]
10-05 13:22:59.788 I/MediaProvider( 3971): Deleted 1 items on external_primary due to com.atakmap.app.civ
10-05 13:22:59.904 I/MediaProvider( 3971): Deleted 1 items on external_primary due to com.atakmap.app.civ
10-05 13:22:59.937 W/atakmap.app.ci( 6373): Long monitor contention with owner TileProxy[a. Google Hybrid]-1 (6871) at void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long)(OSMDroidTileContainer.java:366) waiters=3 in byte[] com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.getTileData(int, int, int, java.lang.Throwable[]) for 973ms
10-05 13:22:59.937 I/dvm_lock_sample( 6373): [com.atakmap.app.civ,0,tilereader-async-io-thread@53655c4,973,OSMDroidTileContainer.java,-1,byte[] com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.getTileData(int, int, int, java.lang.Throwable[]),-,366,void com.atakmap.map.layer.raster.osm.OSMDroidTileContainer.setTile(int, int, int, byte[], long),100]
08-31 23:11:10.919 E/MobacTileClient2( 6617): IO Error during tile download, NRL FAA Terminal Area Chart (2, 2, 2)
08-31 23:11:10.919 E/MobacTileClient2( 6617): java.io.InterruptedIOException: thread interrupted
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Timeout.throwIfReached(Timeout.java:147)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at java.io.InputStream.read(InputStream.java:101)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.AbstractMobacMapSource.load(AbstractMobacMapSource.java:88)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(CustomMobacMapSource.java:140)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.MobacTileClient2.getTileData(MobacTileClient2.java:281)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$TileFetchTask.run(TileProxy.java:273)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$Downloader.run(TileProxy.java:227)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
08-31 23:11:10.919 E/MobacTileClient2( 6617): at java.lang.Thread.run(Thread.java:923)
08-31 23:11:10.919 I/lowmemorykiller( 446): Ignoring pressure since per-zone watermarks ok
08-31 23:11:10.921 E/MobacTileClient2( 6617): IO Error during tile download, NRL FAA Terminal Area Chart (3, 3, 4)
08-31 23:11:10.921 E/MobacTileClient2( 6617): java.io.InterruptedIOException: thread interrupted
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Timeout.throwIfReached(Timeout.java:147)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at java.io.InputStream.read(InputStream.java:101)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.AbstractMobacMapSource.load(AbstractMobacMapSource.java:88)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(CustomMobacMapSource.java:140)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.MobacTileClient2.getTileData(MobacTileClient2.java:281)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$TileFetchTask.run(TileProxy.java:273)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$Downloader.run(TileProxy.java:227)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
08-31 23:11:10.921 E/MobacTileClient2( 6617): at java.lang.Thread.run(Thread.java:923)
08-31 23:11:10.923 I/MediaProvider( 4142): Deleted 1 items on external_primary due to com.atakmap.app.civ
08-31 23:11:10.929 E/MobacTileClient2( 6617): IO Error during tile download, NRL FAA Terminal Area Chart (3, 3, 3)
08-31 23:11:10.929 E/MobacTileClient2( 6617): java.io.InterruptedIOException: thread interrupted
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Timeout.throwIfReached(Timeout.java:147)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at java.io.InputStream.read(InputStream.java:101)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.AbstractMobacMapSource.load(AbstractMobacMapSource.java:88)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(CustomMobacMapSource.java:140)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.mobac.MobacTileClient2.getTileData(MobacTileClient2.java:281)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$TileFetchTask.run(TileProxy.java:273)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at com.atakmap.map.layer.raster.tilematrix.TileProxy$Downloader.run(TileProxy.java:227)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
08-31 23:11:10.929 E/MobacTileClient2( 6617): at java.lang.Thread.run(Thread.java:923)
08-31 23:11:10.930 I/lowmemorykiller( 446): Ignoring pressure since per-zone watermarks ok
08-31 23:11:10.935 I/chatty ( 664): uid=1041(audioserver) writer identical 1 line
08-31 23:11:10.941 I/lowmemorykiller( 446): Ignoring pressure since per-zone watermarks ok
08-31 23:11:10.948 D/BufferPoolAccessor2.0( 1056): evictor expired: 2, evicted: 0
08-31 23:11:10.952 I/lowmemorykiller( 446): Ignoring pressure since per-zone watermarks ok
08-31 23:11:10.960 I/chatty ( 664): uid=1041(audioserver) writer identical 1 line
08-31 23:11:10.964 I/lowmemorykiller( 446): Ignoring pressure since per-zone watermarks ok
matt-msi commented 2 years ago

Here is another one where the symptom was more severe than a black spot on the map, in this case the app ANRed after a tile load took 10 seconds. Should there be a timeout?

11-12 03:11:47.107 D/WindowManager( 1273): notifyANR took 127ms 11-12 03:11:47.107 W/InputDispatcher( 1273): Canceling events for 1d962bd com.atakmap.app.civ/com.atakmap.app.ATAKActivity (server) because it is unresponsive 11-12 03:11:47.204 I/am_anr ( 1273): [0,6158,com.atakmap.app.civ,680017479,Input dispatching timed out (1d962bd com.atakmap.app.civ/com.atakmap.app.ATAKActivity (server) is not responding. Waited 5000ms for MotionEvent(deviceId=2, source=0x00001002, displayId=0, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=2.0, yPrecision=2.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (231.8, 38.0)]), policyFlags=0x62000000)] 11-12 03:11:49.734 W/atakmap.app.ci( 6158): Long monitor contention with owner TileProxy[a. Google Hybrid]-0 (11187) at com.atakmap.map.layer.raster.mobac.MobacMapTile com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(int, int, int, android.graphics.BitmapFactory$Options)(CustomMobacMapSource.java:134) waiters=2 in com.atakmap.map.layer.raster.mobac.MobacMapTile com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(int, int, int, android.graphics.BitmapFactory$Options) for 10.022s 11-12 03:11:49.734 I/dvm_lock_sample( 6158): [com.atakmap.app.civ,0,TileProxy[a. Google Hybrid]-2,10022,CustomMobacMapSource.java,108,com.atakmap.map.layer.raster.mobac.MobacMapTile com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(int, int, int, android.graphics.BitmapFactory$Options),-,134,com.atakmap.map.layer.raster.mobac.MobacMapTile com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(int, int, int, android.graphics.BitmapFactory$Options),100] 11-12 03:11:49.735 E/MobacTileClient2( 6158): IO Error during tile download, a. Google Hybrid (3, 3, 7) 11-12 03:11:49.735 E/MobacTileClient2( 6158): java.net.NoRouteToHostException 11-12 03:11:49.735 E/MobacTileClient2( 6158): at com.atakmap.map.layer.raster.mobac.CustomMobacMapSource.loadTile(CustomMobacMapSource.java:132) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at com.atakmap.map.layer.raster.mobac.MobacTileClient2.getTileData(MobacTileClient2.java:281) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at com.atakmap.map.layer.raster.tilematrix.TileProxy$TileFetchTask.run(TileProxy.java:273) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at com.atakmap.map.layer.raster.tilematrix.TileProxy$Downloader.run(TileProxy.java:227) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 11-12 03:11:49.735 E/MobacTileClient2( 6158): at java.lang.Thread.run(Thread.java:923) 11-12 03:11:49.749 I/InputDispatcher( 1273): Dropping event because there is no touched foreground window in display 0 or gesture monitor to receive it. 11-12 03:11:49.754 E/GLQuadTileNode4( 6158): asynchronous read error 11-12 03:11:49.763 I/tombstoned( 599): received crash request for pid 6158 11-12 03:11:49.763 I/tombstoned( 599): found intercept fd 512 for pid 6158 and type kDebuggerdJavaBacktrace 11-12 03:11:49.764 I/atakmap.app.ci( 6158): Wrote stack traces to tombstoned

kenktk commented 2 years ago

I have been having the same problem for rendering imagery from the filesystem. If a tile has not rendered yet, and if I enter a menu which halts the rendering of the map, the tiles that of which have not loaded in yet, do not load. Causing the non-rendered tiles to become black and remain that way indefinitely until a restart of ATAK. Switching between imagery does not solve the issue either. This is repeatable in my case across different devices and on different sets of imagery.

matt-msi commented 2 years ago

Just a heads up - we made a few changes to offload processing from the main thread to background threads. It does not completely address black map tile issues but thought we would share it anyway since we are seeing ANR issues in the latest 4.5 offerings on Google Play on Samsung. Stand by for PR.