草庐IT

sqlite - Cygwin SVN : E200030: SQLite disk I/O error

coder 2023-07-19 原文

当我在 Cygwin 中使用 Subversion 更新某些存储库时,某些目录更新成功,而其他目录更新失败并显示错误消息:

svn: E200030: sqlite: disk I/O error



做的时候svn update再次对于同一个存储库,不同的目录可能会出现相同的错误。有时,在上面的错误信息之后有一个SVN指令。

最佳答案

这是由于 a change someone wanted在 Cygwin 的 SQLite包裹。当被问到这个问题时,我是那个包的维护者,我做了导致这个症状的改变。

更改发布为 Cygwin SQLite 版本 3.7.12.1-1 ,并且它解决了那个人的问题,但它具有阻止 Cygwin 的 Subversion 包与 native 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 native 文件锁定,这违背了 Cygwin 的哲学:在可能的情况下,Cygwin 包调用 POSIX 函数而不是直接调用 Windows API,因此 cygwin1.dll可以提供正确的 POSIX 语义。

当访问相关 SQLite 数据库的所有程序都使用 Cygwin 构建时,POSIX 建议文件锁定正是 SQLite 想要的,这是 Cygwin 中的默认假设。但是,当您在纯 POSIX Cygwin 旁边运行像 TortoiseSVN 这样的 Windows 原生 Subversion 程序时svn ,您会遇到冲突。当 TortoiseSVN Windows 资源管理器 shell 扩展具有 .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。它允许程序通过 BSD 文件锁定 API 请求强制文件锁定。我的部分更改是让 Cygwin SQLite 在用户的指导下打开和关闭此功能,允许相同的包同时满足以 Cygwin 为中心和 Windows 原生阵营的需求。

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

后来,当 Jan Nijtmans 接手 Cygwin SQLite 的维护工作时,他通过将其与 SQLite VFS layer 完全集成来进一步增强该机制。 .这允许了第四个选择:在我们开始这个旅程之前,Cygwin SQLite 曾经使用过的本地 Windows 锁定。这主要是为了避免 BSD/Windows 锁定策略与 native Windows SQLite 程序不完全协作的可能性。据我所知,没有人需要使用这个选项,但很高兴知道它在那里。

替代疗法

如果您遇到的冲突是 Cygwin 的命令行之间的冲突 svn和 TortoiseSVN Windows Explorer shell 扩展,还有另一个选项可以修复它。 TortoiseSVN 还附带本地 Windows Subversion 命令行程序。如果你把这些放在你的 PATH领先于 Cygwin 的 bin目录,你根本不应该遇到这个问题。

关于sqlite - Cygwin SVN : E200030: SQLite disk I/O error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007024/

有关sqlite - Cygwin SVN : E200030: SQLite disk I/O error的更多相关文章

  1. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  2. ruby - 创建新数据库时 DataMapper SQLite 错误 - 2

    我是Sinatra的新手,我正在尝试使用SQLite3和Datamapper创建一个数据库。我安装了gem和适配器,然后尝试在文件中执行此代码:#configrequire'sinatra'require'sinatra/contrib'ifdevelopment?require'data_mapper'DataMapper::setup(:default,"sqlite3://#{Dir.pwd}/recall.db")DataMapper.finalize.auto_upgrade!当我执行文件时,命令行给了我这个错误:C:/Ruby193/lib/ruby/site_ruby/1

  3. ruby - Rails 3 不会用 rvm 安装 sqlite3-ruby gem? - 2

    我正在试用rvm,并用它安装了ruby​​1.9.2和rails3。我需要重新安装sqlite3-rubygem(因为rvm为不同版本的ruby​​将所有gem分开)。问题是,当我尝试时,我得到:geminstallsqlite3-ruby/home/jenny/.rvm/rubies/ruby-1.9.2-p0/bin/gem:4:warning:Insecureworldwritabledir/home/jenny/.rvm/gems/ruby-1.9.2-p0/bininPATH,mode040777Buildingnativeextensions.Thiscouldtakeaw

  4. Ruby Guard 问题 - 'Please install the sqlite3 adapter' - railstutorial.org - 2

    我正在关注RubyonRailsTutorial并且在测试部分变得有些困惑,特别是-3.6.2-AutomatedtestswithGuard按照部署到Heroku的教程说明,我已切换到Postgresql并从我的gemfile中删除了sqlite3,并进行了捆绑安装以进行更新。但是,一旦我运行bundleexecguard我收到消息:/Users/username/.rvm/gems/ruby-1.9.3-p125@global/gems/bundler-1.1.3/lib/bundler/rubygems_integration.rb:147:inblockinreplace_ge

  5. ruby - 安装 sqlite3-ruby 时出现问题! - 2

    我在crunchbanglinux上安装sqlite3-rubygem时遇到问题。在谷歌搜索过去几个小时并关注了几个遇到同样问题的人之后,我仍然没有让它工作。这是我在尝试“sudogeminstallsqlite3-ruby”后看到的构建native扩展。这可能需要一段时间...错误:安装sqlite3-ruby时出错:错误:无法构建gemnative扩展。/usr/bin/ruby1.8extconf.rb检查sqlite3.h...是的在-lsqlite3中检查sqlite3_libversion_number()...是检查rb_proc_arity()...否检查sqlite3

  6. javascript - 如何使用 Cordova 将 Sqlite 数据同步到 sql server - 2

    嗨,这么多天以来,我一直在搜索这个主题,但也无法得到提示。如果有人知道如何使用cordova和javascript将sqlite数据同步到sqlserver,请帮忙 最佳答案 开源实现有一些开源项目可以将PhoneGap应用程序与远程服务器同步。但是您必须调整/实现以适合您的项目。SynchronizealocalWebSQLDbtoaserverCouchbaseLitePhoneGappluginPouchdb或者,自定义API您可以创建自己的API方法集,以将数据从WebSQL发送/更新到您的远程服务器DB。标记需要“同步”到

  7. 关于Android Studio查看SQLite数据库 - 2

    连接SQLite数据库对于as内部模拟器可以使用AppInspection,支持API26版本以上优点:这种是最方便的可以实时查看数据表的变化缺点:仅支持内部模拟器,需要安装的东西比较多,很慢,机器性能不好很卡顿对于第三方模拟器可以通过DeviceFileExplorer找到app的.db文件进行查看.db生成位置和名称需要配置来判断litepal.xml-->-->-->-->.db文件在模拟器中的位置需要安装插件,或者其他软件查看数据,不能实时查询具体方法是找到.db文件双击会在电脑的磁盘上生成一个复制的文件(或者直接从模拟器文件夹中将文件复制出来),此时通过DatabaseNavigat

  8. go - 无法将错误转换为 go-sqlite3.Error - 2

    关闭。这个问题是notreproducibleorwascausedbytypos.它目前不接受答案。这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这个问题的解决方式不太可能帮助future的读者。关闭3年前。Improvethisquestion我试图将Go中的错误转换为go-sqlite3.Error,但它总是失败。上图代表我的调试窗口的快照,它显示错误是go-sqlite3.Error类型我正在使用下面的代码进行类型转换。import("github.com/mattn/go-sqlite3")iferr!=nil{ifsqlite3E

  9. sqlite - mattn/go-sqlite 3's regexp extension faster than sqlite3' s LIKE 运算符是否用于 '%word%' 搜索? - 2

    我目前正在使用mattn的go-sqlite3包,并希望使用LIKE'%word%'条件进行许多选择语句搜索。mattn的正则表达式扩展是否比sqlite内置的LIKE运算符更快?(更具体地针对LIKE'%word%'搜索) 最佳答案 mattn/go-sqlite3项目本身已经有相当多的例子SELECTbenchmarksfuncBenchmarkRows(b*testing.B){db.once.Do(makeBench)forn:=0;n您可以根据您的特定测试调整它们。 关于sql

  10. sqlite - 从sqlite3数据库和模型struct标记读取表时出现问题 - 2

    我试图在go中实现一个需要连接到sqlite数据库的函数。这个数据库有多个模型,上级建议我使用gorm库。程序似乎按名称检测我试图访问的表,但它总是返回零值(数字属性)或空字符串。我的第一次尝试是用结构标记来建模模式,但是这是我第一次遇到问题。然后我尝试使用'db'preffix来使用struct标记,指定sqlite中每个属性的名称,但没有任何更改。之后,我用'sql'前缀应用了struct标记…又一次什么都没发生,也有同样的问题。作为最后一次尝试,我将prefix改为“gorm”,但问题又出现了。之后,我删除了所有的struct标记,只留下了对应于主键(id)的struct标记。我

随机推荐