Architecture

Mettre à jour les index d'un TosDJ existant

Sur cette page

Les index d’un annuaire TosDJ sont créés par le setup, à partir du profil choisi. Quand une version de TOSIAM ajoute un index à un profil, seules les nouvelles installations le reçoivent : remplacer les binaires d’un annuaire existant ne modifie pas sa configuration. Cette page décrit comment ajouter les index manquants à un annuaire déjà installé, serveur en marche.

Quand appliquer la procédure#

Faites défiler le tableau
VersionIndex ajoutéProfilsCe qu’il accélère
3.38.0coreTokenType (égalité)cts, configListe des sessions d’un royaume dans la console et par l’API /api/realms/{realm}/sessions

Sans l’index coreTokenType, la liste des sessions parcourt tous les jetons du Core Token Store : sur un CTS de 87 000 jetons, elle répond en 620 ms au lieu de 13 ms. Le reste de TOSIAM fonctionne sans cet index.

La procédure est sans risque à rejouer : elle ajoute ce qui manque et ignore ce qui existe déjà. Elle s’applique donc telle quelle à chaque montée de version, sans avoir à savoir quels index ont changé.

1. Préparer les fichiers d’index#

Les définitions d’index sont livrées dans lib/tst-ldif.jar de la distribution TosDJ. Prenez le fichier de la nouvelle version :

bash
INSTALL_DIR=~/tosdj/install

unzip -p "$INSTALL_DIR"/lib/tst-ldif.jar ldif/sfha/cts-indices.ldif \
  | sed 's/@DB_NAME@/userRoot/g' > index-cts.ldif
unzip -p "$INSTALL_DIR"/lib/tst-ldif.jar ldif/opendj/opendj_user_index.ldif \
  | sed 's/@DB_NAME@/userRoot/g' > index-user.ldif

userRoot est le nom du backend créé par le setup. Les fichiers à appliquer dépendent du profil du serveur :

Faites défiler le tableau
ProfilFichiers
ctsindex-cts.ldif
configindex-user.ldif puis index-cts.ldif
userindex-user.ldif

2. Créer les index manquants#

Appliquez chaque fichier séparément : index-cts.ldif ne se termine pas par une ligne vide, et le contenu d’un fichier concaténé à sa suite serait rattaché à sa dernière entrée.

bash
for f in index-cts.ldif; do   # fichiers du profil, voir le tableau
  "$INSTALL_DIR"/bin/ldapmodify -h "$(hostname -f)" -p 1389 \
    -D "cn=Directory Manager" -j ~/tosdj/pwd.txt \
    --defaultAdd --continueOnError -f "$f"
done

~/tosdj/pwd.txt est un fichier qui contient le mot de passe de cn=Directory Manager ; supprimez-le après la procédure. --continueOnError passe les index déjà présents : chacun produit un message Entry Already Exists, sans conséquence. Seuls les index manquants sont créés.

3. Reconstruire les index#

Un index ajouté à un serveur en marche est dégradé : il existe, mais n’est pas utilisé tant qu’il n’a pas été reconstruit. La reconstruction s’exécute comme une tâche, sans arrêter le serveur, et ne traite que les index dégradés :

bash
"$INSTALL_DIR"/bin/rebuild-index --hostname "$(hostname -f)" --port 4444 \
  --bindDN "cn=Directory Manager" --bindPasswordFile ~/tosdj/pwd.txt --trustAll \
  --baseDN dc=tosit,dc=org --rebuildDegraded

La commande rend la main quand la tâche est terminée :

texte
Rebuild Index task 20261003185131273 scheduled to start immediately
Rebuild Index task 20261003185131273 has been successfully completed

Sa durée dépend du nombre d’entrées. Sur un CTS de plusieurs millions de jetons, lancez-la hors période de charge. Jusqu’à la fin de la tâche, les recherches concernées restent non indexées, comme avant la procédure.

4. Vérifier#

L’attribut debugsearchindex demande à TosDJ comment il traiterait une recherche, sans l’exécuter :

bash
"$INSTALL_DIR"/bin/ldapsearch -h "$(hostname -f)" -p 1389 \
  -D "cn=Directory Manager" -j ~/tosdj/pwd.txt \
  -b "ou=famrecords,ou=openam-session,ou=tokens,dc=tosit,dc=org" \
  "(coreTokenType=SAML2)" debugsearchindex
Faites défiler le tableau
RéponseSignification
[INDEX:coreTokenType.equality][COUNT:0]Index utilisé
[INDEX:coreTokenType.equality][NOT-INDEXED]Index créé mais pas encore reconstruit : refaire l’étape 3
[NOT-INDEXED] seulIndex absent : refaire l’étape 2

Limite d’un index d’égalité sur un attribut peu varié#

Un index TosDJ cesse de suivre une valeur quand plus de 4 000 entrées la portent (index-entry-limit). La recherche sur cette valeur redevient alors non indexée, et la réponse de debugsearchindex contient [LIMIT-EXCEEDED].

coreTokenType ne prend que quelques valeurs (SESSION, OAUTH, SAML2…). Au-delà de 4 000 sessions ouvertes, la liste des sessions sans filtre parcourt donc de nouveau tout le CTS. La liste filtrée par utilisateur, que la console utilise dès qu’on saisit un nom, s’appuie sur un autre index et reste rapide quel que soit le nombre de sessions.

Conteneurs et Kubernetes#

La procédure est la même, exécutée dans le conteneur. Les images n’ont pas unzip : extrayez les fichiers sur le poste d’administration après avoir copié tst-ldif.jar hors de l’image (docker cp ou kubectl cp), puis envoyez chaque fichier sur l’entrée standard :

bash
kubectl exec -i tosdj-cts-0 -- sh -c 'cat > /tmp/f.ldif; ldapmodify -h localhost -p 1389 \
    -D "cn=Directory Manager" -j /run/secrets/tosdj/root-password \
    --defaultAdd --continueOnError -f /tmp/f.ldif; rm -f /tmp/f.ldif' < index-cts.ldif

Avec Docker, remplacez kubectl exec -i <pod> -- par docker exec -i <conteneur>.

Pour aller plus loin#

Mis à jour le