Skip to content
Extraits de code Groupes Projets
Valider 6ba1ff2b rédigé par cerdic's avatar cerdic
Parcourir les fichiers

fix: le refactoring echoue là ou la precedente version bien crade marchait,...

fix: le refactoring echoue là ou la precedente version bien crade marchait, essayons de comprendre pourquoi
parent a431b853
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -242,8 +242,10 @@ function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate = ...@@ -242,8 +242,10 @@ function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate =
spip_fclose_unlock($fp); spip_fclose_unlock($fp);
$fp = null; $fp = null;
// on rename vers la cible, ce qui est atomique quand on est pas sous windows // on rename vers la cible, ce qui est atomique quand on est pas sous windows
// au pire on arrive en second en cas de concurance, et le rename echoue // au pire on arrive en second en cas de concurence, et le rename echoue
// --> on a la version de l'autre process qui doit etre identique // --> on a la version de l'autre process qui doit etre identique
// sur certains fs lent, il semble que le rename echoue parce que notre propre lock est pas libéré assez vite...
// ce cas sera traité par le fallback avec eventuellement une tempo si besoin
if (@rename("$fichier.$id", $fichier)) { if (@rename("$fichier.$id", $fichier)) {
$ok = file_exists($fichier); $ok = file_exists($fichier);
} }
...@@ -260,10 +262,21 @@ function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate = ...@@ -260,10 +262,21 @@ function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate =
// sinon ou si methode precedente a echoueee // sinon ou si methode precedente a echoueee
// on se rabat sur file_put_contents direct sur le fichier // on se rabat sur file_put_contents direct sur le fichier
if (!$ok) { if (!$ok) {
clearstatcache();
$l = file_put_contents($fichier, $contenu, $truncate ? LOCK_EX : LOCK_EX | FILE_APPEND); $l = file_put_contents($fichier, $contenu, $truncate ? LOCK_EX : LOCK_EX | FILE_APPEND);
$ok = ($l === $longueur_a_ecrire); $ok = ($l === $longueur_a_ecrire);
if ($truncate) { if ($truncate) {
spip_logger('flock')->notice("ecrire_fichier: operation atomique via rename() impossible, fallback non atomique via file_put_contents"); spip_logger('flock')->notice("ecrire_fichier: operation atomique via rename() impossible, fallback non atomique via file_put_contents" . ($ok ? 'OK' : 'Fail'));
}
if (!$ok) {
// derniere tentative : on sait que file_put_contents marche dans le dossier considere
// c'est peut etre un probleme de tempo avant que le lock qu'on a nous meme posé soit libéré (fs lent)
usleep(250000);
$l = file_put_contents($fichier, $contenu, $truncate ? LOCK_EX : LOCK_EX | FILE_APPEND);
$ok = ($l === $longueur_a_ecrire);
if ($truncate) {
spip_logger('flock')->notice("ecrire_fichier: operation atomique via rename() impossible, fallback non atomique via tempo + file_put_contents : " . ($ok ? 'OK' : 'Fail'));
}
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter