nytimes / Store

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

SourceFileReader with wrong path to BarCode #332

Open phajduk opened 6 years ago

phajduk commented 6 years ago

Hi guys. I think I found bug but please validate my findings described below: SourceFileReader uses private method pathForBarcode in order to get path for BarCode. However, SourceFileWriter delegates it to pathResolver.

The bug which above causes is: FileSystemImpl:getRecordState returns RecordState.MISSING all the time as path which was saved by SourceFileWriter is different than path used by SourceFileReader. We talk about the case when BarCode is a key.

Does above make sense?

KevCron commented 6 years ago

Hey @phajduk I understand what you're saying and I'm looking into it now.

Do you have any code samples that will help by any chance? Maybe an example of the bug?

phajduk commented 6 years ago

Hey @KevCron OK so I have following configuration of my Store:

    private val constructionForUpload = FluentStoreBuilder.parsedWithKey<BarCode, BufferedSource, ConstructionsResponse>(
            Fetcher {
                api.getConstructions().map { it.source() }
            }) {
        parsers = listOf(GsonParserFactory.createSourceParser(gson, ConstructionsResponse::class.java))
        persister = RecordPersisterFactory.create(FileSystemFactory.create(context.cacheDir), 10L, TimeUnit.SECONDS)
        memoryPolicy = MemoryPolicy.builder().setExpireAfterWrite(5).setExpireAfterTimeUnit(TimeUnit.SECONDS).build()
        stalePolicy = StalePolicy.REFRESH_ON_STALE
    }

If I understood Store lib properly following statements are true:

So after 10 secs data is treat as STALE and fetch call should be performed.

As an addition to bug description I can see that StoreUtil.persisterIsStale always returns true because RecordState recordState = provider.getRecordState(key); is always RecordState.MISSING.