Projekt

Obecné

Profil

Chyba #254

uzavřený

Chyba #405: Deadlocky

Deadlock při operací nad IP adresami, zařízeními, ...

Přidáno uživatelem pavel zacek před více než 11 roky(ů). Aktualizováno před více než 10 roky(ů).

Stav:
Uzavřený
Priorita:
Urgentní
Přiřazeno:
-
Kategorie:
-
Cílová verze:
Začátek:
Uzavřít do:
% Hotovo:

100%

Odhadovaná doba:

Popis

Deadlock během databázových operací nad IP adresami, zařízeními a ruznými jinými SQL tabulkami, které jsou používány v různých částech systému (web interface, CRON, ...).


Soubory

log.html (1.61 KB) log.html pavel zacek, 2012-08-07 10:13
2012-09-13.log.php (1.31 KB) 2012-09-13.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-11.log.php (1.83 KB) 2012-09-11.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-10.log.php (1.27 KB) 2012-09-10.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-07.log.php (1.31 KB) 2012-09-07.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-20.log.php (1.31 KB) 2012-09-20.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-19.log.php (3.8 KB) 2012-09-19.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-18.log.php (1.31 KB) 2012-09-18.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-16.log.php (1.31 KB) 2012-09-16.log.php Ondřej Fibich, 2012-09-22 22:55
2012-09-15.log.php (1.31 KB) 2012-09-15.log.php Ondřej Fibich, 2012-09-22 22:55

Související úkoly 2 (0 otevřených2 uzavřených)

duplikován Chyba #392: FreenetIS bug report: Mazal jsem jednu ze svych IP adresOdmítnutý

Akce
duplikován Chyba #391: FreenetIS bug report: Mazal jsem jednu ze svych IP adresOdmítnutý

Akce

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Cílová verze nastaven na 1.0

Chyba už se objevila vícekrát, je nutné zjistit její příčinu. (možná nějaké souběžné čtení? chyba v DB serveru)

Aktualizováno uživatelem David Raška před více než 11 roky(ů)

  • Stav změněn z Nový na Uzavřený
  • Přiřazeno nastaven na David Raška
  • % Hotovo změněn z 0 na 100

Opraveno v r1645. Možná příčina - povolené subnety (chyba se objevovala v scheduleru, u mazaní a přidávání zařízení a jediné co tyto akce spojuje jsou právě pocvolené subnety)

Aktualizováno uživatelem David Raška před více než 11 roky(ů)

  • Stav změněn z Uzavřený na Čeká se
  • % Hotovo změněn z 100 na 50

Tak chyba ještě není uzavřena - je potřeba otestovat v ostrém provozu

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Priorita změněn z Normální na Vysoká

Aktualizováno uživatelem Pavel - před více než 11 roky(ů)

Nevim jestli to muze necemu pomoci, ale mazal jsem od uzivatele asi 10 zarizeni protoze si daval NAT a mazal jsem rychle , tzn. jak se obnovila stranka po smazani jednoho zarizeni, hned jsem klikl na krizek pro mazani dalsiho zarizeni.
Napada me ze by se treba nedokoncila operace mazani toho predchoziho zarizeni a s pozadavkem na smazani dalsiho vznikla nejaka kolize?

Pavel Žáček
______________________________________________________

Od:
Komu:
Datum: 09.08.2012 17:22
Předmět: [FreenetIS - Chyba #254] FreenetIS bug report: mazani zarizeni

Úkol #254 byl aktualizován uživatelem Ondřej Fibich.

Cílová verze nastaven na 1.0

Chyba už se objevila vícekrát, je nutné zjistit její příčinu. (možná nějaké souběžné čtení? chyba v DB serveru)

----------------------------------------
Chyba #254: FreenetIS bug report: mazani zarizeni
http://dev.freenetis.org/issues/254#change-453

  • Autor: pavel zacek
  • Stav: Nový
  • Priorita: Normální
  • Přiřazeno:
  • Kategorie:
  • Cílová verze: 1.0
    ----------------------------------------
    Chyba se vyskytla pri mazani celych zarizeni od uzivatele s ID 10

--
Obdrželi jste toto oznámení, protože jste se buď k němu přihlásil, nebo jste se na něm podílel.
Chcete-li změnit nastavení oznámení, klikněte zde: http://dev.freenetis.org/my/account

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Přesně taková situace asi nastala, už by to snad mělo být opraveno.

Ondra Fibich

On 08/17/2012 08:38 AM, wrote:

Úkol #254 byl aktualizován uživatelem Pavel -.

Nevim jestli to muze necemu pomoci, ale mazal jsem od uzivatele asi 10
zarizeni protoze si daval NAT a mazal jsem rychle , tzn. jak se
obnovila stranka po smazani jednoho zarizeni, hned jsem klikl na
krizek pro mazani dalsiho zarizeni.
Napada me ze by se treba nedokoncila operace mazani toho predchoziho
zarizeni a s pozadavkem na smazani dalsiho vznikla nejaka kolize?

Pavel Žáček
//_/_/__________________________________________________

Od:
Komu:
Datum: 09.08.2012 17:22
Předmět: [FreenetIS - Chyba #254
] FreenetIS bug report:
mazani zarizeni

Úkol #254 byl aktualizován
uživatelem Ondřej Fibich.

Cílová verze nastaven na 1.0

Chyba už se objevila vícekrát, je nutné zjistit její příčinu.
(možná nějaké souběžné čtení? chyba v DB serveru)

----------------------------------------
Chyba #254 : FreenetIS bug
report: mazani zarizeni
http://dev.freenetis.org/issues/254#change-453

  • Autor: pavel zacek
  • Stav: Nový
  • Priorita: Normální
  • Přiřazeno:
  • Kategorie:
  • Cílová verze: 1.0
    ----------------------------------------
    Chyba se vyskytla pri mazani celych zarizeni od uzivatele s ID 10

--
Obdrželi jste toto oznámení, protože jste se buď k němu přihlásil,
nebo jste se na něm podílel.
Chcete-li změnit nastavení oznámení, klikněte zde:
http://dev.freenetis.org/my/account


Chyba #254: FreenetIS bug report: mazani zarizeni

  • Autor: pavel zacek
  • Stav: Čeká se
  • Priorita: Vysoká
  • Přiřazeno: David Raška
  • Kategorie:
  • Cílová verze: 1.0

Chyba se vyskytla pri mazani celych zarizeni od uzivatele s ID 10


Obdrželi jste toto oznámení, protože jste se buď k němu přihlásil,
nebo jste se na něm podílel.
Chcete-li změnit nastavení oznámení, klikněte zde:
http://dev.freenetis.org/my/account

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • % Hotovo změněn z 50 na 0

Nepomohlo:

2012-08-17 12:55:04 -- error: Chyba transakce: Chyba v SQL dotazu - Deadlock found when trying to get lock; try restarting transaction v souboru /var/www/freenetis/system/libraries/drivers/Database/Mysql.php na řádku 374 - 
Zásobník #0 /var/www/freenetis/system/libraries/drivers/Database/Mysql.php(99): Mysql_Result->__construct(false, Resource id #30, true, 'INSERT INTO `ip...')
#1 /var/www/freenetis/system/libraries/Database.php(181): Database_Mysql_Driver->query('INSERT INTO `ip...')
#2 /var/www/freenetis/system/libraries/Database.php(884): Database->query('INSERT INTO `ip...')
#3 /var/www/freenetis/system/libraries/ORM.php(787): Database->insert('ip_addresses', Array)
#4 /var/www/freenetis/system/libraries/ORM.php(1567): ORM_Core->save()
#5 /var/www/freenetis/application/controllers/devices.php(1162): ORM_Core->save_throwable()
#6 /var/www/freenetis/system/core/Kohana.php(330): Devices_Controller->add('1344')
#7 [internal function]: Kohana::instance()
#8 /var/www/freenetis/system/core/Event.php(217): call_user_func(Array)
#9 /var/www/freenetis/system/core/Bootstrap.php(55): Event::run('system.execute')
#10 /var/www/freenetis/index.php(86): require('/var/www/freene...')
#11 {main}   URL: cs/devices/add/1344?path_qsurl=devices%2Fshow_by_user%2F1344

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Priorita změněn z Vysoká na Urgentní

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Stav změněn z Čeká se na Nový

Aktualizováno uživatelem David Raška před více než 11 roky(ů)

Další pokus o vyřešení v r1654. Uvidíme jestli bude v pondělí něco v logu.

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Stav změněn z Nový na Uzavřený
  • % Hotovo změněn z 0 na 100

Žádná chyba v logu :-)

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Stav změněn z Uzavřený na Nový
  • % Hotovo změněn z 100 na 0

Ne :-(

2012-08-20 10:31:17 -- error: Chyba transakce: Chyba v SQL dotazu - Deadlock found when trying to get lock; try restarting transaction v souboru /var/www/freenetis/system/libraries/drivers/Database/Mysql.php na řádku 374 - 
Zásobník #0 /var/www/freenetis/system/libraries/drivers/Database/Mysql.php(99): Mysql_Result->__construct(false, Resource id #30, true, 'INSERT INTO `ip...')
#1 /var/www/freenetis/system/libraries/Database.php(181): Database_Mysql_Driver->query('INSERT INTO `ip...')
#2 /var/www/freenetis/system/libraries/Database.php(884): Database->query('INSERT INTO `ip...')
#3 /var/www/freenetis/system/libraries/ORM.php(787): Database->insert('ip_addresses', Array)
#4 /var/www/freenetis/system/libraries/ORM.php(1567): ORM_Core->save()
#5 /var/www/freenetis/application/controllers/devices.php(1162): ORM_Core->save_throwable()
#6 /var/www/freenetis/system/core/Kohana.php(330): Devices_Controller->add('658')
#7 [internal function]: Kohana::instance()
#8 /var/www/freenetis/system/core/Event.php(217): call_user_func(Array)
#9 /var/www/freenetis/system/core/Bootstrap.php(55): Event::run('system.execute')
#10 /var/www/freenetis/index.php(86): require('/var/www/freene...')
#11 {main}   URL: cs/devices/add/658?path_qsurl=devices%2Fshow_by_user%2F658

Aktualizováno uživatelem David Raška před více než 11 roky(ů)

Další pokus o opravu v r1660.

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Stav změněn z Nový na Uzavřený
  • % Hotovo změněn z 0 na 100

Vypdá že OK, snad :-)

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Po delší době jsem prohlédl logy a problém stále přetrvává.

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Přiřazeno smazán (David Raška)

Opět jsem se zkusil problému podívat na kobylku a zjistil jsem, že jsme docela v nezáviděhodné situaci. Strácím víru v InnoDB engine MySQL. Dokumentace radí, že nejlepší způsob jak pracovat s deadlocky, je postižený kód spuzstit znovu, což mi připadá v našem případě jako sci-fi.

Největší problém je u tabulky ip_addresses, která je neskutečně vytěžována:

  1. webové rozhraní pro komunikaci s okolím (přesměrování, monitoring, ulog, ...)
  2. CRON (povolené podsítě)
  3. zařízení (přidávání, mazání)

A když se to všechno udělá zaráz tak to bouchne. Při každém výbuchu je nutné udělat výpis stavu Inna a hodit ho sem. Pak budem moct anylyzovat, co by se dalo udělat, abychom se zbavili a poučili z této obludnosti.

Přikládám poslední deadlock (příkaz SHOW ENGINE INNODB STATUS):

LATEST DETECTED DEADLOCK
------------------------
120927 12:10:13
*** (1) TRANSACTION:
TRANSACTION 0 543342137, ACTIVE 1 sec, process no 1940, OS thread id 140077990967040 starting index read
mysql tables in use 3, locked 3
LOCK WAIT 69 lock struct(s), heap size 14320, 28744 row lock(s)
MySQL thread id 22205728, query id 609321449 localhost freenetis Sending data
UPDATE monitor_hosts mh,
            (
                SELECT i.device_id
                FROM ip_addresses ip
                JOIN ifaces i ON ip.iface_id = i.id
                WHERE ip_address = '10.143.130.163'
            ) ip
            SET
                state = 1,
                state_changed = IF(state <> 1, 1, 0),
                state_changed_date = IF(state <> 1, NOW(), state_changed_date),
                last_attempt_date = NOW(),
                latency_current = '5.84\n',
                latency_min = IF('5.84\n' IS NOT NULL AND (latency_min IS NULL OR latency_min > '5.84\n'), '5.84\n', latency_min),
                latency_max = IF('5.84\n' IS NOT NULL AND (latency_max IS NULL OR latency_max < '5.84\n'), '5.84\n', latency_max),
                latency_avg = (IFNULL(latency_avg,0) * (polls_total - polls_failed) + '5.84\n')/(polls_total + 1 - polls_failed - 0),
                polls_total = polls_total + 1,
                polls_failed = polls_failed + 0,
                availability = ROUND((polls_total + 1 - polls_failed - 0)/(polls_total + 1)*100, 2)
            WHERE ip.device_id = mh.device_id
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 19073 n bits 392 index `PRIMARY` of table `freenetis`.`ip_addresses` trx id 0 543342137 lock mode S locks rec but not gap waiting
Record lock, heap no 53 PHYSICAL RECORD: n_fields 11; compact format; info bits 32
 0: len 4; hex 80004058; asc   @X;; 1: len 6; hex 00002062be41; asc    b A;; 2: len 7; hex 000000003e0b31; asc     > 1;; 3: len 4; hex 80003016; asc   0 ;; 4: len 4; hex 8000023f; asc    ?;; 5: SQL NULL; 6: len 12; hex 31302e3134332e3230372e35; asc 10.143.207.5;; 7: SQL NULL; 8: len 1; hex 80; asc  ;; 9: len 1; hex 80; asc  ;; 10: len 1; hex 80; asc  ;;

*** (2) TRANSACTION:
TRANSACTION 0 543342145, ACTIVE 0 sec, process no 1940, OS thread id 140077993977600 updating or deleting, thread declared inside InnoDB 1
mysql tables in use 1, locked 1
25 lock struct(s), heap size 6752, 14 row lock(s), undo log entries 4
MySQL thread id 22206631, query id 609321519 localhost freenetis updating
DELETE FROM `devices` WHERE `id` = 11634
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 19073 n bits 392 index `PRIMARY` of table `freenetis`.`ip_addresses` trx id 0 543342145 lock_mode X locks rec but not gap
Record lock, heap no 53 PHYSICAL RECORD: n_fields 11; compact format; info bits 32
 0: len 4; hex 80004058; asc   @X;; 1: len 6; hex 00002062be41; asc    b A;; 2: len 7; hex 000000003e0b31; asc     > 1;; 3: len 4; hex 80003016; asc   0 ;; 4: len 4; hex 8000023f; asc    ?;; 5: SQL NULL; 6: len 12; hex 31302e3134332e3230372e35; asc 10.143.207.5;; 7: SQL NULL; 8: len 1; hex 80; asc  ;; 9: len 1; hex 80; asc  ;; 10: len 1; hex 80; asc  ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 11677 n bits 1184 index `iface_id` of table `freenetis`.`ip_addresses` trx id 0 543342145 lock_mode X locks rec but not gap waiting
Record lock, heap no 618 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80003016; asc   0 ;; 1: len 4; hex 80004058; asc   @X;;

*** WE ROLL BACK TRANSACTION (2)

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Předmět změněn z FreenetIS bug report: mazani zarizeni na Deadlock při operací nad IP adresami, zařízeními, ...
  • Popis aktualizován (rozdíl)

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Problém se pokusím vyřešit pomocí opakování selháné transakce do počtu opakování definovaném v nastavení. Samotné opakování realizuju příkazem goto na kód před transakcí (mohl bych tam dát cyklus, který vše obalí, ale to by strašně zaneplešilo kód jakékoliv transakce). Jediou nevýhodou je, že goto je podporované až v PHP 5.3, takže na starší verzi PHP to pojede jako dřív (t.j. špatně).

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Tak nakonec vyhrál cyklus.

Upraveny akce:

IP adresy: mazání, přidávání, editace
Zařízení: mazání, přidávání
Povolené subnety: update_enabled metoda

Týden počkáme co to udělá a uvidí se :-).

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Zatím vše OK, že?

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Stav změněn z Nový na Uzavřený
  • % Hotovo změněn z 50 na 100

Použito v changesetu r1762.

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

  • Rodičovský úkol nastaven na #405

Také k dispozici: Atom PDF