浏览代码

Only create goroutines for next hour of disappearing messages

Tulir Asokan 3 年之前
父节点
当前提交
a61a3f5cf9
共有 3 个文件被更改,包括 15 次插入9 次删除
  1. 3 3
      database/disappearingmessage.go
  2. 11 5
      disappear.go
  3. 1 1
      main.go

+ 3 - 3
database/disappearingmessage.go

@@ -54,7 +54,7 @@ func (dmq *DisappearingMessageQuery) NewWithValues(roomID id.RoomID, eventID id.
 
 const (
 	getAllScheduledDisappearingMessagesQuery = `
-		SELECT room_id, event_id, expire_in, expire_at FROM disappearing_message WHERE expire_at IS NOT NULL
+		SELECT room_id, event_id, expire_in, expire_at FROM disappearing_message WHERE expire_at IS NOT NULL AND expire_at <= $1
 	`
 	startUnscheduledDisappearingMessagesInRoomQuery = `
 		UPDATE disappearing_message SET expire_at=$1+expire_in WHERE room_id=$2 AND expire_at IS NULL
@@ -62,8 +62,8 @@ const (
 	`
 )
 
-func (dmq *DisappearingMessageQuery) GetAllScheduled() (messages []*DisappearingMessage) {
-	rows, err := dmq.db.Query(getAllScheduledDisappearingMessagesQuery)
+func (dmq *DisappearingMessageQuery) GetUpcomingScheduled(duration time.Duration) (messages []*DisappearingMessage) {
+	rows, err := dmq.db.Query(getAllScheduledDisappearingMessagesQuery, time.Now().Add(duration).UnixMilli())
 	if err != nil || rows == nil {
 		return nil
 	}

+ 11 - 5
disappear.go

@@ -42,15 +42,21 @@ func (portal *Portal) ScheduleDisappearing() {
 	if !portal.bridge.Config.Bridge.DisappearingMessagesInGroups && portal.IsGroupChat() {
 		return
 	}
+	nowPlusHour := time.Now().Add(1 * time.Hour)
 	for _, msg := range portal.bridge.DB.DisappearingMessage.StartAllUnscheduledInRoom(portal.MXID) {
-		go portal.sleepAndDelete(msg)
+		if msg.ExpireAt.Before(nowPlusHour) {
+			go portal.sleepAndDelete(msg)
+		}
 	}
 }
 
-func (bridge *Bridge) RestartAllDisappearing() {
-	for _, msg := range bridge.DB.DisappearingMessage.GetAllScheduled() {
-		portal := bridge.GetPortalByMXID(msg.RoomID)
-		go portal.sleepAndDelete(msg)
+func (bridge *Bridge) DisappearingLoop() {
+	for {
+		for _, msg := range bridge.DB.DisappearingMessage.GetUpcomingScheduled(1 * time.Hour) {
+			portal := bridge.GetPortalByMXID(msg.RoomID)
+			go portal.sleepAndDelete(msg)
+		}
+		time.Sleep(1 * time.Hour)
 	}
 }
 

+ 1 - 1
main.go

@@ -333,7 +333,7 @@ func (bridge *Bridge) Start() {
 	if bridge.Config.Bridge.ResendBridgeInfo {
 		go bridge.ResendBridgeInfo()
 	}
-	go bridge.RestartAllDisappearing()
+	go bridge.DisappearingLoop()
 	bridge.AS.Ready = true
 }