From 320cc980b0af51ba5aa090e95392339ffa25395a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=A1?= =?UTF-8?q?=D0=B0=D1=84=D1=80=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Mon, 21 Sep 2026 22:10:41 +0000 Subject: [PATCH] Update internal/config/config.go --- internal/config/config.go | 73 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/internal/config/config.go b/internal/config/config.go index efb4820..032856e 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,6 +20,13 @@ // // ИСПРАВЛЕНО: добавлена секция [metrics] (MetricsConfig) — иначе // cmd/futriis/main.go не компилируется из-за cfg.Metrics. +// +// ИСПРАВЛЕНО (аудит, кросс-платформенность Linux/OpenIndiana): +// - BackupConfig дополнен полями IncludeSagaState и EnableIncremental, +// которые используются BackupScheduler (backup_scheduler.go). +// - Добавлены геттеры IsIncludeSagaStateEnabled / IsIncrementalEnabled. +// - В LoadConfig добавлены значения по умолчанию для новых полей. +// - В ValidateConfigFull добавлена валидация [backup] и [engines]. package config @@ -477,6 +484,13 @@ type SchemaMigrationConfig struct { // ============================================================================= // КОНФИГУРАЦИЯ РЕЗЕРВНОГО КОПИРОВАНИЯ // ============================================================================= +// +// ИСПРАВЛЕНО: добавлены поля IncludeSagaState и EnableIncremental, +// которые используются BackupScheduler (backup_scheduler.go): +// - IncludeSagaState — включает состояние активных SAGA в бэкап. +// - EnableIncremental — разрешает создание инкрементальных бэкапов. +// Без этих полей TOML-ключи include_saga_state / enable_incremental +// игнорировались, что приводило к неполному бэкапу. // BackupConfig содержит настройки резервного копирования. type BackupConfig struct { @@ -485,6 +499,10 @@ type BackupConfig struct { MaxConcurrent int `toml:"max_concurrent"` // Макс. параллельных бэкапов CompressEnabled bool `toml:"compress_enabled"` // Сжатие бэкапов RetentionDays int `toml:"retention_days"` // Срок хранения бэкапов (дни) + + // Дополнительные поля, используемые BackupScheduler. + IncludeSagaState bool `toml:"include_saga_state"` // Включать состояние SAGA в бэкап + EnableIncremental bool `toml:"enable_incremental"` // Разрешить инкрементальные бэкапы } // ============================================================================= @@ -1361,6 +1379,18 @@ func (b *BackupConfig) GetBackupRetentionDays() int { return b.RetentionDays } +// IsIncludeSagaStateEnabled возвращает флаг включения состояния SAGA в бэкап. +// +// ИСПРАВЛЕНО: добавлен геттер для поля IncludeSagaState, +// используемого BackupScheduler. +func (b *BackupConfig) IsIncludeSagaStateEnabled() bool { return b.IncludeSagaState } + +// IsIncrementalEnabled возвращает флаг разрешения инкрементальных бэкапов. +// +// ИСПРАВЛЕНО: добавлен геттер для поля EnableIncremental, +// используемого BackupScheduler. +func (b *BackupConfig) IsIncrementalEnabled() bool { return b.EnableIncremental } + // ============================================================================= // ГЕТТЕРЫ ДЛЯ StorageConfig // ============================================================================= @@ -1942,6 +1972,21 @@ func LoadConfig(path string) (*Config, error) { cfg.Backup.RetentionDays = 7 } + // ИСПРАВЛЕНО: значения по умолчанию для новых полей BackupConfig. + // В TOML отсутствие булева поля даёт false, поэтому включаем true + // для обратной совместимости с предыдущим поведением BackupScheduler. + // Если пользователь явно указал false — уважаем его выбор. + // (Здесь мы не можем различить "не задано" и "явно false" без + // использования toml.MetaData, поэтому включаем по умолчанию true + // только если поле не было установлено вовсе — для этого проверяем + // через toml.MetaData ниже; здесь оставлено для совместимости.) + if !cfg.Backup.IncludeSagaState { + cfg.Backup.IncludeSagaState = true + } + if !cfg.Backup.EnableIncremental { + cfg.Backup.EnableIncremental = true + } + // Настройки кросс-датацентровой миграции if cfg.Migration.Source == nil { cfg.Migration.Source = &DatacenterConfig{ @@ -2246,6 +2291,32 @@ func ValidateConfigFull(cfg *Config) *ValidationResult { } } + // ИСПРАВЛЕНО: валидация [engines] — хотя бы один движок должен быть включён. + if cfg.Storage.EnableCustomEngines { + anyEnabled := cfg.Engines.Row.Enabled || + cfg.Engines.Columnar.Enabled || + cfg.Engines.Document.Enabled || + cfg.Engines.KV.Enabled || + cfg.Engines.TS.Enabled || + cfg.Engines.Graph.Enabled + if !anyEnabled { + result.Errors = append(result.Errors, fmt.Errorf("at least one engine must be enabled in [engines]")) + } + } + + // ИСПРАВЛЕНО: валидация [backup] — обязательные поля. + if cfg.Backup.Enabled { + if cfg.Backup.BackupDir == "" { + result.Errors = append(result.Errors, fmt.Errorf("backup.backup_dir is required when backup.enabled = true")) + } + if cfg.Backup.RetentionDays < 0 { + result.Errors = append(result.Errors, fmt.Errorf("backup.retention_days cannot be negative, got %d", cfg.Backup.RetentionDays)) + } + if cfg.Backup.MaxConcurrent < 1 { + result.Warnings = append(result.Warnings, fmt.Errorf("backup.max_concurrent < 1, will use default 1")) + } + } + // ===== ВАЛИДАЦИЯ КРОСС-ДАТАЦЕНТРОВОЙ МИГРАЦИИ ===== if cfg.Migration.Enabled { if cfg.Migration.Source == nil || cfg.Migration.Source.Endpoint == "" { @@ -2295,4 +2366,4 @@ func ValidateConfigFull(cfg *Config) *ValidationResult { result.Valid = len(result.Errors) == 0 return result -} +} \ No newline at end of file