Bläddra i källkod

feat(config): parse persistence.snapshots and persistence.recovery sections

New config surface:
  persistence:
    snapshots:
      validate_after_write: true
      cleanup_only_if_verified: true
    recovery:
      mode: 'normal' | 'snapshot_fallback' | 'wal_only' | 'best_effort' | 'force_empty'
      auto_escalate: true
      allow_empty_on_fresh_install: true

All fields default to the safe choice, so existing config files continue to
work unchanged.
fszontagh 3 månader sedan
förälder
incheckning
8c0347f088
2 ändrade filer med 32 tillägg och 1 borttagningar
  1. 10 1
      packaging/deb/config/config.json
  2. 22 0
      service/src/database_service.cpp

+ 10 - 1
packaging/deb/config/config.json

@@ -14,7 +14,16 @@
     "persistence": {
       "wal_sync_interval_ms": 100,
       "snapshot_interval_sec": 3600,
-      "compression": "lz4"
+      "compression": "lz4",
+      "snapshots": {
+        "validate_after_write": true,
+        "cleanup_only_if_verified": true
+      },
+      "recovery": {
+        "mode": "normal",
+        "auto_escalate": true,
+        "allow_empty_on_fresh_install": true
+      }
     },
     "encryption": {
       "enabled": true,

+ 22 - 0
service/src/database_service.cpp

@@ -340,6 +340,28 @@ DatabaseService::Config DatabaseService::loadConfig(const std::filesystem::path&
             config.walSyncIntervalMs = persistence.value("wal_sync_interval_ms", config.walSyncIntervalMs);
             config.snapshotIntervalSec = persistence.value("snapshot_interval_sec", config.snapshotIntervalSec);
             config.compressionEnabled = persistence.value("compression", "lz4") != "none";
+
+            // Snapshot durability (NEW in v1.6.1)
+            if (persistence.contains("snapshots")) {
+                const auto& snap = persistence["snapshots"];
+                config.persistenceConfig.validateAfterWrite = snap.value("validate_after_write", config.persistenceConfig.validateAfterWrite);
+                config.persistenceConfig.cleanupOnlyIfVerified = snap.value("cleanup_only_if_verified", config.persistenceConfig.cleanupOnlyIfVerified);
+            }
+
+            // Recovery (NEW in v1.6.1)
+            if (persistence.contains("recovery")) {
+                const auto& rec = persistence["recovery"];
+                std::string modeStr = rec.value("mode", std::string("normal"));
+                try {
+                    config.persistenceConfig.recoveryMode = recoveryModeFromString(modeStr);
+                } catch (const std::exception& e) {
+                    spdlog::warn("Invalid recovery.mode '{}', defaulting to 'normal': {}",
+                                 modeStr, e.what());
+                    config.persistenceConfig.recoveryMode = RecoveryMode::Normal;
+                }
+                config.persistenceConfig.autoEscalate = rec.value("auto_escalate", config.persistenceConfig.autoEscalate);
+                config.persistenceConfig.allowEmptyOnFreshInstall = rec.value("allow_empty_on_fresh_install", config.persistenceConfig.allowEmptyOnFreshInstall);
+            }
         }
 
         // File settings