From a6907fed19f6b474fc32d45c68d0e5428324ebd1 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 29 Sep 2026 06:00:55 -0400 Subject: [PATCH] clonage : serialise par stockage, le parallelisme reste par sequence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Proxmox tient un verrou PAR STOCKAGE pendant l allocation du disque. Les clones partaient a quatre de front (`flotte-creer PARALLELE`), se le disputaient, et celui qui attendait trop rendait « clone failed: can't lock file … - got timeout » — un message qui nomme le verrou, jamais le parallelisme qui l a provoque. A deux VM rien ne paraissait ; a cinq, une creation sur cinq echouait et la reconstruction s arretait. La cle du verrou porte le noeud ET le stockage : deux stockages distincts clonent toujours de front, et seule la section qui contend est prise une a la fois, dans l ordre ou la sequence du plan la demande. Assisted-by: Claude Opus 5 --- Makefile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fe25387..15dd2cf 100644 --- a/Makefile +++ b/Makefile @@ -1456,6 +1456,18 @@ verifier-deploiement: ansible-runtime ## Verifie l'etat de la flotte apres deplo ansible-playbook -i $(INVENTAIRE_PRODUCTION) "$$playbook" --limit "$(HOTE)" --check --diff; \ done +# LE CLONAGE SE SERIALISE PAR STOCKAGE, et c'est la granularite de Proxmox +# lui-meme : il tient un verrou PAR STOCKAGE pendant l'allocation du disque. Deux +# clones simultanes sur le meme stockage se le disputent, et celui qui attend trop +# rend « clone failed: can't lock file '/var/lock/pve-manager/pve-storage-' - +# got timeout » — un message qui nomme le verrou, jamais le parallelisme qui l'a +# provoque. A deux VM rien ne parait ; a cinq, une creation sur cinq echoue, et la +# reconstruction s'arrete sans que rien ne dise pourquoi elle tenait a deux. +# +# LA CLE PORTE LE NOEUD ET LE STOCKAGE, donc deux stockages distincts clonent +# TOUJOURS en parallele : `flotte-creer PARALLELE=n` garde tout son sens, et seule +# la section qui contend est prise un a la fois, dans l'ordre ou la sequence du +# plan la demande. cloner-vm: ansible-runtime ## Clone une VM depuis le gabarit dore — HOTE= VMID= @if [[ -z "$(HOTE)" || -z "$(VMID)" ]]; then \ printf '%s\n' 'Refus: relancer avec HOTE=nom VMID=id_clone.'; \ @@ -1530,7 +1542,8 @@ cloner-vm: ansible-runtime ## Clone une VM depuis le gabarit dore — HOTE= ;; \ esac; \ fi; \ - ansible-playbook -i localhost, $(PLAYBOOK_PROXMOX_CLONER_VM) "$${vault_args[@]}" "$${extra_vars[@]}" + verrou="$${TMPDIR:-/tmp}/setops-clone-$$(printf '%s_%s' '$(NOEUD_PROXMOX)' '$(STOCKAGE_PROXMOX)' | tr -c 'A-Za-z0-9._-' '_').lock"; \ + flock "$$verrou" ansible-playbook -i localhost, $(PLAYBOOK_PROXMOX_CLONER_VM) "$${vault_args[@]}" "$${extra_vars[@]}" creer-vm: _instance-requise ## Cree une VM et attend qu'elle soit joignable — HOTE= @set -e; \