/****************************************************************************** * * * Function: hk_history_prepare * * * * Purpose: prepares history housekeeping rule * * * * Parameters: rule - [IN/OUT] the history housekeeping rule * * now - [IN] the current timestmap * * * * Author: Andris Zeila * * * * Comments: This function is called to initialize history rule data either * * at start or when housekeeping is enabled for this rule. * * It caches item history data and also prepares delete queue to be * * processed during the first run. * * * ******************************************************************************/ static void hk_history_prepare(zbx_hk_history_rule_t *rule, int now) { DB_RESULT result; DB_ROW row; zbx_hashset_create(&rule->item_cache, 1024, zbx_default_uint64_hash_func, zbx_default_uint64_compare_func); zbx_vector_ptr_create(&rule->delete_queue); zbx_vector_ptr_reserve(&rule->delete_queue, HK_INITIAL_DELETE_QUEUE_SIZE); result = DBselect("select itemid,min(clock) from %s group by itemid", rule->table); while (NULL != (row = DBfetch(result))) { zbx_uint64_t itemid; int min_clock; zbx_hk_item_cache_t item_record; ZBX_STR2UINT64(itemid, row[0]); min_clock = atoi(row[1]); item_record.itemid = itemid; item_record.min_clock = min_clock; zbx_hashset_insert(&rule->item_cache, &item_record, sizeof(zbx_hk_item_cache_t)); } DBfree_result(result); }
/****************************************************************************** * * * Function: DCflush_nextchecks * * * * Purpose: update triggers to UNKNOWN and generate events * * * ******************************************************************************/ void DCflush_nextchecks(zbx_vector_ptr_t *trigger_diff) { const char *__function_name = "DCflush_nextchecks"; int i; zbx_uint64_t *itemids = NULL; zbx_timespec_t *timespecs = NULL; char **errors = NULL; zbx_hashset_t trigger_info; zbx_vector_ptr_t trigger_order; DC_TRIGGER *trigger; zabbix_log(LOG_LEVEL_DEBUG, "In %s() nextcheck_num:%d", __function_name, nextcheck_num); if (0 == nextcheck_num) goto exit; itemids = zbx_malloc(itemids, nextcheck_num * sizeof(zbx_uint64_t)); timespecs = zbx_malloc(timespecs, nextcheck_num * sizeof(zbx_timespec_t)); errors = zbx_malloc(errors, nextcheck_num * sizeof(char *)); for (i = 0; i < nextcheck_num; i++) { itemids[i] = nextchecks[i].itemid; timespecs[i] = nextchecks[i].ts; errors[i] = nextchecks[i].error_msg; } zbx_hashset_create(&trigger_info, MAX(100, 2 * nextcheck_num), ZBX_DEFAULT_UINT64_HASH_FUNC, ZBX_DEFAULT_UINT64_COMPARE_FUNC); zbx_vector_ptr_create(&trigger_order); zbx_vector_ptr_reserve(&trigger_order, nextcheck_num); DCconfig_get_triggers_by_itemids(&trigger_info, &trigger_order, itemids, timespecs, errors, nextcheck_num, 0); zbx_free(errors); zbx_free(timespecs); zbx_free(itemids); for (i = 0; i < trigger_order.values_num; i++) { trigger = (DC_TRIGGER *)trigger_order.values[i]; trigger->new_value = TRIGGER_VALUE_UNKNOWN; } zbx_process_triggers(&trigger_order, trigger_diff); DCfree_triggers(&trigger_order); zbx_hashset_destroy(&trigger_info); zbx_vector_ptr_destroy(&trigger_order); DCclean_nextchecks(); exit: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); }
/****************************************************************************** * * * Function: db_update_host_maintenances * * * * Purpose: update host maintenance parameters in cache and database * * * ******************************************************************************/ static int update_host_maintenances(void) { zbx_vector_uint64_t maintenanceids; zbx_vector_ptr_t updates; int hosts_num = 0; int tnx_error; zbx_vector_uint64_create(&maintenanceids); zbx_vector_ptr_create(&updates); zbx_vector_ptr_reserve(&updates, 100); do { DBbegin(); if (SUCCEED == zbx_dc_get_running_maintenanceids(&maintenanceids)) zbx_db_lock_maintenanceids(&maintenanceids); /* host maintenance update must be called even with no maintenances running */ /* to reset host maintenance status if necessary */ zbx_dc_get_host_maintenance_updates(&maintenanceids, &updates); if (0 != updates.values_num) db_update_host_maintenances(&updates); if (ZBX_DB_OK == (tnx_error = DBcommit()) && 0 != (hosts_num = updates.values_num)) zbx_dc_flush_host_maintenance_updates(&updates); zbx_vector_ptr_clear_ext(&updates, (zbx_clean_func_t)zbx_ptr_free); zbx_vector_uint64_clear(&maintenanceids); } while (ZBX_DB_DOWN == tnx_error); zbx_vector_ptr_destroy(&updates); zbx_vector_uint64_destroy(&maintenanceids); return hosts_num; }