diff --git a/internal/cluster/raft_coordinator.go b/internal/cluster/raft_coordinator.go index 2188556..fd66f8a 100644 --- a/internal/cluster/raft_coordinator.go +++ b/internal/cluster/raft_coordinator.go @@ -58,6 +58,11 @@ // Все публичные методы *cluster.SagaManager (GetOrchestrator, // GetMetrics, GetActiveSagas, Stop) сохранены — они используются // в repl.go и main.go. +// +// ДОБАВЛЕНО (2026-10, кластерный SagaManager): +// - Метод GetAllSagas() у *SagaManager — возвращает все SAGA +// транзакции (активные и завершённые). Используется REPL-командой +// "saga list --all". Возвращает локальный тип cluster.SagaTransaction. package cluster @@ -828,7 +833,6 @@ func (rsm *RangeShardManager) Rebalance() error { return nil } - // ============================================================================= // INMEM STORE ДЛЯ RAFT (реализует raft.LogStore и raft.StableStore) // ============================================================================= @@ -1551,6 +1555,26 @@ func (sm *SagaManager) GetActiveSagas() []*SagaTransaction { return result } +// GetAllSagas возвращает все SAGA транзакции — и активные, и завершённые. +// +// ДОБАВЛЕНО (2026-10): используется REPL-командой "saga list --all". +// В кластерной версии SAGA-менеджер хранит все транзакции в sync.Map +// (sm.sagas). Реплики и завершённые SAGA не удаляются — sync.Map +// накапливает их в течение жизни процесса. Это позволяет отдавать +// полный список без обращения к диску. +func (sm *SagaManager) GetAllSagas() []*SagaTransaction { + result := make([]*SagaTransaction, 0) + sm.sagas.Range(func(key, value interface{}) bool { + saga, ok := value.(*SagaTransaction) + if !ok || saga == nil { + return true + } + result = append(result, saga) + return true + }) + return result +} + // Stop останавливает Saga-менеджер. // Реализован, чтобы main.go мог вызвать sagaManager.Stop() единообразно // как для storage.SagaOrchestrator, так и для cluster.SagaManager. @@ -1963,7 +1987,6 @@ func (sbd *SplitBrainDetector) IsQuarantined(nodeID string) bool { } return false } - // ============================================================================= // RECOVERY MANAGER - ПЕРЕИМЕНОВАН В ClusterNodeState ДЛЯ ИЗБЕЖАНИЯ КОНФЛИКТА // ============================================================================= @@ -3134,7 +3157,6 @@ func (lfm *LeaderFallbackManager) Stop() { close(lfm.stopChan) lfm.wg.Wait() } - // ============================================================================= // RAFT CLUSTER STATE // ============================================================================= @@ -4405,4 +4427,4 @@ type ClusterStatus struct { } // Гарантируем, что runtime импортирован для кроссплатформенности -var _ = runtime.GOOS +var _ = runtime.GOOS \ No newline at end of file