Skip to content

🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних

Дата виявлення: 2025-12-05

Симптоми

  • Дані (MicroDAO, агенти) періодично зникають
  • "MicroDAO не знайдено"
  • "Агенти не знайдені" (0 агентів)
  • Це відбувалось щодня

Коренева причина

НЕСКІНЧЕННИЙ ЦИКЛ DROP DATABASE:

  1. monitor-db-stability.sh (cron кожні 5 хвилин) перевіряв:
  2. Якщо агентів < 50 → DROP DATABASE і відновити з бекапу

  3. Проблема: Бекап від 2025-12-02 НЕ МАВ NODE2 агентів (50 агентів)

  4. Після відновлення з бекапу: лише 9 MicroDAO, 9 core агентів

  5. Monitor знову бачив < 50 агентів → знову DROP → НЕСКІНЧЕННИЙ ЦИКЛ!

┌─────────────────────────────────────────────────────────────────┐
│  Monitor бачить: Agents=9 (< 50)                                │
│  ↓                                                              │
│  DROP DATABASE daarion                                          │
│  ↓                                                              │
│  Restore from backup (без NODE2 агентів)                        │
│  ↓                                                              │
│  Agents=9 знову                                                 │
│  ↓                                                              │
│  Monitor бачить: Agents=9 (< 50) → ЦИКЛ ПОВТОРЮЄТЬСЯ            │
└─────────────────────────────────────────────────────────────────┘

Виправлення

1. Змінено логіку monitor-db-stability.sh

Старе (ПОМИЛКОВЕ):

# Якщо агентів < 50 → DROP DATABASE
if [ "$AGENT_COUNT" -lt 50 ]; then
  DROP DATABASE
  RESTORE FROM BACKUP
fi

Нове (ПРАВИЛЬНЕ):

# CASE 1: CRITICAL - MicroDAOs missing → FULL RECOVERY (DROP)
if [ "$MICRODAO_COUNT" -lt 5 ]; then
  DROP DATABASE
  RESTORE FROM BACKUP

# CASE 2: SOFT - MicroDAOs exist but agents missing → just sync agents (NO DROP!)
elif [ "$NODE2_AGENT_COUNT" -lt 45 ]; then
  # NO DROP DATABASE!
  python3 sync-node2-dagi-agents.py
fi

2. Створено новий бекап з NODE2 агентами

full_backup_with_node2_2025-12-05_02-41.sql  # 183KB з 59 агентами
pre_migration_2025-12-02_02-00.sql           # 162KB без NODE2 агентів

3. Пріоритет бекапів

Monitor тепер спочатку шукає full_backup_with_node2*.sql, потім інші.

Два режими відновлення

Ситуація Режим Дія
MicroDAOs < 5 🔴 FULL RECOVERY DROP DATABASE + restore + sync
MicroDAOs ≥ 5, NODE2 < 45 🟡 SOFT RECOVERY Тільки sync NODE2 агентів (NO DROP!)
Все в нормі ✅ OK Нічого не робити

Перевірка

# Поточний стан
docker exec daarion-postgres psql -U postgres -d daarion -c "
SELECT 
  (SELECT COUNT(*) FROM microdaos) as microdaos,
  (SELECT COUNT(*) FROM agents) as agents,
  (SELECT COUNT(*) FROM agents WHERE node_id = 'node-2-macbook-m4max') as node2_agents;
"

# Очікуваний результат:
# microdaos | agents | node2_agents
# ----------+--------+--------------
#         9 |     59 |           50

Логи monitor

# Перевірити що monitor не робить DROP
tail -50 /var/log/db-stability-monitor.log

# Має показувати:
# ✅ Data integrity OK
# АБО
# 🟡 WARNING: NODE2 agents missing. Starting SOFT RECOVERY (no DROP)...

Cron jobs

crontab -l
# */5 * * * * /opt/microdao-daarion/scripts/monitor-db-stability.sh
# */30 * * * * /opt/microdao-daarion/scripts/db-health-check.sh

Файли, що були змінені

  • scripts/monitor-db-stability.sh - головний фікс
  • db_backups/full_backup_with_node2_*.sql - новий бекап

Статус: ✅ ВИРІШЕНО

Проблема виникала через логічну помилку в monitor-db-stability.sh. Виправлено розділенням на два режими: FULL та SOFT recovery. Тепер DROP DATABASE відбувається тільки при критичній втраті MicroDAOs.