From fc976dbba8393b57282517082e4378bcf3cf5f96 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Mon, 16 Mar 2026 23:17:14 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20ResetRoom=20=EC=8B=9C=20BossRoom=20?= =?UTF-8?q?=EB=A0=88=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 데디서버가 reset-room 호출 시 슬롯만 idle로 변경하고 BossRoom 레코드는 남아있어서 다음 입장 시 unique 제약 위반(Duplicate entry) 발생. ResetRoom에서 해당 sessionName의 BossRoom 레코드도 함께 삭제. Co-Authored-By: Claude Opus 4.6 (1M context) --- internal/bossraid/repository.go | 6 ++++++ internal/bossraid/service.go | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/internal/bossraid/repository.go b/internal/bossraid/repository.go index 5369411..f05e919 100644 --- a/internal/bossraid/repository.go +++ b/internal/bossraid/repository.go @@ -206,6 +206,12 @@ func (r *Repository) ResetRoomSlot(sessionName string) error { return result.Error } +// DeleteRoomBySessionName removes BossRoom records for a given session name. +// Used during ResetRoom to prevent duplicate session_name conflicts on next entry. +func (r *Repository) DeleteRoomBySessionName(sessionName string) error { + return r.db.Where("session_name = ?", sessionName).Delete(&BossRoom{}).Error +} + // ResetStaleSlots clears instanceID for slots with stale heartbeats // and resets any active raids on those slots. func (r *Repository) ResetStaleSlots(threshold time.Time) (int64, error) { diff --git a/internal/bossraid/service.go b/internal/bossraid/service.go index bd25236..aec9c35 100644 --- a/internal/bossraid/service.go +++ b/internal/bossraid/service.go @@ -473,9 +473,13 @@ func (s *Service) CheckStaleSlots() { } } -// ResetRoom resets a room slot back to idle. +// ResetRoom resets a room slot back to idle and cleans up any lingering BossRoom records. // Called by the dedicated server after a raid ends and the runner is recycled. func (s *Service) ResetRoom(sessionName string) error { + // 완료/실패되지 않은 BossRoom 레코드 정리 (waiting/in_progress 상태) + if err := s.repo.DeleteRoomBySessionName(sessionName); err != nil { + log.Printf("BossRoom 레코드 정리 실패: %s: %v", sessionName, err) + } return s.repo.ResetRoomSlot(sessionName) }