Projet

Général

Profil

Actions

Anomalie #5934

fermé

Problème mise en cache du document tardive dans Doc::postInsert() et taille du cache

Ajouté par Jérôme Augé il y a plus de 10 ans. Mis à jour il y a plus de 10 ans.

Statut:
Intégré
Priorité:
Normal
Assigné à:
Version cible:
Début:
27/11/2015
Echéance:
% réalisé:

100%

Temps estimé:
Version source:
Solution proposée:

2 problèmes distincts sont présentés dans la demande.

1°) Mise en cache & postCreated
Effectivement la mise en cache d'un nouveau document et fait après l'appel de postCreated.
Il faut que cette mise en cache soit faite avant cet appel et après le "add" (enregistrement en BD et obtention de l'id).

2°) Taille du cache
Le cache est limité à 20. Les 20 premiers appels à new_doc ou à doc::store (dans le cas de la création).
L'appel à Doc::store() ne met pas l'objet en cache s'il s'agit d'une mise à jour.
La solution consiste à rendre paramétrable cette limite par un paramètre applicatif et par programmation.
Il pourra être possible d'indiquer "sans limite" en indiquant -1. (0 indiquant aucun cache).
Il est cependant à noter que certaine action de core ou autre module Dynacase utilise ce cache. Donc je propose
que la limite historique à 20 ne puisse par être diminuée mais juste augmentée.

En attendant, la mise en place du documentManager qui gère le cache de façon explicite,
il est envisagé de documenter le fonctionnement de ce cache afin de pouvoir :
  • Changer la limite
  • Ajouter un élément dans le cache
  • Vider le cache (globalement ou par document)

L'alternative à cette documentation de fonction "interne" à core et de mettre à disposition
le documentManager qui réalise les mêmes fonctions que la fonction "new_doc" mais qui a l'avantage de
regrouper les fonctions d'accès et d'offrir des méthodes homogène d'accès aux documents unitaires et à la
gestion de ce cache - qui n'est pas un cache avec la BD mais une zone de partage d'objet documentaire.

En fichier joint, j'ai juste fait une stat sur la mémoire consommée par un "new_doc" basique.
Ici (en PHP5.6) on atteint 6Mo pour 100 documents "simple" et 60Mo sur php5.4 avec document complexe)

Principaux fichiers impactés:
Complexité:
Contrôle:
Thème:
Socle technique
Régression:
Non

Description

Dans `Doc::postInsert()`, le document créé est mis dans le cache `$gdocs` après le déclenchement de `Doc::postCreated()`. Cela à pour effet de bord de faire que le code exécuté dans le `postCreated()` de la famille n'a pas le document dans le cache et qu'il est donc possible qu'un nouvel objet distinct correspondant à ce document soit instancié, et donc faire que les données du document en base de données seront différentes en fonction du dernier objet sur lequel sera appelé le `store()`.

Pour éviter cela, il faudrait que le document créé soit immédiatement mis en cache après le `modify()` effectué par `postInsert()` et avant de déclencher `postCreated()`.

De plus, le fait que la mise en cache ne se fasse pas lorsque la taille max du cache est atteinte peut aussi entraîner des effets de bord de ce type, possibilité d'instancier deux objets distinct d'un même document Dynacase.


Fichiers

Conso Mémoire.ods (45,1 ko) Conso Mémoire.ods Éric Brison, 30/11/2015 12:04

Demandes liées 1 (0 ouverte1 fermée)

Lié à HTTP API v1 - Anomalie #6022: Conformité test core 3.2.21IntégréÉric Brison11/12/2015

Actions
Actions

Formats disponibles : Atom PDF