diff --git src/libs/zbxcacheconfig/dbconfig.c src/libs/zbxcacheconfig/dbconfig.c index ad160037fb7..fdf64020940 100644 --- src/libs/zbxcacheconfig/dbconfig.c +++ src/libs/zbxcacheconfig/dbconfig.c @@ -7008,10 +7008,6 @@ void DCsync_configuration(unsigned char mode, zbx_synced_new_config_t synced, zb zbx_hashset_create(&activated_hosts, 100, ZBX_DEFAULT_UINT64_HASH_FUNC, ZBX_DEFAULT_UINT64_COMPARE_FUNC); - sec = zbx_time(); - changelog_num = zbx_dbsync_env_prepare(mode); - changelog_sec = zbx_time() - sec; - if (ZBX_DBSYNC_INIT == mode) { zbx_hashset_create(&trend_queue, 1000, ZBX_DEFAULT_UINT64_HASH_FUNC, ZBX_DEFAULT_UINT64_COMPARE_FUNC); @@ -7027,24 +7023,28 @@ void DCsync_configuration(unsigned char mode, zbx_synced_new_config_t synced, zb pnew_items = &new_items; } + sec = zbx_time(); + changelog_num = zbx_dbsync_env_prepare(changelog_sync_mode); + changelog_sec = zbx_time() - sec; + /* global configuration must be synchronized directly with database */ zbx_dbsync_init(&config_sync, ZBX_DBSYNC_INIT); zbx_dbsync_init(&autoreg_config_sync, mode); zbx_dbsync_init(&autoreg_host_sync, mode); - zbx_dbsync_init(&hosts_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&hosts_sync, changelog_sync_mode); zbx_dbsync_init(&hi_sync, mode); zbx_dbsync_init(&htmpl_sync, mode); zbx_dbsync_init(&gmacro_sync, mode); zbx_dbsync_init(&hmacro_sync, mode); zbx_dbsync_init(&if_sync, mode); - zbx_dbsync_init(&items_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&items_sync, changelog_sync_mode); zbx_dbsync_init(&template_items_sync, mode); - zbx_dbsync_init(&prototype_items_sync, mode); + zbx_dbsync_init_changelog(&prototype_items_sync, changelog_sync_mode); zbx_dbsync_init(&item_discovery_sync, mode); - zbx_dbsync_init(&triggers_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&triggers_sync, changelog_sync_mode); zbx_dbsync_init(&tdep_sync, mode); - zbx_dbsync_init(&func_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&func_sync, changelog_sync_mode); zbx_dbsync_init(&expr_sync, mode); zbx_dbsync_init(&action_sync, mode); @@ -7054,15 +7054,15 @@ void DCsync_configuration(unsigned char mode, zbx_synced_new_config_t synced, zb zbx_dbsync_init(&action_op_sync, ZBX_DBSYNC_UPDATE); zbx_dbsync_init(&action_condition_sync, mode); - zbx_dbsync_init(&trigger_tag_sync, changelog_sync_mode); - zbx_dbsync_init(&item_tag_sync, changelog_sync_mode); - zbx_dbsync_init(&host_tag_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&trigger_tag_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&item_tag_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&host_tag_sync, changelog_sync_mode); zbx_dbsync_init(&correlation_sync, mode); zbx_dbsync_init(&corr_condition_sync, mode); zbx_dbsync_init(&corr_operation_sync, mode); zbx_dbsync_init(&hgroups_sync, mode); zbx_dbsync_init(&hgroup_host_sync, mode); - zbx_dbsync_init(&itempp_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&itempp_sync, changelog_sync_mode); zbx_dbsync_init(&itemscrp_sync, mode); zbx_dbsync_init(&maintenance_sync, mode); @@ -7071,16 +7071,16 @@ void DCsync_configuration(unsigned char mode, zbx_synced_new_config_t synced, zb zbx_dbsync_init(&maintenance_group_sync, mode); zbx_dbsync_init(&maintenance_host_sync, mode); - zbx_dbsync_init(&drules_sync, changelog_sync_mode); - zbx_dbsync_init(&dchecks_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&drules_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&dchecks_sync, changelog_sync_mode); - zbx_dbsync_init(&httptest_sync, changelog_sync_mode); - zbx_dbsync_init(&httptest_field_sync, changelog_sync_mode); - zbx_dbsync_init(&httpstep_sync, changelog_sync_mode); - zbx_dbsync_init(&httpstep_field_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&httptest_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&httptest_field_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&httpstep_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&httpstep_field_sync, changelog_sync_mode); - zbx_dbsync_init(&connector_sync, changelog_sync_mode); - zbx_dbsync_init(&connector_tag_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&connector_sync, changelog_sync_mode); + zbx_dbsync_init_changelog(&connector_tag_sync, changelog_sync_mode); #ifdef HAVE_ORACLE /* With Oracle fetch statements can fail before all data has been fetched. */ @@ -7865,9 +7865,25 @@ out: { case ZBX_DB_OK: if (ZBX_DBSYNC_INIT != changelog_sync_mode) + { zbx_dbsync_env_flush_changelog(); + } else - sync_status = ZBX_DBSYNC_STATUS_INITIALIZED; + { + /* set changelog initialized only if database records were synced and */ + /* next time differential sync must be used */ + if (SUCCEED == zbx_dbsync_env_changelog_dbsyncs_new_records()) + { + sync_status = ZBX_DBSYNC_STATUS_INITIALIZED; + zabbix_log(LOG_LEVEL_DEBUG, "initialized changelog support"); + } + else + { + zabbix_log(LOG_LEVEL_DEBUG, "skipped changelog support initialization" + " because of empty database"); + } + + } break; case ZBX_DB_FAIL: /* non recoverable database error is encountered */ diff --git src/libs/zbxcacheconfig/dbsync.c src/libs/zbxcacheconfig/dbsync.c index 2413ae17a4f..36ba8effa1c 100644 --- src/libs/zbxcacheconfig/dbsync.c +++ src/libs/zbxcacheconfig/dbsync.c @@ -99,6 +99,8 @@ typedef struct zbx_hashset_t changelog; zbx_dbsync_journal_t journals[ZBX_DBSYNC_OBJ_COUNT]; + + zbx_vector_dbsync_t changelog_dbsyncs; } zbx_dbsync_env_t; @@ -518,6 +520,8 @@ int zbx_dbsync_env_prepare(unsigned char mode) dbsync_remove_duplicate_ids(&dbsync_env.journals[i].updates, &dbsync_env.journals[i].inserts); } + zbx_vector_dbsync_create(&dbsync_env.changelog_dbsyncs); + return changelog_num; } @@ -581,13 +585,14 @@ void zbx_dbsync_env_clear(void) { size_t i; + zbx_vector_dbsync_destroy(&dbsync_env.changelog_dbsyncs); + dbsync_prune_changelog(); zbx_hashset_destroy(&dbsync_env.strpool); for (i = 0; i < ARRSIZE(dbsync_env.journals); i++) dbsync_journal_destroy(&dbsync_env.journals[i]); - } int zbx_dbsync_env_changelog_num(void) @@ -595,6 +600,30 @@ int zbx_dbsync_env_changelog_num(void) return dbsync_env.changelog.num_data; } +/****************************************************************************** + * * + * Purpose: check if any new records were synced from tables supporting * + * changelog * + * * + * Return value: SUCCEED - there were new records synced * + * FAIL - otherwise * + * * + ******************************************************************************/ +int zbx_dbsync_env_changelog_dbsyncs_new_records(void) +{ + int i; + + for (i = 0; i < dbsync_env.changelog_dbsyncs.values_num; i++) + { + zbx_dbsync_t *sync = dbsync_env.changelog_dbsyncs.values[i]; + + if (0 != sync->add_num) + return SUCCEED; + } + + return FAIL; +} + /****************************************************************************** * * * Purpose: get rows changed since last sync * @@ -655,6 +684,13 @@ static int dbsync_read_journal(zbx_dbsync_t *sync, char **sql, size_t *sql_alloc { int i, inserts_num, updates_num; + if (ZBX_DBSYNC_TYPE_CHANGELOG != sync->type) + { + /* sync objects using changelog must be initialized with zbx_dbsync_init_changelog() */ + THIS_SHOULD_NEVER_HAPPEN; + exit(EXIT_FAILURE); + } + zbx_vector_dbsync_append(&journal->syncs, sync); inserts_num = journal->inserts.values_num; @@ -701,7 +737,7 @@ static int dbsync_read_journal(zbx_dbsync_t *sync, char **sql, size_t *sql_alloc * Purpose: initializes changeset * * * ******************************************************************************/ -void zbx_dbsync_init(zbx_dbsync_t *sync, unsigned char mode) +static void dbsync_init(zbx_dbsync_t *sync, unsigned char mode) { sync->columns_num = 0; sync->mode = mode; @@ -723,6 +759,30 @@ void zbx_dbsync_init(zbx_dbsync_t *sync, unsigned char mode) sync->dbresult = NULL; } +/****************************************************************************** + * * + * Purpose: initializes changeset * + * * + ******************************************************************************/ +void zbx_dbsync_init(zbx_dbsync_t *sync, unsigned char mode) +{ + dbsync_init(sync, mode); + sync->type = ZBX_DBSYNC_TYPE_DIFF; +} + +/****************************************************************************** + * * + * Purpose: initializes changeset for tables using changelog * + * * + ******************************************************************************/ +void zbx_dbsync_init_changelog(zbx_dbsync_t *sync, unsigned char mode) +{ + dbsync_init(sync, mode); + sync->type = ZBX_DBSYNC_TYPE_CHANGELOG; + + zbx_vector_dbsync_append(&dbsync_env.changelog_dbsyncs, sync); +} + /****************************************************************************** * * * Purpose: frees resources allocated by changeset * diff --git src/libs/zbxcacheconfig/dbsync.h src/libs/zbxcacheconfig/dbsync.h index 26b2f790aed..98c600273f0 100644 --- src/libs/zbxcacheconfig/dbsync.h +++ src/libs/zbxcacheconfig/dbsync.h @@ -48,6 +48,10 @@ #define ZBX_DBSYNC_TRIGGER_ERROR 0x80 + +#define ZBX_DBSYNC_TYPE_DIFF 0 +#define ZBX_DBSYNC_TYPE_CHANGELOG 1 + /****************************************************************************** * * * Purpose: applies necessary preprocessing before row is compared/used * @@ -80,6 +84,9 @@ struct zbx_dbsync /* the synchronization mode (see ZBX_DBSYNC_* defines) */ unsigned char mode; + + unsigned char type; + /* the number of columns in diff */ int columns_num; @@ -112,8 +119,10 @@ int zbx_dbsync_env_prepare(unsigned char mode); void zbx_dbsync_env_flush_changelog(void); void zbx_dbsync_env_clear(void); int zbx_dbsync_env_changelog_num(void); +int zbx_dbsync_env_changelog_dbsyncs_new_records(void); void zbx_dbsync_init(zbx_dbsync_t *sync, unsigned char mode); +void zbx_dbsync_init_changelog(zbx_dbsync_t *sync, unsigned char mode); void zbx_dbsync_clear(zbx_dbsync_t *sync); int zbx_dbsync_next(zbx_dbsync_t *sync, zbx_uint64_t *rowid, char ***row, unsigned char *tag);