Skip to content

Commit e85baee

Browse files
committed
refactor: optimize expired notification cleanup implementation
Changed the expired notification cleanup mechanism from fetching and processing expired entities to directly deleting them from storage. The previous implementation used fetchExpiredEntities to get expired notifications and then closed them individually, which was inefficient for large datasets. The new approach adds removeEntitiesByExpiredTime method that directly deletes expired records from database and memory storage, improving performance by eliminating unnecessary data retrieval and processing. Added trigger to automatically clean expired notifications when notification center becomes visible, ensuring users always see current notifications without expired ones cluttering the interface. This on- demand cleanup approach is more efficient than the previous timer-based periodic cleanup. Log: Optimized notification cleanup to remove expired notifications when opening notification center Influence: 1. Test opening notification center to verify expired notifications are automatically removed 2. Verify notification count displays correctly after cleanup 3. Test notification persistence for non-expired notifications 4. Check database storage efficiency after implementing direct deletion 5. Verify memory usage improvement with the optimized cleanup approach 6. Test notification center performance with large number of notifications refactor: 优化过期通知清理实现 将过期通知清理机制从获取和处理过期实体改为直接从存储中删除。之前的实现使 用 fetchExpiredEntities 获取过期通知然后逐个关闭,对于大数据集效率低下。 新方法添加了 removeEntitiesByExpiredTime 方法,直接从数据库和内存存储中 删除过期记录,通过消除不必要的数据检索和处理来提高性能。 添加了在通知中心变为可见时自动清理过期通知的触发器,确保用户始终看到当前 通知而不会被过期通知干扰界面。这种按需清理方法比之前的基于定时器的定期清 理更高效。 Log: 优化通知清理功能,在打开通知中心时自动移除过期通知 Influence: 1. 测试打开通知中心验证过期通知是否自动移除 2. 验证清理后通知计数显示是否正确 3. 测试非过期通知的持久化存储 4. 检查实现直接删除后的数据库存储效率 5. 验证优化清理方法后的内存使用改进 6. 测试通知中心在大量通知情况下的性能表现
1 parent adde632 commit e85baee

File tree

12 files changed

+67
-71
lines changed

12 files changed

+67
-71
lines changed

panels/notification/center/notificationcenterpanel.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ void NotificationCenterPanel::setVisible(bool newVisible)
102102
if (m_visible == newVisible)
103103
return;
104104
m_visible = newVisible;
105+
if (m_visible) {
106+
qDebug(notifyLog) << "Try to remove expired notifications.";
107+
DAppletBridge bridge("org.deepin.ds.notificationserver");
108+
if (auto applet = bridge.applet()) {
109+
QMetaObject::invokeMethod(applet, "removeExpiredNotifications", Qt::DirectConnection);
110+
}
111+
}
105112
notifycenter::NotifyAccessor::instance()->setEnabled(m_visible);
106113
setBubblePanelEnabled(!m_visible);
107114
emit visibleChanged();

panels/notification/common/dataaccessor.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ class DataAccessor
3434
virtual NotifyEntity fetchEntity(qint64 id) { Q_UNUSED(id); return {}; }
3535
virtual int fetchEntityCount(const QString &appName, int processedType) const { Q_UNUSED(appName); Q_UNUSED(processedType); return 0; }
3636
virtual NotifyEntity fetchLastEntity(const QString &appName, int processedType) { Q_UNUSED(appName); Q_UNUSED(processedType); return {}; }
37-
virtual NotifyEntity fetchLastEntity(uint notifyId) { Q_UNUSED(notifyId); return {}; }
38-
virtual QList<NotifyEntity> fetchExpiredEntities(qint64 expiredTime) { Q_UNUSED(expiredTime); return {}; }
37+
virtual NotifyEntity fetchLastEntity(uint notifyId)
38+
{
39+
Q_UNUSED(notifyId);
40+
return {};
41+
}
3942
virtual QList<NotifyEntity> fetchEntities(const QString &appName, int processedType, int maxCount)
4043
{
4144
Q_UNUSED(appName)
@@ -47,6 +50,10 @@ class DataAccessor
4750

4851
virtual void removeEntity(qint64 id) { Q_UNUSED(id); }
4952
virtual void removeEntityByApp(const QString &appName) { Q_UNUSED(appName); }
53+
virtual void removeEntitiesByExpiredTime(qint64 expiredTime)
54+
{
55+
Q_UNUSED(expiredTime);
56+
}
5057
virtual void clear() {}
5158
inline static QString AllApp()
5259
{

panels/notification/common/dataaccessorproxy.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,6 @@ NotifyEntity DataAccessorProxy::fetchLastEntity(uint notifyId)
116116
return m_source->fetchLastEntity(notifyId);
117117
}
118118

119-
QList<NotifyEntity> DataAccessorProxy::fetchExpiredEntities(qint64 expiredTime)
120-
{
121-
return m_source->fetchExpiredEntities(expiredTime);
122-
}
123-
124119
QList<NotifyEntity> DataAccessorProxy::fetchEntities(const QString &appName, int processedType, int maxCount)
125120
{
126121
if (processedType == NotifyEntity::NotProcessed) {
@@ -149,6 +144,11 @@ void DataAccessorProxy::removeEntityByApp(const QString &appName)
149144
m_source->removeEntityByApp(appName);
150145
}
151146

147+
void DataAccessorProxy::removeEntitiesByExpiredTime(qint64 expiredTime)
148+
{
149+
m_source->removeEntitiesByExpiredTime(expiredTime);
150+
}
151+
152152
void DataAccessorProxy::clear()
153153
{
154154
m_source->clear();

panels/notification/common/dataaccessorproxy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ class DataAccessorProxy : public DataAccessor
3131
virtual int fetchEntityCount(const QString &appName, int processedType) const override;
3232
virtual NotifyEntity fetchLastEntity(const QString &appName, int processedType) override;
3333
virtual NotifyEntity fetchLastEntity(uint notifyId) override;
34-
virtual QList<NotifyEntity> fetchExpiredEntities(qint64 expiredTime) override;
3534
virtual QList<NotifyEntity> fetchEntities(const QString &appName, int processedType, int maxCount) override;
3635
virtual QList<QString> fetchApps(int maxCount) const override;
3736

3837
virtual void removeEntity(qint64 id) override;
3938
virtual void removeEntityByApp(const QString &appName) override;
39+
virtual void removeEntitiesByExpiredTime(qint64 expiredTime) override;
4040
virtual void clear() override;
4141

4242
private:

panels/notification/common/dbaccessor.cpp

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -443,32 +443,6 @@ NotifyEntity DBAccessor::fetchLastEntity(uint notifyId)
443443
return {};
444444
}
445445

446-
QList<NotifyEntity> DBAccessor::fetchExpiredEntities(qint64 expiredTime)
447-
{
448-
BENCHMARK();
449-
450-
QMutexLocker locker(&m_mutex);
451-
QSqlQuery query(m_connection);
452-
453-
QString cmd = QString("SELECT %1 FROM notifications2 WHERE CTime < :expiredTime ORDER BY CTime ASC").arg(EntityFields.join(","));
454-
query.prepare(cmd);
455-
query.bindValue(":expiredTime", expiredTime);
456-
457-
if (!query.exec()) {
458-
qWarning(notifyDBLog) << "Query execution error:" << query.lastError().text();
459-
return {};
460-
}
461-
462-
QList<NotifyEntity> expiredEntities;
463-
while (query.next()) {
464-
auto entity = parseEntity(query);
465-
if (entity.isValid()) {
466-
expiredEntities.append(entity);
467-
}
468-
}
469-
return expiredEntities;
470-
}
471-
472446
QList<QString> DBAccessor::fetchApps(int maxCount) const
473447
{
474448
BENCHMARK();
@@ -538,6 +512,25 @@ void DBAccessor::removeEntityByApp(const QString &appName)
538512
qDebug(notifyDBLog) << "Delete notify count" << query.numRowsAffected();
539513
}
540514

515+
void DBAccessor::removeEntitiesByExpiredTime(qint64 expiredTime)
516+
{
517+
BENCHMARK();
518+
519+
QMutexLocker locker(&m_mutex);
520+
QSqlQuery query(m_connection);
521+
522+
QString cmd("DELETE FROM notifications2 WHERE CTime < :expiredTime");
523+
query.prepare(cmd);
524+
query.bindValue(":expiredTime", expiredTime);
525+
526+
if (!query.exec()) {
527+
qWarning(notifyDBLog) << "Query execution error:" << query.lastError().text();
528+
return;
529+
}
530+
531+
qDebug(notifyDBLog) << "Delete notify count" << query.numRowsAffected();
532+
}
533+
541534
void DBAccessor::clear()
542535
{
543536
BENCHMARK();

panels/notification/common/dbaccessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ class DBAccessor : public DataAccessor
3737
NotifyEntity fetchLastEntity(const QString &appName, int processedType) override;
3838
QList<NotifyEntity> fetchEntities(const QString &appName, int processedType, int maxCount) override;
3939
NotifyEntity fetchLastEntity(uint notifyId) override;
40-
QList<NotifyEntity> fetchExpiredEntities(qint64 expiredTime) override;
4140
QList<QString> fetchApps(int maxCount) const override;
4241

4342
void removeEntity(qint64 id) override;
4443
void removeEntityByApp(const QString &appName) override;
44+
void removeEntitiesByExpiredTime(qint64 expiredTime) override;
4545
void clear() override;
4646

4747
private:

panels/notification/common/memoryaccessor.cpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,6 @@ NotifyEntity MemoryAccessor::fetchLastEntity(uint notifyId)
103103
return {};
104104
}
105105

106-
QList<NotifyEntity> MemoryAccessor::fetchExpiredEntities(qint64 expiredTime)
107-
{
108-
QMutexLocker locker(&m_mutex);
109-
QList<NotifyEntity> expiredEntities;
110-
111-
for (const auto &entity : m_entities) {
112-
if (entity.cTime() < expiredTime) {
113-
expiredEntities.append(entity);
114-
}
115-
}
116-
117-
std::sort(expiredEntities.begin(), expiredEntities.end(), [](const NotifyEntity &a, const NotifyEntity &b) {
118-
return a.cTime() < b.cTime();
119-
});
120-
121-
return expiredEntities;
122-
}
123-
124106
QList<NotifyEntity> MemoryAccessor::fetchEntities(const QString &appName, int processedType, int maxCount)
125107
{
126108
QMutexLocker locker(&m_mutex);
@@ -165,6 +147,14 @@ void MemoryAccessor::removeEntityByApp(const QString &appName)
165147
});
166148
}
167149

150+
void MemoryAccessor::removeEntitiesByExpiredTime(qint64 expiredTime)
151+
{
152+
QMutexLocker locker(&m_mutex);
153+
m_entities.removeIf([expiredTime](const NotifyEntity &entity) {
154+
return entity.cTime() < expiredTime;
155+
});
156+
}
157+
168158
void MemoryAccessor::clear()
169159
{
170160
QMutexLocker locker(&m_mutex);

panels/notification/common/memoryaccessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ class MemoryAccessor : public DataAccessor
2727
virtual int fetchEntityCount(const QString &appName, int processedType) const override;
2828
virtual NotifyEntity fetchLastEntity(const QString &appName, int processedType) override;
2929
virtual NotifyEntity fetchLastEntity(uint notifyId) override;
30-
virtual QList<NotifyEntity> fetchExpiredEntities(qint64 expiredTime) override;
3130
virtual QList<NotifyEntity> fetchEntities(const QString &appName, int processedType, int maxCount) override;
3231
virtual QList<QString> fetchApps(int maxCount) const override;
3332

3433
virtual void removeEntity(qint64 id) override;
3534
virtual void removeEntityByApp(const QString &appName) override;
35+
virtual void removeEntitiesByExpiredTime(qint64 expiredTime) override;
3636
virtual void clear() override;
3737

3838
private:

panels/notification/server/notificationmanager.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,9 @@ NotificationManager::NotificationManager(QObject *parent)
4949
, m_persistence(DataAccessorProxy::instance())
5050
, m_setting(new NotificationSetting(this))
5151
, m_pendingTimeout(new QTimer(this))
52-
, m_cleanupTimer(new QTimer(this))
5352
{
5453
m_pendingTimeout->setSingleShot(true);
5554
connect(m_pendingTimeout, &QTimer::timeout, this, &NotificationManager::onHandingPendingEntities);
56-
57-
m_cleanupTimer->setInterval(1000);
58-
connect(m_cleanupTimer, &QTimer::timeout, this, &NotificationManager::onCleanupExpiredNotifications);
59-
m_cleanupTimer->start();
6055

6156
DataAccessorProxy::instance()->setSource(DBAccessor::instance());
6257

@@ -175,6 +170,15 @@ void NotificationManager::removeNotifications()
175170
emitRecordCountChanged();
176171
}
177172

173+
void NotificationManager::removeExpiredNotifications()
174+
{
175+
qDebug(notifyLog) << "Remove expired notifications.";
176+
const qint64 cutoffTime = QDateTime::currentDateTime().addDays(-m_cleanupDays).toMSecsSinceEpoch();
177+
m_persistence->removeEntitiesByExpiredTime(cutoffTime);
178+
179+
emitRecordCountChanged();
180+
}
181+
178182
QStringList NotificationManager::GetCapabilities()
179183
{
180184
QStringList result;
@@ -684,14 +688,4 @@ void NotificationManager::onScreenLockedChanged(bool screenLocked)
684688
m_screenLocked = screenLocked;
685689
}
686690

687-
void NotificationManager::onCleanupExpiredNotifications()
688-
{
689-
const qint64 cutoffTime = QDateTime::currentDateTime().addDays(-m_cleanupDays).toMSecsSinceEpoch();
690-
auto expiredEntities = m_persistence->fetchExpiredEntities(cutoffTime);
691-
692-
for (const auto &entity : expiredEntities) {
693-
notificationClosed(entity.id(), entity.bubbleId(), NotifyEntity::Timeout);
694-
}
695-
}
696-
697691
} // notification

panels/notification/server/notificationmanager.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class NotificationManager : public QObject, public QDBusContext
3434
void removeNotification(qint64 id);
3535
void removeNotifications(const QString &appName);
3636
void removeNotifications();
37+
void removeExpiredNotifications();
3738

3839
Q_SIGNALS:
3940
// Standard Notifications dbus implementation
@@ -83,7 +84,6 @@ private slots:
8384
void onHandingPendingEntities();
8485
void removePendingEntity(const NotifyEntity &entity);
8586
void onScreenLockedChanged(bool);
86-
void onCleanupExpiredNotifications();
8787

8888
private:
8989
uint m_replacesCount = 0;
@@ -92,7 +92,6 @@ private slots:
9292
DataAccessor *m_persistence = nullptr;
9393
NotificationSetting *m_setting = nullptr;
9494
QTimer *m_pendingTimeout = nullptr;
95-
QTimer *m_cleanupTimer = nullptr;
9695
qint64 m_lastTimeoutPoint = std::numeric_limits<qint64>::max();
9796
QMultiHash<qint64, NotifyEntity> m_pendingTimeoutEntities;
9897
QStringList m_systemApps;

0 commit comments

Comments
 (0)