diff --git a/server/mailserver/common/types.go b/server/mailserver/common/types.go index ce87938f..ea17db9a 100644 --- a/server/mailserver/common/types.go +++ b/server/mailserver/common/types.go @@ -29,7 +29,7 @@ type App interface { } type Player interface { - Lock() + Lock() bool UnLock() GetAccountId() string GetRegisterTime() int32 diff --git a/server/mailserver/middleware/caauth.go b/server/mailserver/middleware/caauth.go index c50e0b64..73320822 100644 --- a/server/mailserver/middleware/caauth.go +++ b/server/mailserver/middleware/caauth.go @@ -3,6 +3,7 @@ package middleware import ( "github.com/gin-gonic/gin" . "main/global" + "net/http" ) func CaAuth(c *gin.Context) { @@ -12,7 +13,14 @@ func CaAuth(c *gin.Context) { if hum == nil { hum = GetPlayerMgr().ForceCreatePlayer(accountId, sessionId) } - hum.Lock() + if !hum.Lock() { + c.JSON(http.StatusOK, gin.H{ + "errcode": 500, + "errmsg": "server internal error", + }) + c.Abort() + return + } c.Set("hum", hum) c.Next() hum.UnLock() diff --git a/server/mailserver/player/player.go b/server/mailserver/player/player.go index 82a3671d..686a3f18 100644 --- a/server/mailserver/player/player.go +++ b/server/mailserver/player/player.go @@ -28,11 +28,16 @@ func (this *player) init() { this.inboxHash = make(map[int64]*inbox) } -func (this *player) Lock() { +func (this *player) Lock() bool { this.lock.Lock() if !this.loaded { this.load() } + ok := this.loaded + if !ok { + this.UnLock() + } + return ok } func (this *player) UnLock() { @@ -112,10 +117,10 @@ func (this *player) checkLock() { func (this *player) load() { f5.GetGoStyleDb().RawQuery( constant.MAIL_DB, - "SELECT * FROM t_inbox WHERE account_id=? AND expiretime>?", + "SELECT * FROM t_inbox WHERE account_id=? AND expiretime