Project

General

Profile

Anomalie #3571

nettoyage du dossier tmp/cache/wheels

Added by phe nix almost 4 years ago. Updated almost 4 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Category:
-
Target version:
Start date:
10/23/2015
Due date:
% Done:

0%

Resolution:
fixed
Navigateur:

Description

Hello,

J'ai un bug étrange: le dossier tmp/cache/wheels grossis a vue d'oeil sans jamais être nettoyé par le cron.

Les permissions sont OK, je viens de vider manuellement un cache de 2.9Go, et ce dossier à lui seul contenant 41000 fichiers (2.8Go).

Bref, je pense qu'il y a un soucis.

History

#1 Updated by - Equipement almost 4 years ago

Bonjour,

J'ai constaté que le dossier tmp/cache/wheels d'un site (sans le plugin memoization) contient :
- 5 fichiers tw-....txt
- des dizaines de fichiers datasource-....txt

J'ai ajouté une trace dans les logs dans la fonction cache_set de plugins-dist/*textwheel*/inc/memoization-mini.php

function cache_set($key, $value) {
    $dir = sous_repertoire(_DIR_CACHE,"wheels/");
spip_log("CI CACHE SET de textwheels:".$dir.$key.".txt",_LOG_ERREUR);
    return ecrire_fichier($dir.$key.".txt", serialize($value));
}

J'ai également ajouté une trace dans les logs dans la fonction cache_set de ecrire/*iterateur*/data.php :

    protected function cache_set($cle, $ttl, $valeur = null) {
        if (!$cle) return;
        if (is_null($valeur)) {
            $valeur = $this->tableau;
        }
        # utiliser memoization si dispo
        include_spip('inc/memoization');
spip_log("CI CACHE SET de iterateur : A",_LOG_ERREUR);
        if (!function_exists('cache_set')) return;
spip_log("CI CACHE SET de iterateur : B",_LOG_ERREUR);
        return cache_set($cle,
            array(
                'data' => $valeur,
                'time' => time(),
                'ttl' => $ttl
            ),
            3600 + $ttl);
    }

Ensuite, dans l'espace privé du site, j'ai consulté les statistiques d'un article. Les logs montrent que 2 fichiers datasource....txt ont été créés dans /tmp/cache/wheels. Un examen du répertoire le confirme.

2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de iterateur : A
2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de iterateur : B
2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de textwheels : ../tmp/cache/wheels/datasource_acc0b40712268d73bce5056d75e2d22b.txt
2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de iterateur : A
2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de iterateur : B
2015-10-26 15:04:25 ... :Pri:ERREUR: CI CACHE SET de textwheels : ../tmp/cache/wheels/datasource_5d2bd35e83ad81cf50437400f60004db.txt

Dans la fonction cache_set de ecrire/*iterateur*/data.php, le traitement continue après le test d'existence de la fonction 'cache_set'. Or le site n'a pas le plugin memoization, et un examen des sources montre que cette fonction (pas la méthode) existe uniquement dans plugins-dist/*textwheel*/inc/memoization-mini.php. C'est donc cette dernière fonction qui est utilisée par erreur par l'itérateur.

Cordialement
Equipement

#2 Updated by - Equipement almost 4 years ago

Si l'on modifie la méthode &loader dans plugins-dist/textwheel/inc/textwheel.php, par exemple comme ci-dessous, le problème disparaît.

    public static function &loader($ruleset, $callback = '', $class = 'SPIPTextWheelRuleset') {

        # memoization
        # attention : le ruleset peut contenir apres loading des chemins relatifs
        # il faut donc que le cache depende du chemin courant vers la racine de SPIP
        $key = 'tw-'.md5(_WHEELS_VERSION."-".serialize($ruleset).$callback.$class._DIR_RACINE);

        # lecture du cache
        include_spip('memoization_options');
        if (!defined('_VAR_MODE') OR _VAR_MODE!='recalcul'){
            if (function_exists('cache_get')){
               if ($cacheruleset = cache_get($key))
                    return $cacheruleset;
            } else {
              if ($cacheruleset = @unserialize(file_get_contents(_DIR_CACHE."wheels/".$key.".txt")))
                    return $cacheruleset;
            }
        }

        # calcul de la wheel
        $ruleset = parent::loader($ruleset, $callback, $class);

        # ecriture du cache
        if (function_exists('cache_set')){
            cache_set($key, $ruleset);
        } else {
            $dir = sous_repertoire(_DIR_CACHE,"wheels/");
            ecrire_fichier($dir.$key.".txt", serialize($value));
        }

        return $ruleset;
    }

#3 Updated by b b almost 4 years ago

  • Status changed from Nouveau to En cours

Hop, pour info le bug est fixé en 3.1 par r22445, il ne manque plus que le report en 3.0 si le bug peut être corrigé de la même manière sur cette branche.

#4 Updated by phe nix almost 4 years ago

b b a écrit :

Hop, pour info le bug est fixé en 3.1 par r22445, il ne manque plus que le report en 3.0 si le bug peut être corrigé de la même manière sur cette branche.

Voilà une bonne nouvelle, je suis bien content d'avoir ouvert ce ticket !

#5 Updated by - Equipement almost 4 years ago

Le problème provient du plugin Textwheel. Il ne provient pas de SPIP.
La révision r22445 est intéressante, toutefois elle porte sur SPIP et pas sur le plugin Textwheel.

Je viens d'installer SPIP 3.1.0-beta [22445] et je constate que le problème persiste (ce qui est normal vu que la révision r22445 ne porte pas sur Textwheel).

#6 Updated by b b almost 4 years ago

Bien vu Equipement, je confirme, à suivre...

#7 Updated by cedric - almost 4 years ago

  • Status changed from En cours to Fermé
  • Resolution set to fixed

Also available in: Atom PDF