From dd6dc38e1ee5a935dbb9a48f4ac472a9d15a0d4b Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 12 Jul 2026 01:36:00 +0200 Subject: [PATCH] fix(backup): smaller forgejo dump chunks with per-chunk retries Use 4m split chunks and up to 8 retries per chunk to survive intermittent kubectl cp/exec websocket EOF on large dumps. --- tools/cmd/forgejo-backup | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/cmd/forgejo-backup b/tools/cmd/forgejo-backup index 45812f8..83a61cd 100755 --- a/tools/cmd/forgejo-backup +++ b/tools/cmd/forgejo-backup @@ -135,10 +135,27 @@ else chunk_dir="$(mktemp -d)" refresh_prod_pod parts="$(kubectl exec --request-timeout=120 -n "${FORGEJO_NAMESPACE}" "${PROD_POD}" -c gitea -- \ - sh -c "rm -f /tmp/forgejo-backup-part-*; split -b 8m '${DUMP_REMOTE}' /tmp/forgejo-backup-part- && ls /tmp/forgejo-backup-part-*")" + sh -c "rm -f /tmp/forgejo-backup-part-*; split -b 4m '${DUMP_REMOTE}' /tmp/forgejo-backup-part- && ls /tmp/forgejo-backup-part-*")" for part in ${parts}; do base="$(basename "${part}")" - copy_from_pod "${part}" "${chunk_dir}/${base}" || { bad "forgejo dump" "chunk copy failed: ${base}"; exit 1; } + local_chunk="${chunk_dir}/${base}" + if [[ -f "${local_chunk}" && -s "${local_chunk}" ]]; then + ok "forgejo dump" "reuse cached chunk ${base}" + continue + fi + chunk_ok=0 + for chunk_try in 1 2 3 4 5 6 7 8; do + if copy_from_pod "${part}" "${local_chunk}"; then + chunk_ok=1 + ok "forgejo dump" "chunk ${base} (${chunk_try})" + break + fi + sleep $((chunk_try * 3)) + done + if [[ "${chunk_ok}" -ne 1 ]]; then + bad "forgejo dump" "chunk copy failed: ${base}" + exit 1 + fi done cat "${chunk_dir}"/forgejo-backup-part-* > "${DUMP_PLAIN}" rm -rf "${chunk_dir}"