Rollback live sessions on panic

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-07-13 08:03:12 +08:00
parent 96b7951ee1
commit ff67c554f7
5 changed files with 24 additions and 12 deletions
+2 -3
View File
@@ -12,12 +12,11 @@ import (
func gameOver(ctx *gin.Context) { func gameOver(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
defer func() { defer ss.FinalizeOrRollbackAfter(func() {
if ss.UserEng != nil { if ss.UserEng != nil {
ss.ClearLiveInProgress() ss.ClearLiveInProgress()
} }
ss.Finalize() })
}()
ss.Respond(BuildGameOverResp()) ss.Respond(BuildGameOverResp())
} }
+2 -3
View File
@@ -17,12 +17,11 @@ import (
func reward(ctx *gin.Context) { func reward(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
defer func() { defer ss.FinalizeOrRollbackAfter(func() {
if ss.UserEng != nil { if ss.UserEng != nil {
ss.ClearLiveInProgress() ss.ClearLiveInProgress()
} }
ss.Finalize() })
}()
playRewardReq := liveschema.RewardReq{} playRewardReq := liveschema.RewardReq{}
err := honokautils.ParseRequestData(ctx, &playRewardReq) err := honokautils.ParseRequestData(ctx, &playRewardReq)
+2 -3
View File
@@ -14,13 +14,12 @@ import (
func gameOver(ctx *gin.Context) { func gameOver(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
token := "" token := ""
defer func() { defer ss.FinalizeOrRollbackAfter(func() {
if ss.UserEng != nil { if ss.UserEng != nil {
deleteRandomLiveByToken(ss, token) deleteRandomLiveByToken(ss, token)
ss.ClearLiveInProgress() ss.ClearLiveInProgress()
} }
ss.Finalize() })
}()
req := rliveschema.TokenReq{} req := rliveschema.TokenReq{}
err := honokautils.ParseRequestData(ctx, &req) err := honokautils.ParseRequestData(ctx, &req)
+2 -3
View File
@@ -15,13 +15,12 @@ import (
func reward(ctx *gin.Context) { func reward(ctx *gin.Context) {
ss := session.Get(ctx) ss := session.Get(ctx)
token := "" token := ""
defer func() { defer ss.FinalizeOrRollbackAfter(func() {
if ss.UserEng != nil { if ss.UserEng != nil {
deleteRandomLiveByToken(ss, token) deleteRandomLiveByToken(ss, token)
ss.ClearLiveInProgress() ss.ClearLiveInProgress()
} }
ss.Finalize() })
}()
req := rliveschema.RewardReq{} req := rliveschema.RewardReq{}
err := honokautils.ParseRequestData(ctx, &req) err := honokautils.ParseRequestData(ctx, &req)
+16
View File
@@ -130,6 +130,22 @@ func (ss *Session) FinalizeOrRollback() {
ss.Finalize() ss.Finalize()
} }
// FinalizeOrRollbackAfter runs cleanup only on the normal completion path.
func (ss *Session) FinalizeOrRollbackAfter(cleanup func()) {
defer func() {
if recovered := recover(); recovered != nil {
ss.Rollback()
panic(recovered)
}
}()
if ss.done {
return
}
cleanup()
ss.Finalize()
}
func (ss *Session) Rollback() { func (ss *Session) Rollback() {
if ss.done { if ss.done {
return return