草庐IT

SQLite 与 OpenAFS 锁定兼容吗?

coder 2023-07-21 原文

我想让许多联网计算机上的许多进程通过 OpenAFS 1.4.12.1 同时访问同一个 SQLite 数据库。写操作会很少,所以SQLite的单写设计应该不是问题。

我想知道这是否可行。我无法找到两条关键信息:

SQLite documentation声明“SQLite 使用 POSIX 建议锁来实现 Unix 上的锁定”。它还警告说“你最好的防御是不要对网络文件系统上的文件使用 SQLite”。但是,它似乎没有具体说明 SQLite 是否只使用整个文件锁定,或者它是否也使用字节范围锁定。

我也无法确定 OpenAFS 1.4.12.1 支持哪些类型的锁定。这unofficial source from 1998不幸的是,这是我能找到的最好的来源。那时,支持整个文件锁定,但不支持字节范围锁定。

官方文档只出现this page ,尽管它的标题很友好,但实际上并没有说明最新的 OpenAFS 是否支持 POSIX 字节范围咨询锁定。

编辑: 这可能吗?如果是这样,是否需要任何编译时 SQLite 标志?

最佳答案

我使用 SQLite 已经有一段时间了,并且有幸处理了一些锁定问题。我非常确定 SQLite 默认在 Unix 文件系统上使用字节范围锁。

更准确地说,它包含一些替代锁定方法的代码(例如使用 flock()dotlock-style 整个文件锁)。使用 SQLITE_ENABLE_LOCKING_STYLE option 编译时它会尝试自动检测底层文件系统的正确锁定方法。

自动检测代码包含一些硬编码的情况(例如“ufs”、“nfs”和“smbfs”),这些都不是 AFS。如果没有硬编码大小写匹配,SQLite 会尝试使用 fcntl() 获取文件的字节范围锁。 .然后假设如果 fcntl() 调用成功,则字节范围锁可用。

这就是 OpenAFS 让事情变得有趣 的地方。显然([1][2][3])OpenAFS 有长期向用户空间应用程序撒谎字节范围锁的历史。来自 openafs-1.4.14 源代码:

/* next line makes byte range locks always succeed,
 * even when they should block */
if (af->l_whence != 0 || af->l_start != 0 || af->l_len != 0) {
    DoLockWarning();
    afs_PutFakeStat(&fakestate);
    return 0;
}

一句话:哎哟!

无论如何,它都允许字节范围锁成功。在 Linux 上,情况可能更糟:它使用内核基础结构在同一系统的进程之间 提供字节范围锁。这意味着应用程序不能只派生一个新进程并测试锁定机制 - 字节范围锁似乎工作正常,但无法保护文件免受远程进程的影响。

简而言之:您不能将未修改的 SQLite 可靠地用于 OpenAFS。大多数其他网络文件系统也有问题,因此建议完全避免使用网络文件系统。

一些可能的变通方法(排名不分先后):

  • 使用适当的 DBMS,例如 PostgreSQL .如果可以做到这一点,从长远来看,您会过得更好。

  • 如果成熟的 DBMS 过于强大,请为您的应用程序实现您自己的服务器。

  • 修改 SQLite 源代码以默认为 OpenAFS 上的 flock()。我不确定这是否会正常工作,因为 OpenAFS 有很长的锁定问题历史([1][2]),即使是普通的 flock(),但你不会知道直到您对其进行测试。

  • 使用 OpenAFS 用户空间,而不是通过内核,为 SQLite 实现您自己的 OpenAFS VFS。

  • 使用另一个网络文件系统试试运气。

无论您做什么,如果它以任何方式涉及 SQLite3 和共享数据库文件,您都必须执行大量测试。

编辑:

评论者建议使用点锁文件机制。我没有深入研究 OpenAFS 源代码,但乍一看它似乎支持 open(O_CREAT|O_EXCL) SQLite 使用的创建点锁文件的方法。如果它按预期工作,那么如果您强制它使用 dotlock 方法,那么 SQLite 可能确实可以与 OpenAFS 一起使用。

也就是说,在不将网络文件系统的复杂性引入混合的情况下,点锁在常规本地文件系统上就足够了 - 这就是为什么我一开始没有建议它。

关于SQLite 与 OpenAFS 锁定兼容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5468349/

有关SQLite 与 OpenAFS 锁定兼容吗?的更多相关文章

  1. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  2. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  3. ruby-on-rails - 不兼容的库版本 : nokogiri. bundle 需要 8.0.0 或更高版本,但 libiconv.2.dylib 提供 7.0.0 版本 - 2

    为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem

  4. 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

  5. ruby - 用于 CSS3 跨浏览器兼容性的 SASS 插件? - 2

    是否有一个SASS扩展可以采用SASS样式表,找到中性属性(例如border-radius)并为其输出所有特定于供应商的属性(例如-webkit-border-radius等)自动?我真的不想手动创建所有混入,也不想手动编写代码。我确定一定有这样的扩展名,但我找不到它。帮忙? 最佳答案 有一个非常好的gem可以满足您的需求。它叫做Bourbon它不会用特定于供应商的css替换您的css,因为它可以像SASS一样工作。它基本上是一个正确生成跨浏览器css的mixin集合。 关于ruby-用

  6. ruby - 我在哪里可以找到与其兼容的 Ruby 版本的 gems 版本号? - 2

    这个问题说明了一切。例如,我有一台安装了ruby​​1.8.6的服务器。当我尝试sudogeminstallroo时,它给出了错误nokogirirequiresRubyversion>=1.8.7。所以,我想安装与Ruby1.8.6兼容的旧版本roo。但我不知道去哪里搜索。我知道RubyForge,但它也没有说明Ruby的兼容版本。 最佳答案 蛮力方法是获取一个git克隆,搜索它指定的Ruby版本的位置,然后使用gitblame甚至gitpickaxe来确定最后一个没有的版本'没有那个要求。

  7. ruby - Jekyll 与 .erb 的兼容性 - 2

    据我了解,Jekyll兼容Liquid和YAML。但是,是否有插件或可用功能可以使其与.erb(嵌入式Ruby)文件兼容?否则,这是一个不必要的功能还是没有用的东西?Jekyll对Liquid和YAML的内置使用是否会取代.erb将会或可以做什么?谢谢! 最佳答案 使用.erb不适合jekyll,但是你应该使用jekyll-renderinggem。 关于ruby-Jekyll与.erb的兼容性,我们在StackOverflow上找到一个类似的问题: http

  8. ruby - ruby 命令行开关 -rubygems & -r 不兼容吗? - 2

    我最近将一个ruby​​库转换为一个gem,这似乎破坏了命令行的可用性作为图书馆工作得很好$ruby-rfoobar-e'pFooBar.question'#=>"answer"作为一个gem,irb知道如何从命令行开关中请求一个gem$irb-rubygems-rfoobarirb(main):001:0>FooBar.question#=>"answer"但对于ruby​​本身来说同样失败了:$ruby-rubygems-rfoobar-e'pFooBar.question'ruby:nosuchfiletoload--foobar(LoadError)我现在必须这样做吗,这看起来

  9. Ruby 不兼容的字符编码 - 2

    我目前正在尝试编写一个脚本来遍历输入文件并检查网站上的数据。如果它找到新数据,它会打印到它通过的终端,如果没有,它会告诉我它失败了。反之亦然删除的数据。它工作正常,直到我收到的输入文件包含“™”字符。然后当ruby​​到达该行时,它会吐出一个错误:PDAPWeb.rb:73:in`include?':incompatiblecharacterencodings:UTF-8andIBM437(Encoding::CompatibilityError)违规行是一个简单的检查,以查看该文本是否存在于页面上。ifbrowser.text.include?(program_name)其中prog

  10. 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

随机推荐