Rollback live sessions on panic
Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
@@ -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())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user