Depuis hier j'essaye de régler un problème récalcitrant qui revient jour après jours et qui s’aggrave.
Avec Nextcloud ce problème apparaît de temps en temps (tout les jours), mais là depuis une heure il n'est plus possible de faire fonctionner ZoneMinder plus de trente seconde avant qu'il crash (alors qu'il fonctionnait tranquillement depuis des mois).
voila le type d'erreur dans service mysql status :
févr. 25 17:55:23 0rionBDDServerOne mysqld[2497]: 2018-02-25 17:55:23 139928900781824 [Warning] Aborted connection 170242 to db: 'nextcloud' user: 'nextcloud' host: '10.8.10.69' (Got an error reading communication packets)
févr. 25 17:58:56 0rionBDDServerOne mysqld[2497]: 2018-02-25 17:58:56 139928895104768 [Warning] Aborted connection 170665 to db: 'nextcloud' user: 'nextcloud' host: '10.8.10.69' (Got an error reading communication packets)
mars 01 10:43:05 0rionBDDServerTwo mysqld[2795]: 2018-03-01 10:43:05 140374565336832 [Warning] Aborted connection 416000 to db: 'nextcloud' user: 'nextcloud' host: '127.0.0.1' (Got an error reading communication packets)
Ici le client et le serveur sont sur la même machine (donc 127.0.0.1), mais si je renvoie les requêtes sur un autre nœud j'ai exactement la même erreur lors du lancement de zoneminder. C'est encore un retour de service mysql status
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956546344704 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956543121152 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956143269632 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956546344704 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956142663424 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
mar 05 13:34:39 Memory1 mysqld[1907]: 2018-03-05 13:34:39 139956546344704 [Warning] Aborted connection 1745 to db: 'ZoneMinder' user: 'zm_bbd_user' host: '127.0.0.1' (Got an error reading communication packets)
Nextcloud lui affiche ce genre d'erreur ( /nextcloud/data/nextcloud.log ) :
[Sat Mar 03 14:24:07.094379 2018] [:error] [pid 16088] [client 10.8.42.1:45210] {"reqId":"1VqokvAET3Kq1TXhbGEi","level":3,"time":"2018-03-03T13:24:07+00:00","remoteAddr":"10.8.42.1","user":"myUser","app":"PHP","method":"POST","url":"\\/index.php\\/avatar\\/cropped","message":"unlink(\\/media\\/Nextcloud2018\\/appdata_oc7ux9zy7hky\\/avatar\\/myUser\\/avatar.32.png): Permission denied at \\/var\\/www\\/html\\/services\\/nextcloud2018\\/lib\\/private\\/Files\\/Storage\\/Local.php#225","userAgent":"Mozilla\\/4.2 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko\\/20420101 Firefox\\/42.666","version":"13.0.0.14"}
[Sat Mar 03 14:26:05.938124 2018] [:error] [pid 16088] [client 10.8.42.1:45210] {"reqId":"1VqokvAET3Kq1TXhbGEi","level":3,"time":"2018-03-03T13:26:05+00:00","remoteAddr":"10.8.42.1","user":"myUser","app":"PHP","method":"POST","url":"\\/index.php\\/avatar\\/cropped","message":"PDO::commit(): MySQL server has gone away at \\/var\\/www\\/html\\/services\\/nextcloud2018\\/3rdparty\\/doctrine\\/dbal\\/lib\\/Doctrine\\/DBAL\\/Connection.php#1235","userAgent":"Mozilla\\/4.2 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko\\/20420101 Firefox\\/42.666","version":"13.0.0.14"}
[Sat Mar 03 14:26:05.939454 2018] [:error] [pid 16088] [client 10.8.42.1:45210] {"reqId":"1VqokvAET3Kq1TXhbGEi","level":3,"time":"2018-03-03T13:26:05+00:00","remoteAddr":"10.8.42.1","user":"myUser","app":"PHP","method":"POST","url":"\\/index.php\\/avatar\\/cropped","message":"PDO::commit(): Error reading result set's header at \\/var\\/www\\/html\\/services\\/nextcloud2018\\/3rdparty\\/doctrine\\/dbal\\/lib\\/Doctrine\\/DBAL\\/Connection.php#1235","userAgent":"Mozilla\\/4.2 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko\\/20420101 Firefox\\/42.666","version":"13.0.0.14"}
[Sat Mar 03 14:26:05.950780 2018] [:error] [pid 16088] [client 10.8.42.1:45210] {"reqId":"1VqokvAET3Kq1TXhbGEi","level":3,"time":"2018-03-03T13:26:05+00:00","remoteAddr":"10.8.42.1","user":"myUser","app":"core","method":"POST","url":"\\/index.php\\/avatar\\/cropped","message":"Exception: {\\"Exception\\":\\"Doctrine\\\\\\\\DBAL\\\\\\\\Exception\\\\\\\\DriverException\\",\\"Message\\":\\"An exception occurred while executing 'UPDATE `oc_filecache` SET `size`=? WHERE (`size` <> ? OR `size` IS NULL) AND `fileid` = ? ' with params [-1, -1, \\\\\\"63\\\\\\"]:\\\\n\\\\nSQLSTATE[HY000]: General error: 2006 MySQL server has gone away\\",\\"Code\\":0,\\"Trace\\":\\"#0 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/3rdparty\\\\\\/doctrine\\\\\\/dbal\\\\\\/lib\\\\\\/Doctrine\\\\\\/DBAL\\\\\\/DBALException.php(128): Doctrine\\\\\\\\DBAL\\\\\\\\Driver\\\\\\\\AbstractMySQLDriver->convertException('An exception oc...', Object(Doctrine\\\\\\\\DBAL\\\\\\\\Driver\\\\\\\\PDOException))\\\\n#1 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/3rdparty\\\\\\/doctrine\\\\\\/dbal\\\\\\/lib\\\\\\/Doctrine\\\\\\/DBAL\\\\\\/Connection.php(855): Doctrine\\\\\\\\DBAL\\\\\\\\DBALException::driverExceptionDuringQuery(Object(Doctrine\\\\\\\\DBAL\\\\\\\\Driver\\\\\\\\PDOMySql\\\\\\\\Driver), Object(Doctrine\\\\\\\\DBAL\\\\\\\\Driver\\\\\\\\PDOException), 'UPDATE `oc_file...', Array)\\\\n#2 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/DB\\\\\\/Connection.php(195): Doctrine\\\\\\\\DBAL\\\\\\\\Connection->executeQuery('UPDATE `oc_file...', Array, Array, NULL)\\\\n#3 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Cache\\\\\\/Cache.php(320): OC\\\\\\\\DB\\\\\\\\Connection->executeQuery('UPDATE `oc_file...', Array)\\\\n#4 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Cache\\\\\\/Scanner.php(414): OC\\\\\\\\Files\\\\\\\\Cache\\\\\\\\Cache->update('63', Array)\\\\n#5 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Cache\\\\\\/Scanner.php(337): OC\\\\\\\\Files\\\\\\\\Cache\\\\\\\\Scanner->scanChildren('appdata_oc7ux9z...', false, 3, '63', true)\\\\n#6 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/View.php(1327): OC\\\\\\\\Files\\\\\\\\Cache\\\\\\\\Scanner->scan('appdata_oc7ux9z...', false)\\\\n#7 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/View.php(1371): OC\\\\\\\\Files\\\\\\\\View->getCacheEntry(Object(OCA\\\\\\\\Files_Trashbin\\\\\\\\Storage), 'appdata_oc7ux9z...', '\\\\\\/appdata_oc7ux9...')\\\\n#8 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Node\\\\\\/Root.php(198): OC\\\\\\\\Files\\\\\\\\View->getFileInfo('\\\\\\/appdata_oc7ux9...')\\\\n#9 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Node\\\\\\/Folder.php(133): OC\\\\\\\\Files\\\\\\\\Node\\\\\\\\Root->get('\\\\\\/appdata_oc7ux9...')\\\\n#10 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/AppData\\\\\\/AppData.php(89): OC\\\\\\\\Files\\\\\\\\Node\\\\\\\\Folder->get('preview')\\\\n#11 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/AppData\\\\\\/AppData.php(105): OC\\\\\\\\Files\\\\\\\\AppData\\\\\\\\AppData->getAppDataFolder()\\\\n#12 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Preview\\\\\\/Watcher.php(97): OC\\\\\\\\Files\\\\\\\\AppData\\\\\\\\AppData->getFolder(506888)\\\\n#13 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Preview\\\\\\/WatcherConnector.php(68): OC\\\\\\\\Preview\\\\\\\\Watcher->postDelete(Object(OC\\\\\\\\Files\\\\\\\\Node\\\\\\\\NonExistingFile))\\\\n#14 [internal function]: OC\\\\\\\\Preview\\\\\\\\WatcherConnector->OC\\\\\\\\Preview\\\\\\\\{closure}(*** sensitive parameters replaced ***)\\\\n#15 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Hooks\\\\\\/EmitterTrait.php(99): call_user_func_array(Object(Closure), Array)\\\\n#16 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Hooks\\\\\\/PublicEmitter.php(36): OC\\\\\\\\Hooks\\\\\\\\BasicEmitter->emit('\\\\\\\\\\\\\\\\OC\\\\\\\\\\\\\\\\Files', 'postDelete', Array)\\\\n#17 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Node\\\\\\/Root.php(136): OC\\\\\\\\Hooks\\\\\\\\PublicEmitter->emit('\\\\\\\\\\\\\\\\OC\\\\\\\\\\\\\\\\Files', 'postDelete', Array)\\\\n#18 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/Node\\\\\\/File.php(118): OC\\\\\\\\Files\\\\\\\\Node\\\\\\\\Root->emit('\\\\\\\\\\\\\\\\OC\\\\\\\\\\\\\\\\Files', 'postDelete', Array)\\\\n#19 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Files\\\\\\/SimpleFS\\\\\\/SimpleFile.php(104): OC\\\\\\\\Files\\\\\\\\Node\\\\\\\\File->delete()\\\\n#20 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Avatar.php(163): OC\\\\\\\\Files\\\\\\\\SimpleFS\\\\\\\\SimpleFile->delete()\\\\n#21 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Avatar.php(138): OC\\\\\\\\Avatar->remove()\\\\n#22 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/core\\\\\\/Controller\\\\\\/AvatarController.php(329): OC\\\\\\\\Avatar->set('\\\\\\\\x89PNG\\\\\\\\r\\\\\\\\n\\\\\\\\x1A\\\\\\\\n\\\\\\\\x00\\\\\\\\x00\\\\\\\\x00\\\\\\\\rIHD...')\\\\n#23 [internal function]: OC\\\\\\\\Core\\\\\\\\Controller\\\\\\\\AvatarController->postCroppedAvatar(Array)\\\\n#24 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/AppFramework\\\\\\/Http\\\\\\/Dispatcher.php(161): call_user_func_array(Array, Array)\\\\n#25 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/AppFramework\\\\\\/Http\\\\\\/Dispatcher.php(91): OC\\\\\\\\AppFramework\\\\\\\\Http\\\\\\\\Dispatcher->executeController(Object(OC\\\\\\\\Core\\\\\\\\Controller\\\\\\\\AvatarController), 'postCroppedAvat...')\\\\n#26 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/AppFramework\\\\\\/App.php(115): OC\\\\\\\\AppFramework\\\\\\\\Http\\\\\\\\Dispatcher->dispatch(Object(OC\\\\\\\\Core\\\\\\\\Controller\\\\\\\\AvatarController), 'postCroppedAvat...')\\\\n#27 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/AppFramework\\\\\\/Routing\\\\\\/RouteActionHandler.php(47): OC\\\\\\\\AppFramework\\\\\\\\App::main('OC\\\\\\\\\\\\\\\\Core\\\\\\\\\\\\\\\\Control...', 'postCroppedAvat...', Object(OC\\\\\\\\AppFramework\\\\\\\\DependencyInjection\\\\\\\\DIContainer), Array)\\\\n#28 [internal function]: OC\\\\\\\\AppFramework\\\\\\\\Routing\\\\\\\\RouteActionHandler->__invoke(Array)\\\\n#29 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/private\\\\\\/Route\\\\\\/Router.php(297): call_user_func(Object(OC\\\\\\\\AppFramework\\\\\\\\Routing\\\\\\\\RouteActionHandler), Array)\\\\n#30 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/lib\\\\\\/base.php(998): OC\\\\\\\\Route\\\\\\\\Router->match('\\\\\\/avatar\\\\\\/cropped')\\\\n#31 \\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/index.php(37): OC::handleRequest()\\\\n#32 {main}\\",\\"File\\":\\"\\\\\\/var\\\\\\/www\\\\\\/html\\\\\\/services\\\\\\/nextcloud2018\\\\\\/3rdparty\\\\\\/doctrine\\\\\\/dbal\\\\\\/lib\\\\\\/Doctrine\\\\\\/DBAL\\\\\\/Driver\\\\\\/AbstractMySQLDriver.php\\",\\"Line\\":115}","userAgent":"Mozilla\\/5.0 (X11; Ubuntu; Linux x86_64; rv:58
[Sat Mar 03 14:26:05.959028 2018] [:error] [pid 16088] [client 10.8.42.1:45210] {"reqId":"1VqokvAET3Kq1TXhbGEi","level":3,"time":"2018-03-03T13:26:05+00:00","remoteAddr":"10.8.42.1","user":"myUser","app":"PHP","method":"POST","url":"\\/index.php\\/avatar\\/cropped","message":"fopen(\\/media\\/Nextcloud2018\\/\\/nextcloud.log): failed to open stream: Permission denied at \\/var\\/www\\/html\\/services\\/nextcloud2018\\/lib\\/private\\/Log\\/File.php#135","userAgent":"Mozilla\\/4.2 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko\\/20420101 Firefox\\/42.666","version":"13.0.0.14"}
La commande "top" lancée sur les membres du cluster indiquent qu'ils glandent sévère, le temps de réponse est de 1ms (d'après HaProxy).
J'ai testé les solutions indiquées ici mais rien n'y fait :
- https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/
- https://dba.stackexchange.com/questions/40899/mysql-error-reading-communication-packets
SVP de l'aide 😿 😿 😿
# Galera la galère
Posté par voxdemonix . Évalué à 1. Dernière modification le 05 mars 2018 à 17:37.
[TROLL]
J'ai l’impression que ce logiciel (qui est le seul de sa catégorie, PostGreSQL étant seulement en train de finaliser la partie cluster (et n'étant pas compatible avec la majorité des projets) et MySQL Cluster étant une vrai bouse) est une vrai mine de bug, de lag et de problèmes.
J'ai déjà eu des soucis avec zoneminder qui crashait toutes les dix minutes, problème qui s'est auto-révolut au bout d'un temps. Et maintenant c'est problème en série avec les services qui sont tous devenu instable uniquement a cause de ce foutu logiciel.
Tellement capricieux a un moment j'avais des erreurs a chaque fois que top indiquait une utilisation de plus de 70% des ressources de la machine.
Là je me tape des erreurs alors que la machine est a 1% de ces capacités et que la majorité des noeuds sont relié au même switch (un pro).
Pour l'anecdote, les crash complet d'aujourd'hui partent tout simplement d'un changement dans le fichier /etc/hosts afin de remplacer les IP des deux nœuds principaux (sur 3) puis les redémarrer.
Et sans compter que quasi personne ne fait tourner des clusters de database (et ceux qui en font tourné fréquente peu les communautés DIY), ce n'est donc jamais possible de trouver de l'aide.
Ce logiciel porte trop bien son nom, Galera …
[^] # Re: Galera la galère
Posté par voxdemonix . Évalué à 1.
Les erreurs ré-apparaissent après un formatage intégrale des machines. (je suis passé par la case formatage car impossible de reconnecter les noeuds du cluster et ce même en supprimant tout les fichiers/dossiers de mariadb et le désinstallant puis ré-installant).
La logique très abstraite des programmeurs…
[^] # Re: Galera la galère
Posté par NeoX . Évalué à 2.
sans remettre en cause la pertinence de ton montage,
si personne ne fait de cluster de base de données MYSQL, c'est peut-etre que personne n'a eu besoin d'autant de performance/perennité de ses données,
ou qu'il existe d'autres moteurs plus adaptés.
à une epoque quand on faisait des bases mysql repliquées, c'etait juste une question d'index, genre pair/impair si c'etait un cluster avec 2 machines.
[^] # Re: Galera la galère
Posté par voxdemonix . Évalué à 1.
A mon avis c'est plus tôt suite a la complexité de la mise en place (stable je veux dire car créer un cluster est facile). Ainsi qu'au fait qu'il faut connaître l'existence du clustering.
Le besoin je suppose ne pas être le seul dans ce cas (il y a quand même beaucoup de petits hébergeurs et le backup n'apporte pas la haute dispo (et quand un service plante plus de 5 minutes les utilisateurs pètent un plombs ^ ^ sans compter qu'en cas de panne je n'ai pas forcément de machine "sûr" sous la main et encore moins l'envie de me déplacer hihi )).
La je pré-suppose que l'erreur doit provenir de ma configuration mais elle n'a pas changé c'est zarb.
PS: fais pas attention au troll, ca fait 3-4 jours que je galère ^ ^
[^] # Re: Galera la galère
Posté par voxdemonix . Évalué à 1.
Enfaîte, même en désactivant le cluster et en passant par 127.0.0.1 (donc en tapant le service client sur la même machine), je me tape des "Got an error reading communication packets". Je m'en viens sérieusement à me demander si l'origine de tout ce brolle ne proviendrait pas de mariadb 10.2 qui serait buggé. (ou alors les bdd sont corrompues mais alors pourquoi n'y a-t-il aucun message type "database corrupted" et que ca fonctionne quand même par intermittence ?)
[^] # Re: Galera la galère
Posté par Ambroise . Évalué à 2.
Si tu connectes directement à la base de données via la CLI avec le compte de nextcloud, ça donne quoi ?
[^] # Re: Galera la galère
Posté par voxdemonix . Évalué à 1. Dernière modification le 09 mars 2018 à 23:03.
Il ne semble rien y avoir de spécial (en tout cas rien d'indiqué).
Pour le moment les services semblent refonctionner mais dans service mysql status je continue d'avoir des erreurs comme suit. Ça provoque des erreurs de chargements de page par moment voir le crash de zoneminder.
Note : j'ai re-purgé mariadb et galera puis ré-installé, ré-injecté mes backup et cluster désactivé (mode mono-machine).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.