File size: 4,140 Bytes
58e6885
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env bash
# 10-hour rolling loop: re-scan both data pools repeatedly so select_template
# naturally rotates through under-used chart_name variations (variation.json
# weights each pick by usage frequency, so the same input may end up rendered
# with different variations across rounds).
#
# Stop policy (graceful): before each round, check elapsed wall clock; if >=
# DEADLINE_SEC, do NOT start a new round. The currently running round is
# always allowed to finish.
#
# Output: APPENDS into output/line_pie_donut_chart_only/<pool>/ (same dir as
# the foundational run). Filenames carry an int timestamp so they never
# collide.
#
# Logs:
#   logs/10h_run_round_<N>_<pool>.log    per-round per-pool pipeline output
#   logs/10h_run_summary.log             this wrapper's own progress

set -u
set -o pipefail

cd "$(dirname "$0")/.."
ROOT="$(pwd)"

SUMMARY=logs/10h_run_summary.log
mkdir -p logs output/line_pie_donut_chart_only

log() { printf '[%s] %s\n' "$(date -Iseconds)" "$*" | tee -a "$SUMMARY"; }

log "==== 10h loop launcher ===="
log "cwd=$ROOT"

# -------- 1. wait for current line_pie_donut session to finish --------
PRIOR_SESSION="${PRIOR_SESSION:-line_pie_donut}"
if tmux has-session -t "$PRIOR_SESSION" 2>/dev/null; then
  log "waiting for prior tmux session '$PRIOR_SESSION' to finish..."
  while tmux has-session -t "$PRIOR_SESSION" 2>/dev/null; do
    sleep 60
  done
  log "prior session '$PRIOR_SESSION' is gone, continuing"
else
  log "prior session '$PRIOR_SESSION' not running, starting immediately"
fi

# -------- 2. config --------
if [[ ! -s allowed_chart_types.json ]]; then
  log "ERROR: allowed_chart_types.json missing or empty; aborting"
  exit 1
fi
log "whitelist (will be re-read by every worker via mtime cache):"
cat allowed_chart_types.json | tee -a "$SUMMARY"

export PUPPETEER_EXECUTABLE_PATH="${PUPPETEER_EXECUTABLE_PATH:-/usr/bin/google-chrome}"
THREADS="${THREADS:-48}"
# wall-clock budget; default 10h = 36000s
DEADLINE_SEC="${DEADLINE_SEC:-36000}"
log "PUPPETEER_EXECUTABLE_PATH=$PUPPETEER_EXECUTABLE_PATH"
log "THREADS=$THREADS"
log "DEADLINE_SEC=$DEADLINE_SEC ($(awk -v s=$DEADLINE_SEC 'BEGIN{printf "%.1fh", s/3600}'))"

mapfile -t POOLS < <(python -c "import config; print('\n'.join(config.data_resource_dirs))")
if [[ ${#POOLS[@]} -eq 0 ]]; then
  log "ERROR: config.data_resource_dirs is empty"
  exit 1
fi
log "POOLS (from config.data_resource_dirs):"
for p in "${POOLS[@]}"; do log "  $p"; done

# -------- 3. rolling rounds --------
START_TS=$(date +%s)
ROUND=0
while :; do
  NOW=$(date +%s)
  ELAPSED=$((NOW - START_TS))
  REMAINING=$((DEADLINE_SEC - ELAPSED))
  if (( REMAINING <= 0 )); then
    log "deadline reached (elapsed=${ELAPSED}s >= ${DEADLINE_SEC}s); not starting new round"
    break
  fi

  ROUND=$((ROUND + 1))
  log "============================================================"
  log "ROUND $ROUND  elapsed=$((ELAPSED/3600))h$(((ELAPSED%3600)/60))m  remaining=$((REMAINING/3600))h$(((REMAINING%3600)/60))m"
  log "disk before round: $(df -h /data | tail -1)"

  for pool in "${POOLS[@]}"; do
    name="$(basename "$pool")"
    out="output/line_pie_donut_chart_only/$name"
    log="logs/10h_run_round_${ROUND}_${name}.log"
    mkdir -p "$out"
    # NOTE: bash 'log' function got shadowed by the loop var 'log' (file path),
    # so use printf directly for this round-line.
    printf '[%s] -- round %d pool=%s out=%s\n' "$(date -Iseconds)" "$ROUND" "$pool" "$out" | tee -a "$SUMMARY"
    python pipeline.py \
      --input  "$pool" \
      --output "$out" \
      --modules infographics_generator \
      --chart-only --output-png \
      --threads "$THREADS" \
      2>&1 | tee "$log" > /dev/null
    printf '[%s] -- round %d pool=%s DONE\n' "$(date -Iseconds)" "$ROUND" "$pool" | tee -a "$SUMMARY"
  done

  printf '[%s] round %d finished. disk after: %s\n' "$(date -Iseconds)" "$ROUND" "$(df -h /data | tail -1)" | tee -a "$SUMMARY"
done

END_TS=$(date +%s)
TOTAL=$((END_TS - START_TS))
printf '[%s] ==== 10h loop done after %dh %dm, completed %d full round(s) ====\n' \
  "$(date -Iseconds)" $((TOTAL/3600)) $(((TOTAL%3600)/60)) "$ROUND" | tee -a "$SUMMARY"