item poller uses trylock instead of lock for checking DCIs; some cosmetic refactoring
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 7 Feb 2017 08:36:43 +0000 (10:36 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 7 Feb 2017 08:36:43 +0000 (10:36 +0200)
src/server/core/datacoll.cpp
src/server/core/dcobject.cpp
src/server/core/dctarget.cpp
src/server/core/node.cpp
src/server/core/template.cpp
src/server/include/nms_dcoll.h
src/server/include/nms_objects.h

index e017df0..f495f74 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -244,7 +244,7 @@ static THREAD_RESULT THREAD_CALL DataCollector(void *pArg)
 
          // Update item's last poll time and clear busy flag so item can be polled again
          pItem->setLastPollTime(time(NULL));
-         pItem->setBusyFlag(FALSE);
+         pItem->clearBusyFlag();
                   continue;
                }
 
@@ -353,7 +353,7 @@ static THREAD_RESULT THREAD_CALL DataCollector(void *pArg)
 
                // Update item's last poll time and clear busy flag so item can be polled again
       pItem->setLastPollTime(currTime);
-      pItem->setBusyFlag(FALSE);
+      pItem->clearBusyFlag();
    }
 
    free(pBuffer);
@@ -370,8 +370,8 @@ static void QueueItems(NetObj *object, void *data)
       return;
 
    WatchdogNotify(*((UINT32 *)data));
-       DbgPrintf(8, _T("ItemPoller: calling DataCollectionTarget::queueItemsForPolling for object %s [%d]"),
-                                object->getName(), object->getId());
+       nxlog_debug(8, _T("ItemPoller: calling DataCollectionTarget::queueItemsForPolling for object %s [%d]"),
+                                  object->getName(), object->getId());
        ((DataCollectionTarget *)object)->queueItemsForPolling(&g_dataCollectionQueue);
 }
 
index 492b8e7..698cef1 100644 (file)
@@ -527,7 +527,16 @@ bool DCObject::matchSchedule(struct tm *pCurrTime, const TCHAR *pszSchedule, BOO
  */
 bool DCObject::isReadyForPolling(time_t currTime)
 {
-   lock();
+   // Normally data collection object will be locked when it is being
+   // changed or when it is processing new data
+   // In both cases there is no point to block item poller and wait, it
+   // is more effective to try schedule on next run
+   if (!tryLock())
+   {
+      nxlog_debug(3, _T("DCObject::isReadyForPolling: cannot obtain lock for data collection object %d"), m_id);
+      return false;
+   }
+
    if ((m_pollingSession != NULL) && !m_busy)
    {
       if ((m_status != ITEM_STATUS_DISABLED) &&
index f48d4ea..9d1142a 100644 (file)
@@ -475,7 +475,7 @@ bool DataCollectionTarget::isDataCollectionDisabled()
 /**
  * Put items which requires polling into the queue
  */
-void DataCollectionTarget::queueItemsForPolling(Queue *pPollerQueue)
+void DataCollectionTarget::queueItemsForPolling(Queue *pollerQueue)
 {
    if ((m_status == STATUS_UNMANAGED) || isDataCollectionDisabled() || m_isDeleted)
       return;  // Do not collect data for unmanaged objects or if data collection is disabled
@@ -488,10 +488,10 @@ void DataCollectionTarget::queueItemsForPolling(Queue *pPollerQueue)
                DCObject *object = m_dcObjects->get(i);
       if (object->isReadyForPolling(currTime))
       {
-         object->setBusyFlag(TRUE);
+         object->setBusyFlag();
          incRefCount();   // Increment reference count for each queued DCI
-         pPollerQueue->put(object);
-                       DbgPrintf(8, _T("DataCollectionTarget(%s)->QueueItemsForPolling(): item %d \"%s\" added to queue"), m_name, object->getId(), object->getName());
+         pollerQueue->put(object);
+                       nxlog_debug(8, _T("DataCollectionTarget(%s)->QueueItemsForPolling(): item %d \"%s\" added to queue"), m_name, object->getId(), object->getName());
       }
    }
    unlockDciAccess();
index f054d4c..2d8979e 100644 (file)
@@ -3362,7 +3362,7 @@ void Node::doInstanceDiscovery(UINT32 requestId)
       DCObject *object = m_dcObjects->get(i);
       if ((object->getType() == DCO_TYPE_ITEM) && (((DCItem *)object)->getInstanceDiscoveryMethod() != IDM_NONE))
       {
-         object->setBusyFlag(TRUE);
+         object->setBusyFlag();
          rootItems.add((DCItem *)object);
       }
    }
@@ -3392,7 +3392,7 @@ void Node::doInstanceDiscovery(UINT32 requestId)
                    m_name, m_id, dci->getName(), dci->getId());
          sendPollerMsg(requestId, POLLER_ERROR _T("      Failed to get instance list\r\n"));
       }
-      dci->setBusyFlag(FALSE);
+      dci->clearBusyFlag();
    }
 
    if (changed)
index e39d171..a6b87c8 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2016 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -426,10 +426,10 @@ bool Template::addDCObject(DCObject *object, bool alreadyLocked)
    if (i == m_dcObjects->size())     // Add new item
    {
                m_dcObjects->add(object);
-      object->setLastPollTime(0);    // Cause item to be polled immediatelly
+      object->setLastPollTime(0);    // Cause item to be polled immediately
       if (object->getStatus() != ITEM_STATUS_DISABLED)
          object->setStatus(ITEM_STATUS_ACTIVE, false);
-      object->setBusyFlag(FALSE);
+      object->clearBusyFlag();
       m_isModified = true;
       success = true;
    }
index 8734ae8..c4ec8a8 100644 (file)
@@ -213,6 +213,7 @@ protected:
        ClientSession *m_pollingSession;
 
    void lock() { MutexLock(m_hMutex); }
+   bool tryLock() { return MutexTryLock(m_hMutex); }
    void unlock() { MutexUnlock(m_hMutex); }
 
        bool loadCustomSchedules(DB_HANDLE hdb);
@@ -283,7 +284,8 @@ public:
        bool isScheduledForDeletion() { return m_scheduledForDeletion ? true : false; }
    void setLastPollTime(time_t tLastPoll) { m_tLastPoll = tLastPoll; }
    void setStatus(int status, bool generateEvent);
-   void setBusyFlag(BOOL busy) { m_busy = (BYTE)busy; }
+   void setBusyFlag() { m_busy = 1; }
+   void clearBusyFlag() { m_busy = 0; }
    void setTemplateId(UINT32 dwTemplateId, UINT32 dwItemId) { m_dwTemplateId = dwTemplateId; m_dwTemplateItemId = dwItemId; }
 
    virtual void createMessage(NXCPMessage *pMsg);
index 41e41f3..f7ef185 100644 (file)
@@ -1050,7 +1050,7 @@ public:
    void updateDciCache();
    void updateDCItemCacheSize(UINT32 dciId, UINT32 conditionId = 0);
    void cleanDCIData(DB_HANDLE hdb);
-   void queueItemsForPolling(Queue *pPollerQueue);
+   void queueItemsForPolling(Queue *pollerQueue);
        bool processNewDCValue(DCObject *dco, time_t currTime, const void *value);
 
        bool applyTemplateItem(UINT32 dwTemplateId, DCObject *dcObject);