| 1 |
<?xml version="1.0" encoding="UTF-8"?> |
|---|
| 2 |
<!-- DerniÚre modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
<sect1 id="raceconditions"><title>Situations de compétition et &slony1;</title> |
|---|
| 7 |
|
|---|
| 8 |
<indexterm><primary>situations de compétition</primary></indexterm> |
|---|
| 9 |
|
|---|
| 10 |
<para> Non, il ne s'agit pas compétitions sportives; |
|---|
| 11 |
<ulink url="http://www.wikipedia.org/"> Wikipedia </ulink> |
|---|
| 12 |
décrit ce terme ainsi : <quote>Une situation de compétition, plus couramment nommée race condition, est un défaut dans un systÚme électronique ou informatique, non prévu lors de la conception, caractérisé par un résultat différent selon l'ordre dans lequel sont effectuées certaines opérations du systÚme. Lorsqu'une situation de compétition se produit, cela peut avoir des effets néfastes pendant une longue période, et le systÚme peut nécessiter d'être réinitialisé.</quote> |
|---|
| 13 |
|
|---|
| 14 |
Dans les applications informatiques, les situations de compétitions arrivent la plupart du temps |
|---|
| 15 |
au sein des applications distribuées ou multiprocesseurs lorsque différentes partie |
|---|
| 16 |
de l'application dépendent de certains éléments partagé; si ce partage |
|---|
| 17 |
est mal géré, des confusions (erreurs !) apparaissent. Plus précisément, |
|---|
| 18 |
cela impliquent en général les situations où l'état de partage peut |
|---|
| 19 |
être changé entre le moment ou il est vérifié et le moment ou il est utilisé. |
|---|
| 20 |
</para> |
|---|
| 21 |
|
|---|
| 22 |
<para> &slony1; a connu un certain nombre de situations de compétition au cours de son histoire : |
|---|
| 23 |
|
|---|
| 24 |
<itemizedlist> |
|---|
| 25 |
|
|---|
| 26 |
<listitem><para> Entre la version 1.0 et la version 1.1, |
|---|
| 27 |
<xref linkend="stmtmoveset"/> a avait un problÚme car les noeuds n'avait |
|---|
| 28 |
aucun moyen d'empêcher le traitement des événements <command>SYNC</command> |
|---|
| 29 |
en provenance du noeud origine ( qu'ils considéraient comme un simple fournisseur, |
|---|
| 30 |
et pas comme une source de données à répliquer) avant de reconnaître le changement |
|---|
| 31 |
de rÎle ( d'abonné à fournisseur ).</para> |
|---|
| 32 |
|
|---|
| 33 |
<para> Ceci fût corrigé en introduisant un nouvel événement <command>ACCEPT |
|---|
| 34 |
SET</command> qui était soumis par le nouveau noeud origine; Ceci permettait |
|---|
| 35 |
aux abonnés d'être conscients qu'il devait attendre l'événement |
|---|
| 36 |
<command> MOVE SET </command>.</para> </listitem> |
|---|
| 37 |
|
|---|
| 38 |
<listitem><para>Dans un certain nombre d'endroits, &slony1; utilise la commande |
|---|
| 39 |
SQL <command>lock table sl_config_lock;</command> afin d'éviter les |
|---|
| 40 |
situations de compétitions lorsque la valeur de la séquence |
|---|
| 41 |
sl_log_status est changée. </para> |
|---|
| 42 |
</listitem> |
|---|
| 43 |
|
|---|
| 44 |
<listitem><para> L'option &lslon; <xref |
|---|
| 45 |
linkend="slon-config-sync-interval-timeout"/> est utilisée pour éviter les situations |
|---|
| 46 |
de compétition dans lesquelles la séquence d'action est dégagée par le trigger |
|---|
| 47 |
au moment de l'insertion de ligne de log, ce qui rend le <quote>dégagement</quote> immédiatement |
|---|
| 48 |
visible au processus de synchronisation, alors que la ligne de log correspondante |
|---|
| 49 |
n'est pas encore visible. </para> </listitem> |
|---|
| 50 |
|
|---|
| 51 |
<listitem><para> L'approche dite de <quote>visibilité des images</quote> |
|---|
| 52 |
utilisée par &slony1; pour déterminer quelle donnée répliquée doivent |
|---|
| 53 |
être associée avec un <command>SYNC</command> spécifique, évite les |
|---|
| 54 |
situations de compétition qui se produisent lorsque l'on essaie d'utiliser |
|---|
| 55 |
simplement des timestamps ou des plages d'identifiants pour déterminer |
|---|
| 56 |
quelles données doivent être répliquées. </para> </listitem> |
|---|
| 57 |
|
|---|
| 58 |
<listitem><para> Dans la branche 1.2, jusqu'Ã la version 1.2.11, |
|---|
| 59 |
qui corrige ce bug, le <link linkend="logshipping"> log shipping </link> |
|---|
| 60 |
avait une situation de compétition où chaque fois que la configuration |
|---|
| 61 |
était rechargée par le &lslon; ( comme cela arrive souvent, notamment avec |
|---|
| 62 |
linkend="stmtsubscribeset"/>), il y avait un risque que les identifiant de |
|---|
| 63 |
<command>SYNC</command> utilisé pour l'ordonnancement correct et pour l'exécution |
|---|
| 64 |
du log shipping soient décalées d'une unité.</para> |
|---|
| 65 |
|
|---|
| 66 |
<para> Ceci fut corrigé dans la version 1.2.11 en transformant le numéro d'identifant, |
|---|
| 67 |
qui était un variable située en mémoire (donc génératrice de problÚmes ) en un donnée |
|---|
| 68 |
transactionnelle, stockée dans la base de donnée de l'abonné.</para> |
|---|
| 69 |
|
|---|
| 70 |
<para> Ce problÚme ne fut jamais découvert lors des <link linkend="testbed"> |
|---|
| 71 |
bancs d'essai, </link> démontrant joliment que les situations de compétitions |
|---|
| 72 |
sont souvent trÚs dépendantes du type de données stockée ou du rythme de l'application. </para> |
|---|
| 73 |
</listitem> |
|---|
| 74 |
|
|---|
| 75 |
</itemizedlist> |
|---|
| 76 |
|
|---|
| 77 |
</para> |
|---|
| 78 |
|
|---|
| 79 |
</sect1> |
|---|