diff --git a/include/zbxdb.h b/include/zbxdb.h index 1631ee0..ab8a3b1 100644 --- a/include/zbxdb.h +++ b/include/zbxdb.h @@ -25,6 +25,7 @@ #define ZBX_DB_OK 0 #define ZBX_DB_FAIL -1 #define ZBX_DB_DOWN -2 +#define ZBX_DB_DEADLOCK -3 #define ZBX_DB_WAIT_DOWN 10 diff --git a/src/libs/zbxdb/db.c b/src/libs/zbxdb/db.c index e1420f3..201ebfa 100644 --- a/src/libs/zbxdb/db.c +++ b/src/libs/zbxdb/db.c @@ -1454,6 +1454,11 @@ int zbx_db_vexecute(const char *fmt, va_list args) zbx_db_errlog(ERR_Z3005, mysql_errno(conn), mysql_error(conn), sql); ret = (SUCCEED == is_recoverable_mysql_error() ? ZBX_DB_DOWN : ZBX_DB_FAIL); + + if (0 < txn_level && ER_LOCK_DEADLOCK == mysql_errno(conn)) { + txn_error = ZBX_DB_DEADLOCK; + ret = ZBX_DB_DEADLOCK; + } } else { diff --git a/src/zabbix_server/events.c b/src/zabbix_server/events.c index c45f6e7..dad6125 100644 --- a/src/zabbix_server/events.c +++ b/src/zabbix_server/events.c @@ -2789,6 +2789,7 @@ int zbx_close_problem(zbx_uint64_t triggerid, zbx_uint64_t eventid, zbx_uint64_t int errcode, processed_num = 0; zbx_timespec_t ts; DB_EVENT *r_event; + int txn_result; DCconfig_get_triggers_by_triggerids(&trigger, &triggerid, &errcode, 1); @@ -2804,19 +2805,21 @@ int zbx_close_problem(zbx_uint64_t triggerid, zbx_uint64_t eventid, zbx_uint64_t zbx_timespec(&ts); - DBbegin(); - r_event = close_trigger_event(eventid, triggerid, &ts, userid, 0, 0, trigger.description, trigger.expression_orig, trigger.recovery_expression_orig, trigger.priority, trigger.type, trigger.opdata); r_event->eventid = DBget_maxid_num("events", 1); - processed_num = flush_events(); - update_trigger_changes(&trigger_diff); - zbx_db_save_trigger_changes(&trigger_diff); + do { + DBbegin(); + + processed_num = flush_events(); + update_trigger_changes(&trigger_diff); + zbx_db_save_trigger_changes(&trigger_diff); - DBcommit(); + txn_result = DBcommit(); + } while (txn_result == ZBX_DB_DEADLOCK); DCconfig_triggers_apply_changes(&trigger_diff); DBupdate_itservices(&trigger_diff);