-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Data sync may cause data loss on Android 14 #10205
Comments
这是非常典型的一次丢失日志 |
要么就是遍历的实现有问题,要么就是文件系统有问题 |
没有,那是软件自身的日志 @88250 |
我回复的是另一个人…… |
判断不了的,文件可能存在外部改动,这也是遍历文件系统这个方案存在的意义。 |
但安卓12之后外部改动真的很难,我认为可以忽略该事件 |
我觉个例子,比如有的用户要修改一个 Word 资源文件,那么肯定只能是外部改动,改动完以后遍历文件系统打出最新快照,然后和上个同步点的快照以及云端快照对比得到差异,最后仅同步差异部分。 这是变动的情况,同时也存在外部删除的情况,比如直接在文件系统上删除不需要的资源文件,所以仅从同一个设备的两个快照上是无法判断到底是不是用户意图的删除。 就算是 Android 12 以后无法操作私有数据,也还存在 删除未引用资源文件 的这种手动操作,所以仅用两个快照来比较是无法确保的。 |
遍历的实现我认为没有问题,如果有问题的话应该容易稳定重现,具体代码见 https://github.com/siyuan-note/dejavu/blob/36bb80f2521a2e90ab52a82d1726fa376e049b89/repo.go#L585 综合目前收集到的反馈看,基本可以确定是小米澎湃的文件系统有比较特殊的情况导致遍历不全。 |
用户本地删除了文件,那么快照同步还会尝试在本地删除该文件吗? 现在是用户没有删除文件,但快照认为用户删除了,然后同步的时候再开始真正的删除了本地文件。 这种情况是可以检测的,和用户自行操作不影响 |
不会的,遍历 data 文件夹后文件不存在,那么快照里面就没有这个文件了,日志里面打印的 |
所以我认为在应用层的算法中来解决(或者说某种补偿、兜底机制)这个问题不大可能,而且非常容易引入新的问题。 |
先禁止小米澎湃开启同步功能吧,免得丢失用户数据。 |
那是在什么时候删除的,我一直以为 local remove 表示思源正在删除文件。 |
这个也不太好,还不能完全确认是不是在所有版本上必现。 |
遍历的时候文件少了快照里面就少了,实际上 data 下面文件还在,所以后面遍历可能又正确了。 |
这样,我先升级一下 gomobile 以便排除 sdk 的影响(虽然可能性有点低,文件系统相关的实现比较底层,不大可能这么多年还有 bug),晚点我编译个 apk 给你安装看看。 |
所以文件是被哪个步骤删掉的,看有没有办法从逻辑上绕过这个问题 |
好的 |
我看D大说的,应该是代码里遍历文件的时候,因为澎湃os的问题,导致有文件没读到,所以这个时候的快照里,这些没读到的文件,就已经是删除了的。 实际上文件并没有真的没有删除,只是这一次获取的过程中,“缺失”了这些文件。下一次也许又能获取到了。 @88250 另外想问一下,D大,在整个对比过程中,内核会有“删除文件”这样的清理操作吗? |
没有。 |
没有删除的操作的话,我不是很理解为什么会出现访问不了资源。(纯疑惑) |
确实,日志上这两次相邻的同步遍历文件确实少了一些,而且似乎没有任何规律可言,我认为可以确定是文件系统相关的问题了。 这几天我试下用 Java 写个文件遍历看看结果是否稳定,做好包以后我通过邮件发送给你,谢谢。 |
* commit '0f91f51bb0f8fc7f71e3c038ae45a3d69d3e95e1': (109 commits) 🐛 fix siyuan-note#10238 🎨 Update linux/macOS packing font 🎨 Update npm mirror 🔖 Release v2.12.4 🚨 🎨 菜单右键复制无效 🎨 fix siyuan-note#10230 🎨 fix siyuan-note#10230 📝 Update changelogs 🐛 remove invalid requests during boot (siyuan-note#10227) 📝 Update changelogs 🎨 Improve search and replace spaces siyuan-note#10231 📝 Update changelogs 🎨 Improve data sync to prevent an old snapshot to overwrite the new one siyuan-note#10229 🎨 fix siyuan-note#10225 🎨 Update README 📝 ♻️ 🐛 Data sync may cause data loss on Android 14 siyuan-note#10205 🐛 Data sync may cause data loss on Android 14 siyuan-note#10205 ... # Conflicts: # README.md # app/src/config/account.ts
我昨天(1月29日)的同步也碰到这个问题了,小米手机,系统版本为HyperOS 1.0.13.0,Android版本为14,思源已经升级至2.12.5版 这是我的日志文件: |
@hihaojie 从日志上看是因为 Android 端启动的 [::1] HTTP 服务(Java 实现的遍历)被拒绝连接了,导致回退到 golang 实现的遍历。 但是我看到这个接口不是每次都被拒绝,有的时候又可以请求到,请检查是不是使用了代理类软件没有排除 IPv6 环回地址 [::1],或者其他影响网络的可能。 |
我有在使用代理软件Clash,但是我确定手机在昨天22点之前未使用过Clash。 |
暂时没有其他方案了,目前只能走 HTTP 服务,建议在代理软件上排除 [::1] 这个地址后再试试。 |
您好,我刚刚又碰到了此问题,这次我十分确定代理是没有开启的。因为上次的同步问题,手机端我现在只进行手动同步,每次同步后对比数据快照,如下是本次同步丢失文件的截图: 如下是本次的日志: 思源笔记版本v2.12.6,Android14,安全更新:2024-02-01,HyperOS 1.0.14.0 |
从日志上看,刚好有 6 个文档因为文件系统上不存在而无法加载:
是不是使用过手机清理功能或者什么清理 app 导致文件被删除了? |
确定没有,我没有使用手机清理功能的习惯,也没有设置后台自动清理。 |
@hihaojie 我们先确认下是不是这几个文档丢失:用快照回滚,然后在搜索框中搜索 |
那可以确定不是遍历不到的问题了,而是某种情况下文件系统会“吞”文件(如果是用户操作,日志中会打印 这个问题目前是第一次发现,无法定位原因,需要时间继续观察,感谢反馈。 |
我澎湃 os遇到了同样的丢文件问题 |
@AvoidantPerDis 麻烦发一下快照 ID 或者文件路径。 |
和上面 @hihaojie 遇到的可能是同一个问题:
我们单独开一个 issue 跟进 #10323 |
The text was updated successfully, but these errors were encountered: