Skip to content

Suppress FileNotFoundError when deleting keys in the obstore adapter #3140

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 25, 2025

Conversation

lukasbindreiter
Copy link
Contributor

@lukasbindreiter lukasbindreiter commented Jun 18, 2025

Suppress FileNotFoundError in delete operation of the obstore adapter.

Since some underlying stores allow this, while others raise an error, supressing the error results in consistent behaviour across all stores. This also mimics how the same thing is implemented in the fsspec adapter.

Fixes #3136

TODO:

  • Add unit tests and/or doctests in docstrings
  • Changes documented as a new file in changes/
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@github-actions github-actions bot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels Jun 18, 2025
@dstansby
Copy link
Contributor

Thanks for the PR/fix! This is slightly surprising behaviour to me - I would expect trying to delete a non-existent file to raise an error. But I guess if this is existing behaviour/design across other stores, this is good.

To be sure that we're getting consistent behaviour across stores, could you move the test you added to the StoreTests class, so it's run across all stores that are tested?

@d-v-b
Copy link
Contributor

d-v-b commented Jun 18, 2025

I think a better long-term solution would be for the stores to all raise the same exception when attempting to delete a missing key, and for the caller of the store method to handle that exception specifically in the context of attempting to remove an empty chunk. But this fix also works!

@kylebarron
Copy link
Contributor

I think a better long-term solution would be for the stores to all raise the same exception when attempting to delete a missing key

From the obstore side I don't have total control over that. The upstream s3 implementation does not raise an error: https://docs.rs/object_store/latest/object_store/trait.ObjectStore.html#method.delete_stream

@lukasbindreiter
Copy link
Contributor Author

Thanks for the PR/fix! This is slightly surprising behaviour to me - I would expect trying to delete a non-existent file to raise an error. But I guess if this is existing behaviour/design across other stores, this is good.

Yes this seems to be the behaviour across stores:

so I believe it makes sense to do the same for obstore as well.

And when thinking about the main purpose of the function (to clear chunks) this behaviour makes sense - it seems the function isn't really about deleting an object, instead it is to make sure that an object doesn't exist in the store.

To be sure that we're getting consistent behaviour across stores, could you move the test you added to the StoreTests class, so it's run across all stores that are tested?

Good idea, I've moved the test now to StoreTests 👍

Across stores is a bit ambiguous in this context though - there is the zarr adapter stores (fsspec, local, memory, obstore) - the test now runs across all of those.

However the issue / bugfix was only for the obstore adapter, since there is inconsistent behaviour across obstore stores (S3, GCS, Azure, Local, InMemory) - but as @kylebarron has mentioned that seems to be out of control of obstore itself.

Copy link
Member

@maxrjones maxrjones left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My approval doesn't mean anything really, but I'm submitting it because I ran into this issue and tested your branch locally to confirm that it solved the problem. I also made two code suggestions to apply Kyle's recommendation for convenience.

@kylebarron
Copy link
Contributor

In developmentseed/obstore#487 I propose deprecating the obstore.exceptions.NotFoundError class

@lukasbindreiter
Copy link
Contributor Author

Thanks @maxrjones and @kylebarron for the review - I've now updated the comment and removed the obstore.exceptions.NotFoundError again

@d-v-b d-v-b enabled auto-merge (squash) June 24, 2025 19:45
@lukasbindreiter
Copy link
Contributor Author

@d-v-b Thanks for enabling the merge.

I checked the failing test for the windows-latest py3.11 run, which is this one.

def test_sync_timeout() -> None:
    duration = 0.02

    async def foo() -> None:
        await asyncio.sleep(duration)

    with pytest.raises(asyncio.TimeoutError):
        sync(foo(), timeout=duration / 10)

It seems completely unrelated to the changes in the PR, probably a flaky failure? Could you potentially retry it?

@d-v-b d-v-b merged commit 27615fd into zarr-developers:main Jun 25, 2025
30 checks passed
@d-v-b
Copy link
Contributor

d-v-b commented Jun 25, 2025

@lukasbindreiter the flaky test theory seems valid! thanks for this contribution.

(I accidentally posted this in #3136 (comment))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

FileNotFoundError when writing an array that contains empty chunks
5 participants