ESENT 无法确定最小 I/O 块大小

ESENT 无法确定最小 I/O 块大小

我正在努力RavenDB在共享/多租户网络主机上以嵌入模式运行。RavenDB 依赖于 ESENT 存储 API。托管计算机上的文件系统已锁定。RavenDB Initialize() 调用导致以下事件日志条目

Raven (20604) D:\Path\To\Website\App_Data\RavenDB\Data52e0e402-79d7-4f47-a219-3d1e2e73321c: An attempt to determine the minimum I/O block size for the volume "D:\" containing "D:\Path\To\Website\App_Data\RavenDB\logs\" failed with system error 5 (0x00000005): "Access is denied. ".  The operation will fail with error -1032 (0xfffffbf8).

因此,假设执行过程需要访问以读取某些卷信息,但是该操作被拒绝,因为该过程仅被授予与其相关的卷部分的权限。

有人知道相关权利是什么,以及是否可以以某种方式省略它们?

附言:如果谁比我更有业力,请标记这个ravendbesent

答案1

微软KB266361 显示 ESE 错误代码的错误消息。

在这种情况下,错误代码 -1032 表示“无法访问文件,文件已被锁定或正在使用中”。

查看大量使用 ESE 的其他 Microsoft 产品,例如 Exchange(参见http://technet.microsoft.com/en-us/library/bb218334(v=exchg.80).aspx) 错误消息似乎更符合锁定问题,而不是权限问题。鉴于您正在运行具有多租户的 IIS 的多线程环境中,因此再次出现锁定问题的可能性很高。

为了帮助调查此问题,我建议使用类似 Process Explorer 的工具(参见http://technet.microsoft.com/en-us/sysinternals/bb896653) 来找出谁锁定了文件。这可能会显示外部来源是文件锁定的原因。

我建议调查一下调用的方法Initialize()。在高并发环境中,该方法可能被两个单独的线程调用。您可能需要负责lock此函数调用的代码部分。

如果这没有帮助,最好在 StackOverflow 上用代码示例提问。

希望这可以帮助。

答案2

共享主机上的用户需要读取驱动器(根)上的扩展属性来确定 I/O 块大小。

相关内容