refactor: share one BeeCount Cloud provider instance - #439
Conversation
|
感谢拆分,#434 已经合并了。这个 PR 我先提一件事,可能会影响你要不要保留其中一部分改动。
|
|
补充一下上一条评论。除了摘掉 我需要的信息对剩下的
#434 之所以能合,是因为这三条都齐了:issue #433 有明确报错文案、有用户报告、我按你的描述真机复现出来了、根因定位到两个登录入口的时序差异。这个 PR 目前没有对应的现象描述。 具体想问的是:#434 合并之后, 我的理解是配置页、同步信息页和 SyncEngine 现在都走共享实例了, 需要一起定的方向问题这个 PR 和 #440 是同一个问题的两种解法:
两个都做是重复投资。我倾向本 PR 这条路 —— 更小、而且让架构朝「全 App 唯一实例」收敛,#440 那些跨实例守卫在单实例下就没有存在意义了。 所以如果你要保这个 PR,请顺带说明你怎么看这个方向选择;如果你认为必须走 #440 那条,也请说明为什么消除多实例不够。 上一条提到的两点仍然需要确认
所以
不是否定你的分析质量。只是在没有实测故障支撑的情况下改认证和 provider 生命周期,回归风险我没法评估。 |
|
已按建议处理,并补上 #434 合并后的实测现象:
这说明 #434 合并后,独立的 定向测试已在 Flutter 3.27.3、1.5GB 内存、2 CPU、单并发下通过: |
修改内容
authServiceProvider复用beecountCloudProviderInstance,使 UI 与 SyncEngine 使用同一个认证实例devices_page.dart改动;本 PR 目前只改sync_providers.dart和对应测试3.7.1 实测现象
3.7.1 已包含 #434。Android 真机启用 2FA 后,从 App 完成一次登录,最初同步正常;过一会儿再次出现
CloudSyncUser not authenticated,随后 App 持续重新发起登录。服务端日志中的脱敏时间线:
后面三次请求严格相隔 30 秒,与 App 的
_silentRecoveryCooldown一致。因此这不是 2FA 或 refresh token 几分钟过期:2FA 验证和 refresh 均已成功,App 内另一个 auth 实例随后又进入了无 session 的静默恢复路径;开启 2FA 后静默邮密登录不能完成,于是进入 30 秒循环。这说明 #434 合并后,独立的
authServiceProvider仍有用户可观察的影响,不只是理论上的多实例风险。方向选择
当前实测直接指向长生命周期的 UI auth 实例与 SyncEngine auth 实例分离,因此本 PR 采用较小的“消除这一个多余实例”方案。它不引入 #440 的进程级静态锁或完整跨实例 session 接管逻辑。
本 PR 也不再增加 provider
dispose()生命周期变更,避免非autoDispose的syncEngineProvider.family持有已释放实例。读取配置改为等待activeCloudConfigProvider.future;现有三个 watch 页面都有.when(error: ...)分支,直接读取.future的登录/配置路径也已有异常处理。验证
在 Flutter 3.27.3 容器中限制
1.5GB内存、2 CPU、单并发运行:该测试确认 UI auth 与 SyncEngine provider 的 auth 为同一实例。3.7.1 已完成原始故障的真机复现;#439 构建版的真机复测尚未完成,完成后会补充结果。
Follow-up to #434.