- 
    Documentation task 
- 
    Resolution: Commercial support required
- 
    Trivial 
- 
    None
- 
    4.0.27rc1
- 
    None
- 
        Sprint 74 (Mar 2021)
I don't understand the follow red code:
static void lld_remove_lost_items(const zbx_vector_ptr_t *items, int lifetime, int lastcheck)
{
 char *sql = NULL;
 size_t sql_alloc = 0, sql_offset = 0;
 zbx_lld_item_t *item;
 zbx_vector_uint64_t del_itemids, lc_itemids, ts_itemids;
 zbx_vector_uint64_pair_t discovery_itemts;
 int i;
zabbix_log(LOG_LEVEL_DEBUG, "In %s()", _func_);
 if (0 == items->values_num)
 goto out;
 zbx_vector_uint64_create(&del_itemids);
 zbx_vector_uint64_create(&lc_itemids);
 zbx_vector_uint64_create(&ts_itemids);
 zbx_vector_uint64_pair_create(&discovery_itemts);
 for (i = 0; i < items->values_num; i++)
 {
 item = (zbx_lld_item_t *)items->values[i];
 if (0 == item->itemid)
 continue;
 
###flags =0 is the plain item,ZBX_FLAG_LLD_ITEM_DISCOVERED is 1,so only when flags =0,the if condition is true and execute the if code?
 if (0 == (item->flags & ZBX_FLAG_LLD_ITEM_DISCOVERED))
 {
 int ts_delete = lld_end_of_life(item->lastcheck, lifetime);
 if (lastcheck > ts_delete)
 {
 zbx_vector_uint64_append(&del_itemids, item->itemid);
 {color:#de350b}}*
 *else if (item->ts_delete != ts_delete)
 {
 zbx_uint64_pair_t itemts;
 itemts.first = item->itemid;
 itemts.second = ts_delete;
 zbx_vector_uint64_pair_append(&discovery_itemts, itemts);
 {color:#de350b}}*
 *}
 else
}
 if (0 == discovery_itemts.values_num && 0 == lc_itemids.values_num && 0 == ts_itemids.values_num &&
 0 == del_itemids.values_num)
/* update item discovery table */
DBbegin();
DBbegin_multiple_update(&sql, &sql_alloc, &sql_offset);
for (i = 0; i < discovery_itemts.values_num; i++)
{ zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, "update item_discovery" " set ts_delete=%d" " where itemid=" ZBX_FS_UI64 ";\n", (int)discovery_itemts.values[i].second, discovery_itemts.values[i].first); DBexecute_overflowed_sql(&sql, &sql_alloc, &sql_offset); }if (0 != lc_itemids.values_num)
{ zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, "update item_discovery set lastcheck=%d where", lastcheck); DBadd_condition_alloc(&sql, &sql_alloc, &sql_offset, "itemid", lc_itemids.values, lc_itemids.values_num); zbx_strcpy_alloc(&sql, &sql_alloc, &sql_offset, ";\n"); DBexecute_overflowed_sql(&sql, &sql_alloc, &sql_offset); }if (0 != ts_itemids.values_num)
{ zbx_strcpy_alloc(&sql, &sql_alloc, &sql_offset, "update item_discovery set ts_delete=0 where"); DBadd_condition_alloc(&sql, &sql_alloc, &sql_offset, "itemid", ts_itemids.values, ts_itemids.values_num); zbx_strcpy_alloc(&sql, &sql_alloc, &sql_offset, ";\n"); DBexecute_overflowed_sql(&sql, &sql_alloc, &sql_offset); }DBend_multiple_update(&sql, &sql_alloc, &sql_offset);
 if (16 < sql_offset) /* in ORACLE always present begin..end; */
 DBexecute("%s", sql);
zbx_free(sql);
 /* remove 'lost' items */
 if (0 != del_itemids.values_num)
 DBcommit();
clean:
 zbx_vector_uint64_pair_destroy(&discovery_itemts);
 zbx_vector_uint64_destroy(&ts_itemids);
 zbx_vector_uint64_destroy(&lc_itemids);
 zbx_vector_uint64_destroy(&del_itemids);
out:
 zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", _func_);
}