minor refactoring, change log update (issue #NX-757)
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 28 Nov 2017 11:56:12 +0000 (13:56 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 28 Nov 2017 11:56:12 +0000 (13:56 +0200)
ChangeLog
src/server/core/dcobject.cpp
src/server/core/dctarget.cpp
src/server/include/nms_dcoll.h

index d3ccb45..92854c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,7 +6,6 @@
 - Raw DCI values saved in history along with corresponding transformed values
 - Collected DCI data recalculation based on stored raw values and current transformation settings
 - Fixed issues:
-       NX-757 (Instance discovery - grace period for removed instances before deleting DCIs)
        NX-900 (Server started during nxdbmgr check forced repair)
        NX-1102 (Implement event groups)
        NX-1199 (SNMP credentials per-zone)
@@ -37,6 +36,7 @@
 - Fixed issues: 
        NX-662 (New network map element - text box)
        NX-703 (Export/Import actions)
+       NX-757 (Instance discovery - grace period for removed instances before deleting DCIs)
        NX-801 (Deleted nodes not removed from trusted nodes lists of other objects)
        NX-1045 (Add rack/chassis diagram as dashboard element)
        NX-1142 (Back view for racks)
index 3b430ef..561ab01 100644 (file)
@@ -72,7 +72,7 @@ DCObject::DCObject()
    m_instance[0] = 0;
    m_accessList = new IntegerArray<UINT32>(0, 16);
    m_instanceRetentionTime = -1;
-   m_lastAttemptToRemove = 0;
+   m_instanceGracePeriodStart = 0;
 }
 
 /**
@@ -120,6 +120,7 @@ DCObject::DCObject(const DCObject *pSrc)
    _tcscpy(m_instance, pSrc->m_instance);
    m_accessList = new IntegerArray<UINT32>(pSrc->m_accessList);
    m_instanceRetentionTime = pSrc->m_instanceRetentionTime;
+   m_instanceGracePeriodStart = pSrc->m_instanceGracePeriodStart;
 }
 
 /**
@@ -167,7 +168,7 @@ DCObject::DCObject(UINT32 dwId, const TCHAR *szName, int iSource,
    m_instance[0] = 0;
    m_accessList = new IntegerArray<UINT32>(0, 16);
    m_instanceRetentionTime = -1;
-   m_lastAttemptToRemove = 0;
+   m_instanceGracePeriodStart = 0;
 }
 
 /**
@@ -235,7 +236,7 @@ DCObject::DCObject(ConfigEntry *config, Template *owner)
    nx_strncpy(m_instance, config->getSubEntryValue(_T("instance"), 0, _T("")), MAX_DB_STRING);
    m_accessList = new IntegerArray<UINT32>(0, 16);
    m_instanceRetentionTime = config->getSubEntryValueAsInt(_T("instanceRetentionTime"), 0, -1);
-   m_lastAttemptToRemove = 0;
+   m_instanceGracePeriodStart = 0;
 }
 
 /**
index 69a5c20..ec530c6 100644 (file)
@@ -1649,26 +1649,26 @@ bool DataCollectionTarget::updateInstances(DCObject *root, StringMap *instances,
          }
          instances->remove(dcoInstance);
 
-         if (object->getLastAttemptToRemove() > 0)
+         if (object->getInstanceGracePeriodStart() > 0)
          {
-            object->setLastAttemptToRemove(0);
+            object->setInstanceGracePeriodStart(0);
             object->setStatus(ITEM_STATUS_ACTIVE, false);
          }
       }
       else
       {
-         if (object->getLastAttemptToRemove() == 0)
+         time_t retentionTime = ((object->getInstanceRetentionTime() != -1) ? object->getInstanceRetentionTime() : g_instanceRetentionTime) * 86400;
+
+         if ((object->getInstanceGracePeriodStart() == 0) && (retentionTime > 0))
          {
-            object->setLastAttemptToRemove(time(NULL));
+            object->setInstanceGracePeriodStart(time(NULL));
             object->setStatus(ITEM_STATUS_DISABLED, false);
-            nxlog_debug(5, _T("DataCollectionTarget::updateInstances(%s [%u], %s [%u]): instance \"%s\" not found, last failure time updated"),
+            nxlog_debug(5, _T("DataCollectionTarget::updateInstances(%s [%u], %s [%u]): instance \"%s\" not found, grace period started"),
                       m_name, m_id, root->getName(), root->getId(), dcoInstance);
-            sendPollerMsg(requestId, _T("      Existing instance \"%s\" not found, last failure time updated\r\n"), dcoInstance);
+            sendPollerMsg(requestId, _T("      Existing instance \"%s\" not found, grace period started\r\n"), dcoInstance);
          }
 
-         time_t retentionTime = ((object->getInstanceRetentionTime() != -1) ? object->getInstanceRetentionTime() : g_instanceRetentionTime) * 86400;
-
-         if ((time(NULL) - object->getLastAttemptToRemove()) > retentionTime)
+         if ((retentionTime == 0) || ((time(NULL) - object->getInstanceGracePeriodStart()) > retentionTime))
          {
             // not found, delete DCO
             nxlog_debug(5, _T("DataCollectionTarget::updateInstances(%s [%u], %s [%u]): instance \"%s\" not found, instance DCO will be deleted"),
index e105c3d..07e137e 100644 (file)
@@ -218,8 +218,8 @@ protected:
    NXSL_Program *m_instanceFilter;
    TCHAR m_instance[MAX_DB_STRING];
    IntegerArray<UINT32> *m_accessList;
-   time_t m_lastAttemptToRemove;       // If instance is not found, the time is updated
-   INT32 m_instanceRetentionTime;   // Retention time if instance is not found
+   time_t m_instanceGracePeriodStart;  // Start of grace period for missing instance
+   INT32 m_instanceRetentionTime;      // Retention time if instance is not found
 
    void lock() { MutexLock(m_hMutex); }
    bool tryLock() { return MutexTryLock(m_hMutex); }
@@ -330,6 +330,7 @@ public:
 
    WORD getInstanceDiscoveryMethod() const { return m_instanceDiscoveryMethod; }
    const TCHAR *getInstanceDiscoveryData() const { return m_instanceDiscoveryData; }
+   INT32 getInstanceRetentionTime() const { return m_instanceRetentionTime; }
    void filterInstanceList(StringMap *instances);
    void setInstanceDiscoveryMethod(WORD method) { m_instanceDiscoveryMethod = method; }
    void setInstanceDiscoveryData(const TCHAR *data) { safe_free(m_instanceDiscoveryData); m_instanceDiscoveryData = _tcsdup_ex(data); }
@@ -337,12 +338,10 @@ public:
    void setInstance(const TCHAR *instance) { nx_strncpy(m_instance, instance, MAX_DB_STRING); }
    const TCHAR *getInstance() const { return m_instance; }
    void expandInstance();
+   time_t getInstanceGracePeriodStart() const { return m_instanceGracePeriodStart; }
+   void setInstanceGracePeriodStart(time_t t) { m_instanceGracePeriodStart = t; }
    bool hasValue();
    bool hasAccess(UINT32 userId);
-
-   time_t getLastAttemptToRemove() const { return m_lastAttemptToRemove; }
-   void setLastAttemptToRemove(time_t time) { m_lastAttemptToRemove = time; }
-   INT32 getInstanceRetentionTime() const { return m_instanceRetentionTime; }
 };
 
 /**