blob: 2652289a48cca35d536acfaab304c5517de4129b [file] [log] [blame]
package holder
import (
"github.com/dk-lockdown/seata-golang/logging"
"github.com/dk-lockdown/seata-golang/meta"
"github.com/dk-lockdown/seata-golang/tc/config"
"github.com/dk-lockdown/seata-golang/tc/lock"
"github.com/dk-lockdown/seata-golang/tc/session"
)
type SessionHolder struct {
RootSessionManager ISessionManager
AsyncCommittingSessionManager ISessionManager
RetryCommittingSessionManager ISessionManager
RetryRollbackingSessionManager ISessionManager
}
var sessionHolder SessionHolder
func init() {
sessionHolder = SessionHolder{
RootSessionManager: NewFileBasedSessionManager(config.GetDefaultFileStoreConfig()),
AsyncCommittingSessionManager: NewDefaultSessionManager("default"),
RetryCommittingSessionManager: NewDefaultSessionManager("default"),
RetryRollbackingSessionManager: NewDefaultSessionManager("default"),
}
sessionHolder.reload()
}
func GetSessionHolder() SessionHolder {
return sessionHolder
}
func (sessionHolder SessionHolder) FindGlobalSession(xid string) *session.GlobalSession {
return sessionHolder.FindGlobalSessionWithBranchSessions(xid, true)
}
func (sessionHolder SessionHolder) FindGlobalSessionWithBranchSessions(xid string, withBranchSessions bool) *session.GlobalSession {
return sessionHolder.RootSessionManager.FindGlobalSessionWithBranchSessions(xid, withBranchSessions)
}
func (sessionHolder SessionHolder) reload() {
sessionManager, reloadable := sessionHolder.RootSessionManager.(Reloadable)
if reloadable {
sessionManager.Reload()
reloadedSessions := sessionHolder.RootSessionManager.AllSessions()
if reloadedSessions != nil && len(reloadedSessions) > 0 {
for _,globalSession := range reloadedSessions {
switch globalSession.Status {
case meta.GlobalStatusUnknown:
case meta.GlobalStatusCommitted:
case meta.GlobalStatusCommitFailed:
case meta.GlobalStatusRollbacked:
case meta.GlobalStatusRollbackFailed:
case meta.GlobalStatusTimeoutRollbacked:
case meta.GlobalStatusTimeoutRollbackFailed:
case meta.GlobalStatusFinished:
logging.Logger.Errorf("Reloaded Session should NOT be %s",globalSession.Status.String())
break
case meta.GlobalStatusAsyncCommitting:
sessionHolder.AsyncCommittingSessionManager.AddGlobalSession(globalSession)
break
default:
branchSessions := globalSession.GetSortedBranches()
for _,branchSession := range branchSessions {
lock.GetLockManager().AcquireLock(branchSession)
}
switch globalSession.Status {
case meta.GlobalStatusCommitting:
case meta.GlobalStatusCommitRetrying:
sessionHolder.RetryCommittingSessionManager.AddGlobalSession(globalSession)
break
case meta.GlobalStatusRollbacking:
case meta.GlobalStatusRollbackRetrying:
case meta.GlobalStatusTimeoutRollbacking:
case meta.GlobalStatusTimeoutRollbackRetrying:
sessionHolder.RetryRollbackingSessionManager.AddGlobalSession(globalSession)
break
case meta.GlobalStatusBegin:
globalSession.SetActive(true)
break
default:
logging.Logger.Errorf("NOT properly handled %s",globalSession.Status)
break
}
break
}
}
}
}
}