{"version": 3, "term": {"cols": 120, "rows": 42}, "timestamp": 1793680112, "idle_time_limit": 2.0, "title": "harvey: VM DR with NetApp SnapMirror"}
[0.028, "o", "\u001b[1;36m# Inside the VM a service appends a UTC timestamp every 5 s to all three disks\u001b[0m\r\n"]
[1.012, "o", "\u001b[1;32m$\u001b[0m v"]
[0.040, "o", "i"]
[0.034, "o", "r"]
[0.038, "o", "t"]
[0.039, "o", "c"]
[0.036, "o", "t"]
[0.040, "o", "l"]
[0.041, "o", " "]
[0.045, "o", "s"]
[0.041, "o", "s"]
[0.040, "o", "h"]
[0.036, "o", " "]
[0.036, "o", "s"]
[0.037, "o", "l"]
[0.034, "o", "e"]
[0.037, "o", "s"]
[0.041, "o", "@"]
[0.039, "o", "v"]
[0.041, "o", "m"]
[0.044, "o", "/"]
[0.037, "o", "d"]
[0.041, "o", "r"]
[0.044, "o", "-"]
[0.051, "o", "d"]
[0.034, "o", "e"]
[0.041, "o", "m"]
[0.043, "o", "o"]
[0.041, "o", "-"]
[0.040, "o", "1"]
[0.043, "o", " "]
[0.038, "o", "("]
[0.040, "o", "p"]
[0.036, "o", "r"]
[0.041, "o", "i"]
[0.036, "o", "m"]
[0.043, "o", "a"]
[0.037, "o", "r"]
[0.038, "o", "y"]
[0.037, "o", ")"]
[0.035, "o", " "]
[0.042, "o", "-"]
[0.042, "o", "-"]
[0.044, "o", " "]
[0.043, "o", "t"]
[0.037, "o", "a"]
[0.043, "o", "i"]
[0.037, "o", "l"]
[0.038, "o", " "]
[0.036, "o", "-"]
[0.036, "o", "n"]
[0.036, "o", "1"]
[0.032, "o", " "]
[0.034, "o", "/"]
[0.035, "o", "m"]
[0.037, "o", "n"]
[0.035, "o", "t"]
[0.044, "o", "/"]
[0.039, "o", "*"]
[0.042, "o", "/"]
[0.038, "o", "m"]
[0.029, "o", "a"]
[0.033, "o", "r"]
[0.032, "o", "k"]
[0.034, "o", "e"]
[0.030, "o", "r"]
[0.030, "o", "\r\n"]
[4.625, "o", "2026-11-03T04:28:37Z dr-demo-1\r\n2026-11-03T04:28:37Z dr-demo-1\r\n2026-11-03T04:28:37Z dr-demo-1\r\n\r\n"]
[2.020, "o", "\u001b[1;36m# Planned failover: sync metadata, stop, final SnapMirror update, promote, start on DR\u001b[0m\r\n"]
[1.012, "o", "\u001b[1;32m$\u001b[0m h"]
[0.038, "o", "a"]
[0.032, "o", "r"]
[0.033, "o", "v"]
[0.035, "o", "e"]
[0.032, "o", "y"]
[0.032, "o", " "]
[0.035, "o", "f"]
[0.028, "o", "a"]
[0.036, "o", "i"]
[0.034, "o", "l"]
[0.031, "o", "o"]
[0.038, "o", "v"]
[0.033, "o", "e"]
[0.033, "o", "r"]
[0.036, "o", " "]
[0.033, "o", "v"]
[0.038, "o", "m"]
[0.034, "o", " "]
[0.034, "o", "d"]
[0.037, "o", "r"]
[0.034, "o", "-"]
[0.031, "o", "d"]
[0.034, "o", "e"]
[0.034, "o", "m"]
[0.032, "o", "o"]
[0.036, "o", "-"]
[0.033, "o", "1"]
[0.032, "o", " "]
[0.031, "o", "-"]
[0.035, "o", "n"]
[0.034, "o", " "]
[0.035, "o", "h"]
[0.038, "o", "a"]
[0.033, "o", "r"]
[0.036, "o", "v"]
[0.030, "o", "e"]
[0.031, "o", "y"]
[0.029, "o", "-"]
[0.030, "o", "d"]
[0.032, "o", "r"]
[0.032, "o", "-"]
[0.034, "o", "d"]
[0.033, "o", "e"]
[0.033, "o", "m"]
[0.034, "o", "o"]
[0.038, "o", " "]
[0.040, "o", "-"]
[0.038, "o", "-"]
[0.037, "o", "y"]
[0.030, "o", "e"]
[0.033, "o", "s"]
[0.041, "o", "\r\n"]
[0.626, "o", "\u001b[?25l"]
[0.082, "o", "\u001b[32m⠋\u001b[0m \u001b[36mFetching VM inventory from both clusters...\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"]
[0.001, "o", "\u001b[3m                        Failover Plan: \u001b[0m\u001b[3;36mprimary\u001b[0m\u001b[3m → \u001b[0m\u001b[3;32mdr\u001b[0m\u001b[3m                         \u001b[0m\r\n╭────────┬─────────┬────────────────┬───────────┬──────────┬───────────────╮\r\n│\u001b[1m \u001b[0m\u001b[1mStop #\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mStart #\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mNamespace     \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mVM Name  \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mPriority\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mStartup Delay\u001b[0m\u001b[1m \u001b[0m│\r\n├────────┼─────────┼────────────────┼───────────┼──────────┼───────────────┤\r\n│\u001b[33m \u001b[0m\u001b[33m     1\u001b[0m\u001b[33m \u001b[0m│\u001b[32m \u001b[0m\u001b[32m      1\u001b[0m\u001b[32m \u001b[0m│\u001b[36m \u001b[0m\u001b[36mharvey-dr-demo\u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35mdr-demo-1\u001b[0m\u001b[35m \u001b[0m│      100 │             — │\r\n"]
[0.000, "o", "╰────────┴─────────┴────────────────┴───────────┴──────────┴───────────────╯\r\n"]
[0.002, "o", "\u001b[92m────────────────────────────────────────────────────── \u001b[0m\u001b[1;34mStop Phase\u001b[0m\u001b[92m ──────────────────────────────────────────────────────\u001b[0m\r\n"]
[0.000, "o", "  \u001b[33mStop\u001b[0m  harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m  \u001b[1m(\u001b[0mpriority \u001b[1;36m100\u001b[0m\u001b[1m)\u001b[0m\r\n"]
[0.000, "o", "\u001b[92m───────────────────────────────────────────────────── \u001b[0m\u001b[1;34mStart Phase\u001b[0m\u001b[92m ──────────────────────────────────────────────────────\u001b[0m\r\n"]
[0.000, "o", "  \u001b[32mStart\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m  \u001b[1m(\u001b[0mpriority \u001b[1;36m100\u001b[0m\u001b[1m)\u001b[0m\r\n"]
[0.000, "o", "\u001b[92m────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\r\n"]
[0.015, "o", "\u001b[1mPreflight\u001b[0m\r\n"]
[0.093, "o", "  harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m: \u001b[1;36m3\u001b[0m \u001b[1;35mvolume\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m ready\r\n"]
[0.000, "o", "\u001b[1mMetadata sync\u001b[0m\r\n"]
[0.279, "o", "\u001b[1mStop on primary\u001b[0m\r\n"]
[6.122, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m stopped\r\n"]
[0.000, "o", "\u001b[1mFinal SnapMirror update\u001b[0m\r\n"]
[6.267, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m-root: \u001b[1;36m4701312\u001b[0m B in \u001b[1;36m6.\u001b[0m2s\r\n"]
[6.230, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m-data-iscsi: \u001b[1;36m170592\u001b[0m B in \u001b[1;36m6.\u001b[0m2s\r\n"]
[9.306, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m-data-nfs: \u001b[1;36m3616\u001b[0m B in \u001b[1;36m9.\u001b[0m2s\r\n"]
[0.001, "o", "\u001b[1mPromote on dr\u001b[0m\r\n"]
[28.299, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m: \u001b[1;36m3\u001b[0m \u001b[1;35mvolume\u001b[0m\u001b[1m(\u001b[0ms\u001b[1m)\u001b[0m read-write\r\n"]
[0.000, "o", "\u001b[1mStart on dr\u001b[0m\r\n"]
[15.412, "o", "  \u001b[32m✓\u001b[0m harvey-dr-demo/dr-demo-\u001b[1;36m1\u001b[0m Running\r\n"]
[0.006, "o", "\u001b[92m────────────────────────────────────────────────── \u001b[0m\u001b[1;32mFailover Complete\u001b[0m\u001b[92m ───────────────────────────────────────────────────\u001b[0m\r\n"]
[0.003, "o", "\u001b[3m                Failover Summary                \u001b[0m\r\n╭──────────────────────────────┬───────────────╮\r\n│\u001b[1m \u001b[0m\u001b[1mMetric                      \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m        Value\u001b[0m\u001b[1m \u001b[0m│\r\n├──────────────────────────────┼───────────────┤\r\n│\u001b[1m \u001b[0m\u001b[1;34mVMs stopped on source\u001b[0m\u001b[1m       \u001b[0m\u001b[1m \u001b[0m│             1 │\r\n│\u001b[1m \u001b[0m\u001b[1;35mVolumes final-synced\u001b[0m\u001b[1m        \u001b[0m\u001b[1m \u001b[0m│             3 │\r\n│\u001b[1m \u001b[0m\u001b[1;32mVMs started on DR\u001b[0m\u001b[1m           \u001b[0m\u001b[1m \u001b[0m│             1 │\r\n│\u001b[1m \u001b[0m\u001b[1;2m  stop\u001b[0m\u001b[1m                      \u001b[0m\u001b[1m \u001b[0m│            6s │\r\n│\u001b[1m \u001b[0m\u001b[1;2m  final_sync\u001b[0m\u001b[1m                \u001b[0m\u001b[1m \u001b[0m│           21s │\r\n│\u001b[1m \u001b[0m\u001b[1;2m  promote\u001b[0m\u001b[1m                   \u001b[0m\u001b[1m \u001b[0m│           28s │\r\n│\u001b[1m \u001b[0m\u001b[1;2m  start\u001b["]
[0.000, "o", "0m\u001b[1m                     \u001b[0m\u001b[1m \u001b[0m│           15s │\r\n│\u001b[1m \u001b[0m\u001b[1;36mTotal RTO\u001b[0m\u001b[1m                   \u001b[0m\u001b[1m \u001b[0m│ 72s  (1m 12s) │\r\n│\u001b[1m \u001b[0m\u001b[1;36mRPO harvey-dr-demo/dr-demo-1\u001b[0m\u001b[1m \u001b[0m│ 0s (lossless) │\r\n╰──────────────────────────────┴───────────────╯\r\n"]
[0.003, "o", "\r\nNext: once primary is healthy, run \u001b[1;36mharvey reprotect -n \u001b[0m\u001b[1;36m<\u001b[0m\u001b[1;36mns\u001b[0m\u001b[1;36m> <vm\u001b[0m\u001b[1;36m>\u001b[0m to replicate back \u001b[1m(\u001b[0mdr → primary\u001b[1m)\u001b[0m.\r\n"]
[0.036, "o", "\r\n"]
[1.517, "o", "\u001b[1;36m# On DR: the last write before the stop is there; the only gap is the outage window\u001b[0m\r\n"]
[1.016, "o", "\u001b[1;32m$\u001b[0m "]
[0.000, "o", "v"]
[0.031, "o", "i"]
[0.042, "o", "r"]
[0.043, "o", "t"]
[0.038, "o", "c"]
[0.036, "o", "t"]
[0.041, "o", "l"]
[0.038, "o", " "]
[0.039, "o", "s"]
[0.029, "o", "s"]
[0.041, "o", "h"]
[0.036, "o", " "]
[0.040, "o", "s"]
[0.039, "o", "l"]
[0.041, "o", "e"]
[0.033, "o", "s"]
[0.035, "o", "@"]
[0.035, "o", "v"]
[0.036, "o", "m"]
[0.034, "o", "/"]
[0.038, "o", "d"]
[0.032, "o", "r"]
[0.033, "o", "-"]
[0.037, "o", "d"]
[0.037, "o", "e"]
[0.035, "o", "m"]
[0.033, "o", "o"]
[0.034, "o", "-"]
[0.031, "o", "1"]
[0.030, "o", " "]
[0.034, "o", "("]
[0.034, "o", "d"]
[0.033, "o", "r"]
[0.038, "o", ")"]
[0.036, "o", " "]
[0.039, "o", "-"]
[0.040, "o", "-"]
[0.040, "o", " "]
[0.030, "o", "c"]
[0.032, "o", "h"]
[0.034, "o", "e"]
[0.035, "o", "c"]
[0.031, "o", "k"]
[0.035, "o", " "]
[0.032, "o", "m"]
[0.033, "o", "a"]
[0.038, "o", "r"]
[0.032, "o", "k"]
[0.033, "o", "e"]
[0.038, "o", "r"]
[0.031, "o", " "]
[0.035, "o", "f"]
[0.028, "o", "i"]
[0.033, "o", "l"]
[0.033, "o", "e"]
[0.034, "o", "s"]
[0.030, "o", " "]
[0.036, "o", "f"]
[0.043, "o", "o"]
[0.034, "o", "r"]
[0.038, "o", " "]
[0.038, "o", "g"]
[0.037, "o", "a"]
[0.032, "o", "p"]
[0.037, "o", "s"]
[0.035, "o", "\r\n"]
[141.944, "o", "== /var/lib/harvey-marker: 424 lines, last 2026-11-03T04:32:22Z\r\n   gap 2026-11-03T04:28:42Z -> 2026-11-03T04:30:41Z\r\n== /mnt/iscsi/marker: 435 lines, last 2026-11-03T04:32:22Z\r\n   gap 2026-11-03T04:28:42Z -> 2026-11-03T04:30:41Z\r\n== /mnt/nfs/marker: 435 lines, last 2026-11-03T04:32:22Z\r\n   gap 2026-11-03T04:28:42Z -> 2026-11-03T04:30:41Z\r\n\r\n"]
[2.014, "o", "\u001b[1;32m$\u001b[0m "]
[0.000, "o", "h"]
[0.037, "o", "a"]
[0.033, "o", "r"]
[0.041, "o", "v"]
[0.035, "o", "e"]
[0.036, "o", "y"]
[0.034, "o", " "]
[0.032, "o", "r"]
[0.033, "o", "e"]
[0.037, "o", "p"]
[0.034, "o", "l"]
[0.035, "o", "i"]
[0.033, "o", "c"]
[0.034, "o", "a"]
[0.035, "o", "t"]
[0.036, "o", "i"]
[0.032, "o", "o"]
[0.031, "o", "n"]
[0.035, "o", " "]
[0.036, "o", "s"]
[0.029, "o", "t"]
[0.037, "o", "a"]
[0.036, "o", "t"]
[0.030, "o", "u"]
[0.033, "o", "s"]
[0.031, "o", "\r\n"]
[0.813, "o", "\u001b[3m                                                   Replication status                                                   \u001b[0m\r\n╭──────────────────────────┬──────────────────────┬────────────┬────────────┬─────────┬─────┬─────────────┬────────────╮\r\n│\u001b[1m                          \u001b[0m│\u001b[1m                      \u001b[0m│\u001b[1m \u001b[0m\u001b[1mTMR       \u001b[0m\u001b[1m \u001b[0m│\u001b[1m            \u001b[0m│\u001b[1m         \u001b[0m│\u001b[1m     \u001b[0m│\u001b[1m \u001b[0m\u001b[1mRecovery   \u001b[0m\u001b[1m \u001b[0m│\u001b[1m            \u001b[0m│\r\n│\u001b[1m \u001b[0m\u001b[1mVM / direction / state  \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mVolume              \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mpri→rep   \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mSnapMirror\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mHealthy\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mLag\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mpoint      \u001b[0m\u001b[1m \u001b[0m│\u001b[1"]
[0.000, "o", "m \u001b[0m\u001b[1mNote      \u001b[0m\u001b[1m \u001b[0m│\r\n├──────────────────────────┼──────────────────────┼────────────┼────────────┼─────────┼─────┼─────────────┼────────────┤\r\n│ \u001b[1mharvey-dr-demo/dr-demo-1\u001b[0m │ dr-demo-1-root       │ prom→prom  │ -          │ -       │ -   │ -           │ needs      │\r\n│                          │                      │            │            │         │     │             │ reprotect  │\r\n│ dr → primary             │ dr-demo-1-data-iscsi │ prom→prom  │ -          │ -       │ -   │ -           │ needs      │\r\n│                          │                      │            │            │         │     │             │ reprotect  │\r\n│ Running / Stopped        │ dr-demo-1-data-nf"]
[0.000, "o", "s   │ prom→prom  │ -          │ -       │ -   │ -           │ needs      │\r\n│                          │                      │            │            │         │     │             │ reprotect  │\r\n╰──────────────────────────┴──────────────────────┴────────────┴────────────┴─────────┴─────┴─────────────┴────────────╯\r\n"]
[0.002, "o", "Worst lag: \u001b[1m0s\u001b[0m  \u001b[1m(\u001b[0mschedule \u001b[32m'harvey-1min'\u001b[0m; lag = age of the newest replicated snapshot = worst-case data loss if the \r\nprimary site fails now\u001b[1m)\u001b[0m\r\n"]
[0.030, "o", "\r\n"]
[1.515, "x", "0"]
