nytimes / Store

Android Library for Async Data Loading and Caching
Apache License 2.0
3.53k stars 305 forks source link

Misleading docs and behavior of Store.clear() #377

Open bobymicroby opened 5 years ago

bobymicroby commented 5 years ago

Store.clear() claims that it will purge all entries from memory and disk cache

     /**
     * purges all entries from memory and disk cache
     * Persister will only be cleared if they implements Clearable
     */
    void clear();

But in fact it only clears from the disk the entries that are currently in the memory cache.

    @Override
    public void clear() {
        for (Key cachedKey : memCache.asMap().keySet()) {
            clear(cachedKey);
        }
    }

If you call this method after a cold start, nothing will be purged from disk, leaving many entries roaming around the disk without a pointer.

digitalbuddha commented 5 years ago

Yeah that's pretty crappy. I never found a good way to fix it. One solution is to delegate responsibility to a user's persister by calling clear. Alternatively a store can be stateful which is hard without storage. Open to suggestions 🤔

bobymicroby commented 5 years ago

First thing that comes to mind

image

And on clear() we check if the resolver is the proper instance and if so, we delete the directory :)

P.S I know that this is pretty lame, and there are a lot of things to consider. When I can find the time i will give it a proper thought and hopefully will come to a nice solution. Cheers !

digitalbuddha commented 5 years ago

That looks reasonable. I'll think about it as well.

mradzinski commented 5 years ago

Any news regarding this? My use case is quite simple: Need to clean entries from disk when a user logs out. It certainly would be nice to be able to purge all entries without having to resort on "hacks", like setting a different type per user to force re-fetching when types don't match...

digitalbuddha commented 5 years ago

We are working on new version. It will have a better handle for this. Not sure release date

bobymicroby commented 5 years ago

@mradzinski @digitalbuddha I've implemented POC that works based on my proposal above. Tried it in prod in my last app, living on the edge and stuff, and didn't find time to polish it to good PR. Shame.