]> granicus.if.org Git - icinga2/commitdiff
Optimize replication messages.
authorGunnar Beutner <gunnar@beutner.name>
Fri, 5 Apr 2013 12:05:00 +0000 (14:05 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Fri, 5 Apr 2013 12:05:00 +0000 (14:05 +0200)
components/replication/replicationcomponent.cpp
lib/base/dynamicobject.cpp
lib/base/dynamicobject.h
lib/base/fifo.cpp

index a347fc6628484a2f0a0bb9a8b32d45aa2c5fe83b..34912851e48cd5230fa50b88c192852fc8d81d97 100644 (file)
@@ -181,6 +181,10 @@ void ReplicationComponent::FlushObjectHandler(double tx, const DynamicObject::Pt
        if (!ShouldReplicateObject(object))
                return;
 
+       /* Don't replicate objects that haven't had any local updates. */
+       if (object->GetLocalTx() < tx)
+               return;
+
        RequestMessage request = MakeObjectMessage(object, "config::ObjectUpdate", tx, true);
        EndpointManager::GetInstance()->SendMulticastMessage(m_Endpoint, request);
 }
index fe1873d7681992474b467424a22a29862551568e..1418d1756f6b6a57697ca42e31775b2640a061e7 100644 (file)
@@ -49,7 +49,7 @@ boost::signals2::signal<void (double, const std::set<DynamicObject::WeakPtr>&)>
 boost::signals2::signal<void (double, const DynamicObject::Ptr&)> DynamicObject::OnFlushObject;
 
 DynamicObject::DynamicObject(const Dictionary::Ptr& serializedObject)
-       : m_ConfigTx(0), m_Registered(false)
+       : m_ConfigTx(0), m_LocalTx(0), m_Registered(false)
 {
        RegisterAttribute("__name", Attribute_Config, &m_Name);
        RegisterAttribute("__type", Attribute_Config, &m_Type);
@@ -241,7 +241,9 @@ void DynamicObject::Touch(const String& name)
        if (it == m_Attributes.end())
                BOOST_THROW_EXCEPTION(std::runtime_error("Touch() called for unknown attribute: " + name));
 
-       it->second.SetTx(GetCurrentTx());
+       double tx = GetCurrentTx();
+       it->second.SetTx(tx);
+       m_LocalTx = tx;
 
        m_ModifiedAttributes.insert(name);
 
@@ -251,6 +253,12 @@ void DynamicObject::Touch(const String& name)
        }
 }
 
+double DynamicObject::GetLocalTx(void) const
+{
+       boost::mutex::scoped_lock lock(m_AttributeMutex);
+       return m_LocalTx;
+}
+
 Value DynamicObject::Get(const String& name) const
 {
        ASSERT(!OwnsLock());
index b3a80945414ceef5bd01a25db399af23447d7b0d..0ad599c74ca9534d7bd49ceed3a785b8e1bd6404 100644 (file)
@@ -90,6 +90,8 @@ public:
        virtual void Start(void);
        virtual void Stop(void);
 
+       double GetLocalTx(void) const;
+
        const AttributeMap& GetAttributes(void) const;
 
        static DynamicObject::Ptr GetObject(const String& type, const String& name);
@@ -117,6 +119,7 @@ private:
        AttributeMap m_Attributes;
        std::set<String, string_iless> m_ModifiedAttributes;
        double m_ConfigTx;
+       double m_LocalTx;
 
        Attribute<String> m_Name;
        Attribute<String> m_Type;
index d0f6bbc8bf0b6b6b699abcfcf3a0273e4174c2d4..cc12f422fd77eadf7def65672c8727b012d49772 100644 (file)
@@ -65,26 +65,14 @@ void FIFO::ResizeBuffer(size_t newSize)
  */
 void FIFO::Optimize(void)
 {
-       //char *newBuffer;
-
        if (m_DataSize < m_Offset) {
                memcpy(m_Buffer, m_Buffer + m_Offset, m_DataSize);
                m_Offset = 0;
 
-               return;
-       }
+               ResizeBuffer(m_DataSize);
 
-       /*newBuffer = (char *)ResizeBuffer(NULL, 0, m_BufferSize - m_Offset);
-
-       if (newBuffer == NULL)
                return;
-
-       memcpy(newBuffer, m_Buffer + m_Offset, m_BufferSize - m_Offset);
-
-       free(m_Buffer);
-       m_Buffer = newBuffer;
-       m_BufferSize -= m_Offset;
-       m_Offset = 0;*/
+       }
 }
 
 /**