Je veux tester automatiquement si un logiciel réagit comme prévu si un fichier DB SQLite essentiel ne parvient pas à être lu (provoquant une erreur d'E / S). C'est exactement ce qui s'est passé il y a quelques jours chez un client. Nous l'avons corrigé manuellement mais maintenant je veux créer du code automatique pour le réparer et j'ai besoin d'accéder à un fichier cassé pour le tester.
Comme tout dans Unix est un fichier, je soupçonne qu'il pourrait y avoir un fichier spécial qui provoque toujours des erreurs d'E / S quand on essaie de le lire (par exemple dans / dev).
Certains fichiers similaires (imo) seraient:
/dev/full
qui dit toujours "Il n'y a plus d'espace sur l'appareil" si vous essayez de l'écrire/dev/null
et/dev/zero
j'ai donc supposé qu'il devait juste y avoir un fichier comme ça (mais je n'en ai pas encore trouvé).
Est-ce que quelqu'un connaît un tel fichier ou toute autre méthode pour que j'obtienne le résultat souhaité (une image de partition intentionnellement défectueuse, un wrapper autour de open () en utilisant LD_PRELOAD, ...)?
Quelle est la meilleure façon d'aller ici?
Réponses:
Vous pouvez utiliser
dmsetup
pour créer un périphérique de mappage de périphérique à l'aide des cibleserror
ouflakey
pour simuler les échecs.Où 123 est la longueur du périphérique, en secteurs et / dev / loop0 est le périphérique d'origine sur lequel vous souhaitez simuler les erreurs. Pour l'erreur, vous n'avez pas besoin des arguments suivants car il renvoie toujours une erreur.
la source
dmsetup table test
. Vous pouvez même écrirefoo bar
derrièreerror
; cela ne fait rien (et devrait donc être supprimé).Il y a déjà un grand nombre de réponses à cela sur Stack Overflow et Server Fault mais certaines techniques manquaient. Pour vous simplifier la vie, voici une liste des mécanismes d'injection de défaut d'E / S de la machine virtuelle / périphérique de bloc Linux / système de fichiers Linux / bibliothèque d'espace utilisateur Linux:
--layout
option de la page de manuel mdadm pour savoir comment le configurer (bits de l'espace utilisateur du noyau et mdadm).LD_PRELOAD
).FAIL_MAKE_REQUEST=y
).BLK_DEV_NULL_BLK_FAULT_INJECTION=y
).delay
ouerror
, puis attachez-lui un périphérique de bloc vianbd-client
(noyau + bits d'espace utilisateur NBD, noyau> = 4.18 construit avec le support NBD, nbdclient> = 3.18 et nbdkit> = 1.8.1 recommandé - voir la vidéo de démonstration de NBDKit vers 20 minutes).Bonus: SQLite dispose d'un pilote VFS pour simuler les erreurs afin d'obtenir une bonne couverture de test.
En relation:
la source
Vous voulez un mécanisme d' injection de défaut pour les E / S.
Sous Linux, voici une méthode qui ne nécessite aucune configuration préalable et génère une erreur inhabituelle (pas EIO «Erreur d'entrée / sortie» mais ESRCH «Aucun processus de ce type»):
où 1234 est le PID d'un processus exécuté sous le même utilisateur que le processus que vous testez, mais pas ce processus lui-même. Crédits à rubasov pour penser de
/proc/$pid/mem
.Si vous utilisez le PID du processus lui-même, vous obtenez EIO, mais uniquement si vous lisez à partir d'une zone qui n'est pas mappée dans la mémoire du processus. La première page n'est jamais mappée, donc c'est correct si vous lisez le fichier séquentiellement, mais ne convient pas à un processus de base de données qui cherche directement au milieu du fichier.
Avec un peu plus de configuration en tant que root, vous pouvez utiliser le mappeur de périphériques pour créer des fichiers avec des secteurs valides et des secteurs défectueux.
Une autre approche serait d'implémenter un petit système de fichiers FUSE . EIO est le code d'erreur par défaut lorsque votre pilote de système de fichiers de l'espace utilisateur fait quelque chose de mal, il est donc facile à réaliser. Les liaisons Perl et Python sont accompagnées d'exemples pour commencer, vous pouvez rapidement écrire un système de fichiers qui reflète principalement les fichiers existants mais injecte un EIO à des endroits soigneusement choisis. Il existe un tel système de fichiers: petardfs ( article ), je ne sais pas comment cela fonctionne hors de la boîte.
Pourtant, une autre méthode est un
LD_PRELOAD
wrapper. Un système existant est Libfiu (injection de défauts dans l'espace utilisateur). Il fonctionne en préchargeant une bibliothèque qui surcharge les appels de l'API POSIX. Vous pouvez écrire des directives simples ou du code C arbitraire pour remplacer le comportement normal.la source
La solution est beaucoup plus simple si vous pouvez utiliser un fichier de périphérique comme "fichier avec des erreurs d'E / S". Ma proposition concerne les cas où un fichier ordinaire comportera de telles erreurs.
Je dois admettre que je suis un peu confus car je n'ai pas réussi à lire des secteurs uniques de ce fichier sans erreur (avec
dd .. seek=...
). C'est peut-être un problème de lecture anticipée.la source
Vous pouvez utiliser CharybdeFS qui a été fait exactement pour ce genre de but.
C'est un système de fichiers de fusible passthrough comme PetardFS mais beaucoup plus configurable.
Voir le livre de recettes CharybdeFS ici: http://www.scylladb.com/2016/05/02/fault-injection-filesystem-cookbook/
Il est suffisamment avancé pour tester une base de données.
la source