Subsequently commited on
Commit
1ed2f98
·
verified ·
1 Parent(s): 42df02b

Update entrypoint.sh

Browse files
Files changed (1) hide show
  1. entrypoint.sh +41 -22
entrypoint.sh CHANGED
@@ -82,7 +82,7 @@ if [ -f /app/security-check.sh ]; then
82
  fi
83
 
84
  # ----------------------------------------------------------------
85
- # State DB helpers
86
  # ----------------------------------------------------------------
87
  STATE_DB="$OPENCLAW_HOME/.openclaw/state/openclaw.sqlite"
88
 
@@ -106,7 +106,7 @@ dump_owner() {
106
  const { DatabaseSync } = require('node:sqlite');
107
  try {
108
  const db = new DatabaseSync(process.env.DBPATH, { readOnly: true });
109
- const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND (name LIKE '%owner%' OR name LIKE '%lock%' OR name LIKE '%lease%' OR name LIKE '%heartbeat%' OR name LIKE '%machine_state%')").all();
110
  for (const t of tables) {
111
  console.log('[owner-dump] table ' + t.name);
112
  for (const r of db.prepare('SELECT * FROM "' + t.name + '" LIMIT 5').all()) {
@@ -118,6 +118,26 @@ try {
118
  JSEOF
119
  }
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  # Move retired Telegram JSON state aside (blocks doctor migration; kept as backup)
122
  LEGACY_BAK="$OPENCLAW_HOME/legacy-telegram-backup"
123
  mkdir -p "$LEGACY_BAK"
@@ -129,6 +149,19 @@ for f in "$OPENCLAW_HOME"/.openclaw/telegram/update-offset-*.json \
129
  fi
130
  done
131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  # If the state DB is corrupt, restore from doctor's own pre-migration backup
133
  if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
134
  warn "State DB failed integrity check - looking for an intact backup..."
@@ -146,38 +179,23 @@ if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
146
  fi
147
 
148
  # ----------------------------------------------------------------
149
- # Doctor (state migration) with lock diagnostics and one-time fallback
150
  # ----------------------------------------------------------------
151
- run_doctor() {
152
- timeout 300 openclaw doctor --fix --non-interactive </dev/null >/tmp/doctor.out 2>&1
153
- cat /tmp/doctor.out
154
- }
155
- doctor_locked() {
156
- grep -q "could not enter maintenance" /tmp/doctor.out
157
- }
158
-
159
  log "Running openclaw doctor --fix (state migration)..."
 
160
  run_doctor
161
  if doctor_locked; then
162
  warn "doctor blocked by state ownership lock - diagnostics follow"
163
  log "now (UTC): $(date -u +%Y-%m-%dT%H:%M:%S)"
164
  dump_owner "$STATE_DB" 2>/dev/null
165
- find "$OPENCLAW_HOME/.openclaw" -maxdepth 3 -iname '*lock*' 2>/dev/null | head -n 20
166
  warn "retrying doctor in 30s..."
167
  sleep 30
 
168
  run_doctor
169
  fi
170
  if doctor_locked; then
171
- if ls "$STATE_DB".locked-* >/dev/null 2>&1; then
172
- warn "still locked, and the one-time fallback was already used - not touching the DB again"
173
- else
174
- warn "still locked - moving state DB aside (one time) and retrying on a fresh DB"
175
- TSX=$(date +%s)
176
- for f in "$STATE_DB" "$STATE_DB-wal" "$STATE_DB-shm"; do
177
- [ -e "$f" ] && mv "$f" "$f.locked-$TSX"
178
- done
179
- run_doctor
180
- fi
181
  fi
182
  log "Doctor step done."
183
 
@@ -232,6 +250,7 @@ JSEOF
232
  log "Starting gateway loop..."
233
 
234
  while true; do
 
235
  log "Gateway starting..."
236
 
237
  openclaw gateway \
 
82
  fi
83
 
84
  # ----------------------------------------------------------------
85
+ # Helpers
86
  # ----------------------------------------------------------------
87
  STATE_DB="$OPENCLAW_HOME/.openclaw/state/openclaw.sqlite"
88
 
 
106
  const { DatabaseSync } = require('node:sqlite');
107
  try {
108
  const db = new DatabaseSync(process.env.DBPATH, { readOnly: true });
109
+ const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND (name LIKE '%owner%' OR name LIKE '%lock%' OR name LIKE '%lease%' OR name LIKE '%heartbeat%')").all();
110
  for (const t of tables) {
111
  console.log('[owner-dump] table ' + t.name);
112
  for (const r of db.prepare('SELECT * FROM "' + t.name + '" LIMIT 5').all()) {
 
118
  JSEOF
119
  }
120
 
121
+ # Stale lock files left on the persistent volume by a crashed gateway
122
+ clear_stale_locks() {
123
+ for d in "$OPENCLAW_HOME"/.openclaw/tmp/openclaw-*; do
124
+ [ -d "$d" ] || continue
125
+ for l in "$d"/*.lock; do
126
+ [ -e "$l" ] || continue
127
+ INFO=$(head -c 160 "$l" 2>/dev/null | tr '\n' ' ')
128
+ rm -rf "$l" && log "Removed stale lock: $l [$INFO]"
129
+ done
130
+ done
131
+ }
132
+
133
+ run_doctor() {
134
+ timeout 300 openclaw doctor --fix --non-interactive </dev/null >/tmp/doctor.out 2>&1
135
+ cat /tmp/doctor.out
136
+ }
137
+ doctor_locked() {
138
+ grep -q "could not enter maintenance" /tmp/doctor.out
139
+ }
140
+
141
  # Move retired Telegram JSON state aside (blocks doctor migration; kept as backup)
142
  LEGACY_BAK="$OPENCLAW_HOME/legacy-telegram-backup"
143
  mkdir -p "$LEGACY_BAK"
 
149
  fi
150
  done
151
 
152
+ # ----------------------------------------------------------------
153
+ # Restore a state DB that an earlier boot moved aside
154
+ # ----------------------------------------------------------------
155
+ LOCKED=$(ls -t "$STATE_DB".locked-* 2>/dev/null | head -n1)
156
+ if [ -n "$LOCKED" ]; then
157
+ warn "Found a state DB moved aside by an earlier boot - restoring: $LOCKED"
158
+ if [ -e "$STATE_DB" ]; then
159
+ mv "$STATE_DB" "$STATE_DB.fresh-$(date +%s)"
160
+ fi
161
+ rm -f "$STATE_DB-wal" "$STATE_DB-shm"
162
+ mv "$LOCKED" "$STATE_DB" && log "Restored state DB from $LOCKED"
163
+ fi
164
+
165
  # If the state DB is corrupt, restore from doctor's own pre-migration backup
166
  if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
167
  warn "State DB failed integrity check - looking for an intact backup..."
 
179
  fi
180
 
181
  # ----------------------------------------------------------------
182
+ # Doctor (state migration)
183
  # ----------------------------------------------------------------
 
 
 
 
 
 
 
 
184
  log "Running openclaw doctor --fix (state migration)..."
185
+ clear_stale_locks
186
  run_doctor
187
  if doctor_locked; then
188
  warn "doctor blocked by state ownership lock - diagnostics follow"
189
  log "now (UTC): $(date -u +%Y-%m-%dT%H:%M:%S)"
190
  dump_owner "$STATE_DB" 2>/dev/null
191
+ find "$OPENCLAW_HOME/.openclaw/tmp" -maxdepth 3 2>/dev/null | head -n 30
192
  warn "retrying doctor in 30s..."
193
  sleep 30
194
+ clear_stale_locks
195
  run_doctor
196
  fi
197
  if doctor_locked; then
198
+ warn "doctor still blocked by the state lock - not touching any data"
 
 
 
 
 
 
 
 
 
199
  fi
200
  log "Doctor step done."
201
 
 
250
  log "Starting gateway loop..."
251
 
252
  while true; do
253
+ clear_stale_locks
254
  log "Gateway starting..."
255
 
256
  openclaw gateway \