_rebuild_again.mjs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. // P96:修好第 ⑦ 步后重新触发整轮重算,并等待 /api/fleet 恢复 200(最长约 60 分钟)
  2. const GW = 'http://106.120.102.238:28084'
  3. const t0 = Date.now()
  4. const st = () => ((Date.now() - t0) / 1000 / 60).toFixed(1).padStart(5) + 'm'
  5. const bust = () => 'ts=' + Date.now() + Math.random()
  6. async function get(path) {
  7. try {
  8. const r = await fetch(GW + path + (path.includes('?') ? '&' : '?') + bust(), { headers: { 'Cache-Control': 'no-cache' } })
  9. const b = await r.text()
  10. return { status: r.status, len: b.length, txt: b }
  11. } catch (e) { return { status: 0, len: 0, txt: String(e) } }
  12. }
  13. async function post(path, body) {
  14. const r = await fetch(GW + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body || {}) })
  15. return { status: r.status, txt: (await r.text()).slice(0, 220) }
  16. }
  17. console.log(st() + ' fleet(前) = ' + (await get('/api/fleet')).status)
  18. console.log(st() + ' 触发 rebuild: ' + JSON.stringify(await post('/ops/api/rebuild', { skip_scada: true, with_verify: false })))
  19. let ok = false
  20. for (let i = 0; i < 120; i++) {
  21. await new Promise((r) => setTimeout(r, 30000))
  22. const f = await get('/api/fleet')
  23. const s = await get('/ops/api/state')
  24. let job = {}
  25. try { job = JSON.parse(s.txt).job || {} } catch { /* ignore */ }
  26. const tail = (job.log_tail || []).slice(-1)[0] || ''
  27. console.log(st() + ' fleet=' + f.status + '(' + f.len + 'B) job=' + (job.status || '?') + ' rc=' + (job.rc ?? '-') + ' · ' + String(tail).trim().slice(0, 100))
  28. if (f.status === 200 && f.len > 50000) { ok = true; console.log('✅ 数据已恢复 —— 可复跑判据'); break }
  29. if (job.rc !== null && job.rc !== undefined) {
  30. console.log('⚠️ 重算结束 rc=' + job.rc)
  31. for (const l of (job.log_tail || []).slice(-10)) console.log(' ' + String(l).slice(0, 190))
  32. break
  33. }
  34. }
  35. console.log('END ' + st() + ' ' + (ok ? 'OK' : 'NOT-OK'))