文档同步时触发回滚并冲突

本贴最后更新于 420 天前,其中的信息可能已经事过景迁

我刚才在编辑 2024-01-14 ID:20240414114409-phyv0q0 文档,切出思源笔记看了下其他东西,再切回来,发现刚刚编辑的内容不见了,查看文档树,生成了冲突文档 :2024-04-14 (Conflicted 2024-04-14 14:21:46) ID:20240414142146-razbv5w,好在冲突文档中存在 2024-01-14 丢失的内容。

image.png

下面是系统日志:systemlog.zip

我设置的文件历史间隔是 1 分钟,查看原文档的文件历史,2024-04-14 14:21:27 还存在着内容,

2024-04-14 14:22:27 就丢失了。冲突文档也刚好再这个区间内生成。接着看了下云端快照,手机端在这个时间范围内自动同步了一下,image.png

桌面端与手机端快照对比如下:image.png

手机端这段时间是完全没有编辑和查看任何文档的,出现这种情况我觉得还是同步算法有一些缺陷,希望可以再优化一下。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25860 引用 • 107103 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 其他回帖
  • MisakaImouto

    辛苦 D 大,这是安卓端日志:systemlog2.zip

    1 回复
  • 结合两份日志分析出原因了,需要再往前看一点。

    PC 端 14:14:57 修改这个文件后同步,然后 Android 端 14:15:39 同步感知同步,但在这次同步中,Android 设备可能因为休眠或者某种原因导致同步很慢,在数据量不大的情况下同步处理了约 3 分钟,直到 14:19:48 时发现云端快照已经变更了(PC 端这 3 分钟时间内进行了同步,上传了新的云端快照):

    W 2024/04/14 14:19:48 sync.go:497: cloud latest changed [old=157a47e7abd8a2644dc3ef2a3908cfa98b27e9a5, new=fa80ce8a5bf918f671f34c80fdf05a8068a7439d]

    然后 14:21:30 Android 再次通过感知触发同步:

    I 2024/04/14 14:21:30 sync.go:785: sync websocket message: &{0 map[cmd:synced kernel:itgtxvl synced:1.713075691399e+12]} I 2024/04/14 14:21:30 repository.go:1274: syncing data repo [device=407mwqwmo6fz, kernel=xwua91w, provider=0, mode=a/false]

    这次同步中,这个文档的最新版已经是 PC 端 14:20:53 修改的最新版:

    I 2024/04/14 14:21:40 sync.go:239: cloud upsert [0d3b97e2bbe2926577d042b7b710743f8c780d1b, /20220902202745-qenctb8/20220902202751-ke13mrt/20240101035900-g5xihv6/20240401225214-cowjul5/20240414114409-phyv0q0.sy, 2024-04-14 14:20:53]

    但是因为前面那次 Android 端同步失败,所以这个文件在 Android 端仍然算作是本地更新但未同步:

    I 2024/04/14 14:21:40 sync.go:245: local upsert [cb5ac055e3b51b285f44740e8585ebfc08c01811, /20220902202745-qenctb8/20220902202751-ke13mrt/20240101035900-g5xihv6/20240401225214-cowjul5/20240414114409-phyv0q0.sy, 2024-04-14 14:14:57]

    所以最终 Android 端这次同步以后就被 14:14:57 的版本覆盖云端了:

    I 2024/04/14 14:21:44 sync.go:1325: upsert file [cb5ac055e3b51b285f44740e8585ebfc08c01811, /20220902202745-qenctb8/20220902202751-ke13mrt/20240101035900-g5xihv6/20240401225214-cowjul5/20240414114409-phyv0q0.sy, 2024-04-14 14:14:57] chunk [889faf3c10c476ae42c7ec7a4a8482bbe11b553b]

    最后 PC 端同步感知 14:21:50 拿到的最新快照就把数据更新到了 14:14:57 的旧版本。

    总结一下,主要原因是两个设备之间没有顺利执行交替同步:

    • Android 端因为休眠或者某种原因导致同步太慢导致同步锁超时(目前设置的是 1 分钟超时),PC 端在 Android 端同步的期间内获得了同步锁成功同步了新快照,导致 Android 端同步失败
    • 下次 Android 端同步时依旧会将将未同步的变更纳入到同步中,所以将旧的版本覆盖到了云端
    • PC 端在上面 Android 端同步后拉取到了旧版本,和当前编辑版本尝试了冲突,所以生成了冲突文件

    同步算法应该没有问题,主要问题是出在同一个文件没有交替同步造成了冲突,同步感知可以降低冲突概率(通过尽量即时地在多设备间同步),但是无法彻底避免冲突(同步失败,后续再同步时还是可能造成冲突)。

  • 你好,从日志上看是 14:21:50 从 Android 端执行了一次同步,然后通过同步感知触发了 PC 端同步,在这次同步中,Android 端同步了在 14:14:57 修改的 20240414114409-phyv0q0 文件,此时 PC 上的修改时间是 14:20:53,所以产生了冲突文件:

    I 2024/04/14 14:21:51 diff.go:49: upsert [lID=cb5ac055e3b51b285f44740e8585ebfc08c01811, lPath=/20220902202745-qenctb8/20220902202751-ke13mrt/20240101035900-g5xihv6/20240401225214-cowjul5/20240414114409-phyv0q0.sy, lUpdated=2024-04-14 14:14:57, rID=0d3b97e2bbe2926577d042b7b710743f8c780d1b, rPath=/20220902202745-qenctb8/20220902202751-ke13mrt/20240101035900-g5xihv6/20240401225214-cowjul5/20240414114409-phyv0q0.sy, rUpdated=2024-04-14 14:20:53]

    进一步排查需要 Android 端日志才好分析出 14:14:57 修改的文件为什么到了 14:21:50 才进行同步,谢谢。

    1 回复
MisakaImouto
索性去不顾一切,肆意赴未知明天

推荐标签 标签

  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 636 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 48 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • Visio
    1 引用 • 2 回帖
  • abitmean

    有点意思就行了

    33 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 674 关注
  • RemNote
    2 引用 • 16 回帖 • 19 关注
  • Excel
    31 引用 • 28 回帖
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖 • 2 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 659 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    98 引用 • 903 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 284 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 663 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖 • 2 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 33 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    80 引用 • 396 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 2 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • gRpc
    11 引用 • 9 回帖 • 99 关注