Cygwin SVN:E200030:SQLite磁盘I/O错误

Yor*_*war 25 svn sqlite cygwin

当我在Cygwin中使用Subversion来更新某个存储库时,某些目录会成功更新,而另一些目录会因错误消息而失败:

svn:E200030:sqlite:磁盘I/O错误

在做svn update了同一个资源库再次,不同的目录中可以得到同样的错误.有时,在上述错误消息之后有一条SVN指令.

War*_*ung 30

这是因为Cygwin的SQLite包中有人想要的更改.当问到这个问题时,我是该软件包的维护者,我做了导致这种症状的更改.

这个更改是作为Cygwin SQLite版本发布的3.7.12.1-1,它解决了一个人的问题,但它有防止Cygwin的Subversion包与本机Windows Subversion实现合作的不良副作用.

发生了什么?

这里的核心问题是Subversion 1.7改变了磁盘格式的工作副本.部分更改涉及新的SQLite数据库文件.svn/wc.db.现在,为了实现SQLite的并发保证,SQLite在访问数据库文件时将其锁定.

这一切都很好,也很明智,但是当你尝试混合使用Windows本机和POSIX 文件锁定语义时会遇到问题.在Windows上,文件锁定几乎总是意味着强制锁定,但在Linux系统上--Cygwin试图模仿 - 锁定通常意味着建议锁定.

这有助于了解"磁盘I/O错误"的来源.

Cygwin SQLite的3.7.12.1-1变化是以"Unix模式"而不是"Cygwin模式"构建库.在Cygwin模式下,库使用Windows本机文件锁定,这违背了Cygwin的原理:在可能的情况下,Cygwin打包调用POSIX函数而不是直接指向Windows API,这样就cygwin1.dll可以提供正确的POSIX语义.

当访问所讨论的SQLite DB的所有程序都是使用Cygwin构建时,POSIX顾问文件锁定正是您想要的SQLite,这是Cygwin中的默认假设.但是,当您运行像TortoiseSVN这样的Windows本机Subversion程序以及纯POSIX Cygwin时svn,您会遇到冲突.当TortoiseSVN Windows资源管理器外壳扩展.svn/wc.db程序使用强制锁定锁定文件并且Cygwin svn出现并尝试对其进行建议锁定时,它会立即失败.Cygwin svn假设锁定尝试将立即成功或阻塞直到它成功,因此它错误地将锁定失败解释为磁盘I/O错误.

我们是如何解决这种困境的?

在Cygwin中,我们总是尝试尽可能地使用Windows本机程序.诀窍是找到一种方法来做到这一点,同时仍然与Cygwin程序玩得很好.

不是每个人都同意我们应该尝试这一点."Cygwin SQLite是Cygwin的一部分,所以它只需要与其他Cygwin程序一起使用,"一个小组会说.对手方将回答:"Cygwin在Windows上运行,所以它必须与其他Windows程序一起运行良好."

幸运的是,我们提出了一种让两个群体都满意的方法.

由于在Cygwin的SQLite的一部分3.7.17-x包装的努力,我测试一项新功能,科琳娜Vinschen加入到cygwin1.dll1.7.19版本.它允许程序通过BSD文件锁定API请求强制文件锁定.我的部分改变是让Cygwin SQLite在用户的指导下打开和关闭此功能,允许相同的程序包满足Cygwin中心和Windows本地阵营的需求.

这个Cygwin DLL功能在1.7.20中进一步改进,我3.7.13-3使用最终的锁定语义发布了Cygwin SQLite .此版本允许选择三种锁定策略:POSIX咨询锁定,BSD建议锁定和BSD/Cygwin强制锁定.到目前为止,后一种策略已被证明与本机Windows锁定完全兼容.

后来,当Jan Nijtmans接管了Cygwin SQLite的维护时,他通过将其与SQLite VFS层完全集成来进一步增强了这种机制.这允许第四个选项:Cygwin SQLite在开始此旅程之前使用的本机Windows锁定.这主要是对抗BSD/Windows锁定策略与本机Windows SQLite程序不能完全合作的可能性.据我所知,没有人需要使用这个选项,但很高兴知道它就在那里.

替代补救措施

如果您遇到的冲突是在Cygwin的命令行svn和TortoiseSVN Windows Explorer外壳扩展之间,那么还有另一种选择来解决它.TortoiseSVN也附带本机Windows Subversion命令行程序.如果你把它们放在PATHCygwin bin目录的前面,你根本不应该遇到这个问题.


me_*_*and 15

遇到同样的问题后,它(至少在我的情况下)似乎是与TortoiseSVN的互动.禁用TortoiseSVN的状态图标缓存(设置>图标叠加>状态缓存"无">应用)让一切正常.

(这显然无法解决潜在的问题,这似乎是由于Cygwin的Subversion程序包依赖于改变其访问模式的SQL包.正如我写的那样,在Cygwin邮件列表上有关如何讨论如何缓慢解决这个问题.)


Yor*_*war 6

ldd /usr/bin/svn 表明SVN依赖于/usr/bin/cygsqlite3-0.dll.

将libsqlite3从3.7.12更改回3.7.3后,问题似乎消失了.所以这可能是一个SQLite库问题.