Azure / Azurite

A lightweight server clone of Azure Storage that simulates most of the commands supported by it with minimal dependencies
MIT License
1.8k stars 320 forks source link

Azurite holds a lock on the two directories `__blobstorage__` and `__queuestorage__` #2356

Open danielniccoli opened 7 months ago

danielniccoli commented 7 months ago

Which service(blob, file, queue, table) does this issue concern?

blob, queue

Which version of the Azurite was used?

v3.29.0

Where do you get Azurite? (npm, DockerHub, NuGet, Visual Studio Code Extension)

Visual Studio Code Extension

What problem was encountered?

After starting and stopping Azurite in VSCode using the >Azurite: Start and >Azurite: Close commands, The extension still holds a lock on the two directories __blobstorage__ and __queuestorage__. Consequently, I am unable to delete these directories, for example to start anew, until I close VS Code. This makes that process unnecessary frustrating.

Steps to reproduce the issue?

  1. >Azurite: Start
  2. >Azurite: Close
  3. Try deleting __blobstorage__ and __queuestorage__ in the project root. Will fail.
  4. Close VS Code.
  5. Try deleting __blobstorage__ and __queuestorage__ in the project root. Will succeed.

Have you found a mitigation/solution?

No.

blueww commented 7 months ago

@danielniccoli

Thanks for raising this issue!

In VS Code, Azurite is running in VS code process, so close Azurite will close the http service but can't stop whole process.

When Azurite read/save content in local disk, it will create Stream like https://github.com/Azure/Azurite/blob/d544d16f910e490fdd9db5565459df701895308f/src/common/persistence/FSExtentStore.ts#L343. When create Stream Azurite will not set autoClose , and the autoClose default value is true (See link ). So Azurite depends on NodeJS to close the stream after finish using it. But currently it looks the stream is not closed and cause the related folder can't be deleted.

One workaround is: If you would like to have the content always be cleaned up after close Azurite, you can try to save the content in memory by enable following setting.

image
danielniccoli commented 7 months ago

Thanks for mentioning the in-memory persisting option. This will work in most situations where I do not test crashes and replays.

Would it not be possible to manually close the stream when the close command is issued?

blueww commented 6 months ago

There are still not easy way to close the stream manually without changing the code, we need check all place to read the stream, and add code to close it after the last time using it. However, this might have regression risk, and we have other feature parity in hand, so this might won't be our recent priority.

danielniccoli commented 6 months ago

It may just be enough to close the stream when issuing the Azurite Close command.

blueww commented 6 months ago

@EmmaZhu

Can your in progress PR https://github.com/Azure/Azurite/pull/2331 fix this issue? As we discussed, it looks also on closing file handles.

EmmaZhu commented 6 months ago

@blueww ,

Yes, still working on it, will need to resolve some test failures.