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

时间:2012-06-13 01:19:24

标签: sqlite svn cygwin

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

  

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

对同一存储库再次执行svn update时,不同的目录可能会出现相同的错误。有时,在上述错误消息之后有一条SVN指令。

5 个答案:

答案 0 :(得分:29)

这是由于Cygwin的a change someone wanted包中的SQLite造成的。当问到这个问题时,我是该软件包的维护者,我做了导致这种症状的改变。

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

发生了什么?

这里的核心问题是Subversion 1.7 changed the working copy on-disk format。部分更改涉及新的SQLite数据库文件.svn/wc.db。现在,为了实现SQLite's concurrency guarantees,SQLite在访问数据库文件时将其锁定。

这一切都很好而且明智,但是当你尝试混合使用Windows native和POSIX file locking semantics时会遇到问题。在Windows上,文件锁定几乎总是意味着mandatory locking,但在Linux系统上 - Cygwin试图模仿 - 锁定通常意味着advisory locking

这有助于了解“磁盘I / O错误”的来源。

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

当访问所讨论的SQLite数据库的所有程序都是用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打包工作的一部分,我测试了a new feature Corinna Vinschen添加到cygwin1.dll版本1.7.19的SQLite VFS layer。它允许程序通过BSD文件锁定API请求强制文件锁定。我的部分变化是让Cygwin SQLite在用户的指导下打开和关闭此功能,允许相同的程序包满足Cygwin中心和Windows本地阵营的需求。

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

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

替代补救措施

如果您遇到的冲突是在Cygwin的命令行svn和TortoiseSVN Windows Explorer外壳扩展之间,那么还有另一个选项可以解决它。 TortoiseSVN也附带本机Windows Subversion命令行程序。如果你把它们放在PATH之前的Cygwin的bin目录中,你就不应该遇到这个问题了。

答案 1 :(得分:15)

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

(这显然无法解决根本问题,这似乎是由于Cygwin的Subversion程序包依赖于改变其访问模式的SQL包。正如我写的那样,在Cygwin邮件上有活跃的[如果慢]讨论关于如何解决这个问题的清单。)

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

使用TortoiseSVN,在Refresh shell overlays勾选clean up为我解决了问题。

答案 4 :(得分:1)

对于其他参考,我只是遇到了同样的错误(svn: E200030: sqlite: disk I/O error)并发现我的一个日志文件占用了我所有的空间(并且由于没有可用空间而无法写入HDD)。

运行(以确保您有足够的磁盘空间)

df -h 

(如果你不删除一些大文件(我刚刚删除了一些备份和日志文件)

然后我只需要跑:

svn cleanup

这解决了我的错误。