mirror of https://github.com/Icinga/icinga2.git
Fix problem with non-existing objects in config sync updates
refs #9851 refs #9927 refs #9081
This commit is contained in:
parent
eb2d4f2184
commit
19e7524b31
|
@ -138,36 +138,40 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
|
||||||
object->SetVersion(objVersion, false, origin);
|
object->SetVersion(objVersion, false, origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!object)
|
||||||
|
return Empty;
|
||||||
|
|
||||||
/* update object attributes if version was changed */
|
/* update object attributes if version was changed */
|
||||||
if (object && objVersion > object->GetVersion()) {
|
if (objVersion <= object->GetVersion()) {
|
||||||
Log(LogInformation, "ApiListener")
|
|
||||||
<< "Processing config update for object '" << object->GetName()
|
|
||||||
<< "': Object version " << object->GetVersion()
|
|
||||||
<< " is older than the received version " << objVersion << ".";
|
|
||||||
|
|
||||||
Dictionary::Ptr modified_attributes = params->Get("modified_attributes");
|
|
||||||
|
|
||||||
if (modified_attributes) {
|
|
||||||
ObjectLock olock(modified_attributes);
|
|
||||||
BOOST_FOREACH(const Dictionary::Pair& kv, modified_attributes) {
|
|
||||||
/* update all modified attributes
|
|
||||||
* but do not update the object version yet.
|
|
||||||
* This triggers cluster events otherwise.
|
|
||||||
*/
|
|
||||||
object->ModifyAttribute(kv.first, kv.second, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* keep the object version in sync with the sender */
|
|
||||||
object->SetVersion(objVersion, false, origin);
|
|
||||||
} else {
|
|
||||||
Log(LogNotice, "ApiListener")
|
Log(LogNotice, "ApiListener")
|
||||||
<< "Discarding config update for object '" << object->GetName()
|
<< "Discarding config update for object '" << object->GetName()
|
||||||
<< "': Object version " << object->GetVersion()
|
<< "': Object version " << object->GetVersion()
|
||||||
<< " is more recent than the received version " << objVersion << ".";
|
<< " is more recent than the received version " << objVersion << ".";
|
||||||
|
|
||||||
return Empty;
|
return Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log(LogNotice, "ApiListener")
|
||||||
|
<< "Processing config update for object '" << object->GetName()
|
||||||
|
<< "': Object version " << object->GetVersion()
|
||||||
|
<< " is older than the received version " << objVersion << ".";
|
||||||
|
|
||||||
|
Dictionary::Ptr modified_attributes = params->Get("modified_attributes");
|
||||||
|
|
||||||
|
if (modified_attributes) {
|
||||||
|
ObjectLock olock(modified_attributes);
|
||||||
|
BOOST_FOREACH(const Dictionary::Pair& kv, modified_attributes) {
|
||||||
|
/* update all modified attributes
|
||||||
|
* but do not update the object version yet.
|
||||||
|
* This triggers cluster events otherwise.
|
||||||
|
*/
|
||||||
|
object->ModifyAttribute(kv.first, kv.second, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* keep the object version in sync with the sender */
|
||||||
|
object->SetVersion(objVersion, false, origin);
|
||||||
|
|
||||||
return Empty;
|
return Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue