Skip to content

fix: prevent dockHiddenSurfaceIds from being reset to empty#1629

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
18202781743:master
Jun 11, 2026
Merged

fix: prevent dockHiddenSurfaceIds from being reset to empty#1629
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
18202781743:master

Conversation

@18202781743

@18202781743 18202781743 commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

The commit refactors the save logic for tray sort order data to prevent
dockHiddenSurfaceIds from being accidentally cleared. Previously,
onAvailableSurfacesChanged() called saveDataToDConfig() which
saved all configuration values, including dockHiddenSurfaceIds, at a
point where other processes might be concurrently modifying this value,
leading to a race condition where it could be overwritten with empty
data.

The fix splits the monolithic saveDataToDConfig() into targeted
save methods: saveSortOrderToDConfig(), saveHiddenIdsToDConfig(),
saveDockHiddenIdsToDConfig(), and saveCollapsedToDConfig(). In
onAvailableSurfacesChanged(), only sort order and hidden IDs are
saved, deliberately excluding dockHiddenSurfaceIds to avoid the
race condition. The dockHiddenSurfaceIds is now only saved from
setDockVisible() via the new saveDockHiddenIdsToDConfig() method,
when the value is explicitly changed.

Influence:

  1. Test tray plugin visibility toggling and verify
    dockHiddenSurfaceIds persists correctly
  2. Verify hiddenSurfaceIds and sort order still update properly on
    surface changes
  3. Test scenarios where multiple processes might modify dock
    configuration simultaneously
  4. Verify no data loss occurs when hiding/showing dock tray items
  5. Test that collapsed state saves and loads correctly

fix: 修复 dockHiddenSurfaceIds 被意外重置为空的问题

本次重构了托盘排序数据的保存逻辑,防止 dockHiddenSurfaceIds 被意外清
空。之前 onAvailableSurfacesChanged() 调用 saveDataToDConfig() 会保
存所有配置值,包括 dockHiddenSurfaceIds,而此时其他进程可能正在并发修
改该值,导致竞态条件,使其被空数据覆盖。

修复方案将单一的 saveDataToDConfig() 拆分为针对性的保存方
法:saveSortOrderToDConfig()saveHiddenIdsToDConfig()
saveDockHiddenIdsToDConfig()saveCollapsedToDConfig()
onAvailableSurfacesChanged() 中,只保存排序和隐藏 ID,刻意排
dockHiddenSurfaceIds 以避免竞态条件。dockHiddenSurfaceIds
现在仅在通过 setDockVisible() 显式修改时,通过新增的
saveDockHiddenIdsToDConfig() 方法保存。

Influence:

  1. 测试托盘插件的可见性切换,验证 dockHiddenSurfaceIds 是否持久化保存
  2. 验证在 surface 变化时 hiddenSurfaceIds 和排序是否正常更新
  3. 测试多个进程同时修改 dock 配置的场景
  4. 验证显示/隐藏 dock 托盘项时数据不会丢失
  5. 测试折叠状态的保存和加载是否正常
    PMS:BUG-363149

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @18202781743, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

The commit refactors the save logic for tray sort order data to prevent
`dockHiddenSurfaceIds` from being accidentally cleared. Previously,
`onAvailableSurfacesChanged()` called `saveDataToDConfig()` which
saved all configuration values, including `dockHiddenSurfaceIds`, at a
point where other processes might be concurrently modifying this value,
leading to a race condition where it could be overwritten with empty
data.

The fix splits the monolithic `saveDataToDConfig()` into targeted
save methods: `saveSortOrderToDConfig()`, `saveHiddenIdsToDConfig()`,
`saveDockHiddenIdsToDConfig()`, and `saveCollapsedToDConfig()`. In
`onAvailableSurfacesChanged()`, only sort order and hidden IDs are
saved, deliberately excluding `dockHiddenSurfaceIds` to avoid the
race condition. The `dockHiddenSurfaceIds` is now only saved from
`setDockVisible()` via the new `saveDockHiddenIdsToDConfig()` method,
when the value is explicitly changed.

Influence:
1. Test tray plugin visibility toggling and verify
`dockHiddenSurfaceIds` persists correctly
2. Verify `hiddenSurfaceIds` and sort order still update properly on
surface changes
3. Test scenarios where multiple processes might modify dock
configuration simultaneously
4. Verify no data loss occurs when hiding/showing dock tray items
5. Test that collapsed state saves and loads correctly

fix: 修复 dockHiddenSurfaceIds 被意外重置为空的问题

本次重构了托盘排序数据的保存逻辑,防止 `dockHiddenSurfaceIds` 被意外清
空。之前 `onAvailableSurfacesChanged()` 调用 `saveDataToDConfig()` 会保
存所有配置值,包括 `dockHiddenSurfaceIds`,而此时其他进程可能正在并发修
改该值,导致竞态条件,使其被空数据覆盖。

修复方案将单一的 `saveDataToDConfig()` 拆分为针对性的保存方
法:`saveSortOrderToDConfig()`、`saveHiddenIdsToDConfig()`、
`saveDockHiddenIdsToDConfig()` 和 `saveCollapsedToDConfig()`。
在 `onAvailableSurfacesChanged()` 中,只保存排序和隐藏 ID,刻意排
除 `dockHiddenSurfaceIds` 以避免竞态条件。`dockHiddenSurfaceIds`
现在仅在通过 `setDockVisible()` 显式修改时,通过新增的
`saveDockHiddenIdsToDConfig()` 方法保存。

Influence:
1. 测试托盘插件的可见性切换,验证 `dockHiddenSurfaceIds` 是否持久化保存
2. 验证在 surface 变化时 `hiddenSurfaceIds` 和排序是否正常更新
3. 测试多个进程同时修改 dock 配置的场景
4. 验证显示/隐藏 dock 托盘项时数据不会丢失
5. 测试折叠状态的保存和加载是否正常

PMS:BUG-363149
@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, BLumia

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

我对这段代码进行了仔细审查,以下是我的分析和改进建议:

代码逻辑

  1. 代码将原本的saveDataToDConfig()函数拆分为多个专门的保存函数,这是一个良好的改进,提高了代码的可维护性和可读性。
  2. onAvailableSurfacesChanged()中,现在只保存可能被修改的数据,避免了不必要的保存操作和潜在的竞争条件。

代码质量

  1. 优点:

    • 函数职责更加单一,符合单一职责原则
    • 函数命名清晰,能够准确表达其功能
    • 减少了重复代码
  2. 可改进之处:

    • saveHiddenDataToDConfig()函数只是简单地调用了其他两个函数,可以考虑是否需要这个中间层
    • 调试信息(qDebug语句)应该考虑使用条件编译或日志级别控制,而不是直接输出

代码性能

  1. 将保存操作拆分为多个小函数,可以避免一次性保存过多数据,提高灵活性。
  2. onAvailableSurfacesChanged()中只保存必要的数据,减少了不必要的I/O操作。
  3. 建议考虑添加数据缓存机制,避免频繁的配置写入操作。

代码安全

  1. 使用DConfig进行数据持久化是安全的,但建议添加数据验证机制,确保写入的数据格式正确。
  2. 在多进程环境下,对共享数据的访问需要考虑同步机制,避免竞争条件。
  3. 建议添加异常处理机制,确保在配置保存失败时能够优雅地处理错误。

具体改进建议

  1. 考虑移除saveHiddenDataToDConfig()中间函数,直接调用具体的保存函数:
void TraySortOrderModel::saveDataToDConfig()
{
    saveSortOrderToDConfig();
    saveHiddenIdsToDConfig();
    saveDockHiddenIdsToDConfig();
    saveCollapsedToDConfig();
}
  1. 添加日志级别控制:
#ifdef QT_DEBUG
    qDebug() << "collapsedChanged";
#endif
  1. 添加数据验证:
void TraySortOrderModel::saveSortOrderToDConfig()
{
    if (!m_dconfig) return;
    
    // 验证数据有效性
    QSet<QString> allIds = m_stashedIds.toSet() + m_collapsableIds.toSet() + m_pinnedIds.toSet();
    
    m_dconfig->setValue("stashedSurfaceIds", m_stashedIds);
    m_dconfig->setValue("collapsableSurfaceIds", m_collapsableIds);
    m_dconfig->setValue("pinnedSurfaceIds", m_pinnedIds);
}
  1. 考虑添加批量保存机制,减少I/O操作:
void TraySortOrderModel::saveDataToDConfig()
{
    if (!m_dconfig) return;
    
    // 开始批量操作
    m_dconfig->beginGroup("TraySettings");
    
    saveSortOrderToDConfig();
    saveHiddenDataToDConfig();
    saveCollapsedToDConfig();
    
    // 结束批量操作
    m_dconfig->endGroup();
}
  1. 添加错误处理:
void TraySortOrderModel::saveCollapsedToDConfig()
{
    if (!m_dconfig) {
        qWarning() << "DConfig is not initialized";
        return;
    }
    
    try {
        m_dconfig->setValue("isCollapsed", m_collapsed);
    } catch (const std::exception &e) {
        qWarning() << "Failed to save collapsed state:" << e.what();
    }
}

这些建议旨在提高代码的健壮性、可维护性和性能,同时保持原有功能的完整性。

@18202781743

Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

This pr force merged! (status: blocked)

@deepin-bot deepin-bot Bot merged commit f68c4f6 into linuxdeepin:master Jun 11, 2026
9 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants