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