Baseflow / flutter_cache_manager

Generic cache manager for flutter
https://baseflow.com
MIT License
739 stars 426 forks source link

Race condition when downloading the same URL with ignoreMemCache=true #338

Open hpoul opened 2 years ago

hpoul commented 2 years ago

🐛 Bug Report

I have been seeing the following error message in flutter_cache_manager version 3.1.2:

I/flutter (26728): 2021-10-02 16:48:34.376318 SEVERE main - [guarded]
I/flutter (26728): ### _CastError: Null check operator used on a null value
I/flutter (26728): #0      WebHelper._downloadOrAddToQueue (package:flutter_cache_manager/src/web/web_helper.dart:65:33)
I/flutter (26728): #1      WebHelper._checkQueue (package:flutter_cache_manager/src/web/web_helper.dart:84:5)
I/flutter (26728): #2      WebHelper._downloadOrAddToQueue (package:flutter_cache_manager/src/web/web_helper.dart:77:7)
I/flutter (26728): <asynchronous suspension>

Reproduction steps

I think this happens when I download the same URL at the same time with ignoreMemCache=true

In WebHelper if the downloadFile method is called with the same URL/key the Subject of _memCache is overwritten:

https://github.com/Baseflow/flutter_cache_manager/blob/f591b5383de3188115a5140daba4d0a05a3a7a10/flutter_cache_manager/lib/src/web/web_helper.dart#L44-L46

But the first request still deletes it from _memCache without checking if it was ignored during the download call:

https://github.com/Baseflow/flutter_cache_manager/blob/f591b5383de3188115a5140daba4d0a05a3a7a10/flutter_cache_manager/lib/src/web/web_helper.dart#L73-L76

I'm actually not sure the ignoreMemCache flag does what I want it to do.

Basically I want to force a redownload of the URL without clearing the cache item first.

dodatw commented 12 months ago

Same here