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 } } } } }