J'ai essayé d'utiliser le paquet de threads RTS avec MySQL mais je suis resté bloqué au niveau des problèmes suivants :
Ils utilisent une veille version avec beaucoup d'appels POSIX et il est vraiment difficile de créer une couche d'abstraction pour toutes les fonctions. Je pense qu'il serait plus facile de changer la bibliothèque des threads pour qu'elle suive les nouvelles spécifications POSIX.
Quelques couches d'abstractions sont déjà écrites. Voyez
mysys/my_pthread.c
pour plus d'informations.
Au minimum, ce qui suit devra être changé :
pthread_get_specific
doit utiliser un seul
argument. sigwait
doit prendre deux arguments.
Beaucoup de fonctions (du moins
pthread_cond_wait
,
pthread_cond_timedwait
) doivent retourner le
code erreur lorsqu'elles en rencontrent. Elle retournent à
présent -1 et définissent errno
.
Un autre problème est que les threads au niveau utilisateurs
utilisent les signaux ALRM
et que ceux-ci fait
échouer beaucoup de fonctions (read
,
write
, open
...). MySQL
devrait faire une autre tentative à chaque interruption mais cela
n'est pas facile à vérifier.
Le plus gros problème non-résolu est le suivant :
Pour avoir des alertes au niveau des threads, j'ai changé
mysys/thr_alarm.c
pour avoir une attente
entre les alarmes avec
pthread_cond_timedwait()
, mais cela échoue
avec une erreur EINTR
. J'ai essayé de
déboguer la bibliothèque des threads pour voir d'où cela
venait, mais je n'ai pu trouver aucune solution simple.
Si quelqu'un veut utiliser MySQL avec les threads RTS je suggère ce qui suit :
Changez les fonctions que MySQL utilise à partir de la bibliothèque des threads en POSIX. Cela ne devrait pas vous prendre beaucoup de temps.
Compilez toutes les bibliothèques avec
-DHAVE_rts_threads
.
Compilez thr_alarm
.
S'il y a de petites différences dans l'implémentation, elles
peuvent être corrigées en changeant les fichiers
my_pthread.h
et
my_pthread.c
.
Exécutez thr_alarm
. S'il tourne sans aucun
message du type ``warning
'',
``error
'' ou
``aborted
'', vous êtes sur le bon chemin.
Voici une bonne exécution se déroulant sur Solaris :
Main thread: 1 Thread 0 (5) started Thread: 5 Waiting process_alarm Thread 1 (6) started Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 1 (1) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 2 (2) sec Thread: 6 Simulation of no alarm needed Thread: 6 Slept for 0 (3) sec Thread: 6 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 4 (4) sec Thread: 6 Waiting process_alarm thread_alarm Thread: 5 Slept for 10 (10) sec Thread: 5 Waiting process_alarm process_alarm thread_alarm Thread: 6 Slept for 5 (5) sec Thread: 6 Waiting process_alarm process_alarm ... thread_alarm Thread: 5 Slept for 0 (1) sec end
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.