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

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

我刚才在编辑 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

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

  • 思源笔记

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

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

    28447 引用 • 119791 回帖

相关帖子

欢迎来到这里!

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

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

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

    1 回复
  • 其他回帖
  • 你好,从日志上看是 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 回复
  • 结合两份日志分析出原因了,需要再往前看一点。

    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 端同步后拉取到了旧版本,和当前编辑版本尝试了冲突,所以生成了冲突文件

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

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

推荐标签 标签

  • OneNote
    2 引用 • 5 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 559 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    188 引用 • 1057 回帖 • 2 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 152 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 158 关注
  • Anytype
    3 引用 • 31 回帖 • 59 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    11 引用 • 15 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 260 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    502 引用 • 1397 回帖 • 241 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 405 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 120 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 64 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 668 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 123 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 770 关注
  • OnlyOffice
    4 引用 • 41 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 636 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 53 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    126 引用 • 83 回帖 • 2 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 724 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 222 关注
  • OAuth

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

    36 引用 • 103 回帖 • 44 关注