Uploaded image for project: 'ZABBIX BUGS AND ISSUES'
  1. ZABBIX BUGS AND ISSUES
  2. ZBX-16467

The value of ZBX_IDS_SIZE is incorrect.

XMLWordPrintable

    • Sprint 56 (Sep 2019), Sprint 55 (Aug 2019)
    • 0.125

      DCget_nextid() is called for a specific 10 tables.

      zbx_uint64_t	DBget_maxid_num(const char *tablename, int num)
      {
      	if (0 == strcmp(tablename, "events") ||
      			0 == strcmp(tablename, "event_tag") ||
      			0 == strcmp(tablename, "problem_tag") ||
      			0 == strcmp(tablename, "dservices") ||
      			0 == strcmp(tablename, "dhosts") ||
      			0 == strcmp(tablename, "alerts") ||
      			0 == strcmp(tablename, "escalations") ||
      			0 == strcmp(tablename, "autoreg_host") ||
      			0 == strcmp(tablename, "task_remote_command") ||
      			0 == strcmp(tablename, "task_remote_command_result"))
      		return DCget_nextid(tablename, num);
      
      	return DBget_nextid(tablename, num);
      }
      

      DCget_nextid() checks if it matches table_name of structure ZBX_DC_IDS.

      /******************************************************************************
       *                                                                            *
       * Function: DCget_nextid                                                     *
       *                                                                            *
       * Purpose: Return next id for requested table                                *
       *                                                                            *
       * Author: Alexander Vladishev                                                *
       *                                                                            *
       ******************************************************************************/
      zbx_uint64_t	DCget_nextid(const char *table_name, int num)
      {
      	const char	*__function_name = "DCget_nextid";
      	int		i;
      	DB_RESULT	result;
      	DB_ROW		row;
      	const ZBX_TABLE	*table;
      	ZBX_DC_ID	*id;
      	zbx_uint64_t	min = 0, max = ZBX_DB_MAX_ID, nextid, lastid;
      
      	zabbix_log(LOG_LEVEL_DEBUG, "In %s() table:'%s' num:%d",
      			__function_name, table_name, num);
      
      	LOCK_CACHE_IDS;
      
      	for (i = 0; i < ZBX_IDS_SIZE; i++)
      	{
      		id = &ids->id[i];
      		if ('\0' == *id->table_name)
      			break;
      
      		if (0 == strcmp(id->table_name, table_name))
      		{
      			nextid = id->lastid + 1;
      			id->lastid += num;
      			lastid = id->lastid;
      
      			UNLOCK_CACHE_IDS;
      
      			zabbix_log(LOG_LEVEL_DEBUG, "End of %s() table:'%s' [" ZBX_FS_UI64 ":" ZBX_FS_UI64 "]",
      					__function_name, table_name, nextid, lastid);
      
      			return nextid;
      		}
      	}
      
      	if (i == ZBX_IDS_SIZE)
      	{
      		zabbix_log(LOG_LEVEL_ERR, "insufficient shared memory for ids");
      		exit(EXIT_FAILURE);
      	}
      
      	table = DBget_table(table_name);
      
      	result = DBselect("select max(%s) from %s where %s between " ZBX_FS_UI64 " and " ZBX_FS_UI64,
      			table->recid, table_name, table->recid, min, max);
      
      	if (NULL != result)
      	{
      		zbx_strlcpy(id->table_name, table_name, sizeof(id->table_name));
      
      		if (NULL == (row = DBfetch(result)) || SUCCEED == DBis_null(row[0]))
      			id->lastid = min;
      		else
      			ZBX_STR2UINT64(id->lastid, row[0]);
      
      		nextid = id->lastid + 1;
      		id->lastid += num;
      		lastid = id->lastid;
      	}
      	else
      		nextid = lastid = 0;
      
      	UNLOCK_CACHE_IDS;
      
      	DBfree_result(result);
      
      	zabbix_log(LOG_LEVEL_DEBUG, "End of %s() table:'%s' [" ZBX_FS_UI64 ":" ZBX_FS_UI64 "]",
      			__function_name, table_name, nextid, lastid);
      
      	return nextid;
      }
      

      If they do not match, DBget_table() is called and the table name is set in the structure ZBX_DC_IDS.

      ZBX_IDS_SIZE is now 8.

      #define ZBX_IDS_SIZE	8
      
      typedef struct
      {
      	char		table_name[ZBX_TABLENAME_LEN_MAX];
      	zbx_uint64_t	lastid;
      }
      ZBX_DC_ID;
      
      typedef struct
      {
      	ZBX_DC_ID	id[ZBX_IDS_SIZE];
      }
      ZBX_DC_IDS;
      
      static ZBX_DC_IDS	*ids = NULL;
      

      ZBX_IDS_SIZE is not 10, so there are two missing tables when called from DCget_nextid().
      Is this the intended behavior?

      I think it is better to have 8 tables or ZBX_IDS_SIZE to 10.

            ak Andrejs Kozlovs
            kazuo.ito Kazuo Ito
            Team A
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: