Fix problem with non-existing objects in config sync updates

refs #9851
refs #9927
refs #9081
This commit is contained in:
Michael Friedrich 2015-09-30 10:04:37 +02:00
parent eb2d4f2184
commit 19e7524b31
1 changed files with 26 additions and 22 deletions

View File

@ -138,36 +138,40 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
object->SetVersion(objVersion, false, origin);
}
if (!object)
return Empty;
/* update object attributes if version was changed */
if (object && 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 {
if (objVersion <= object->GetVersion()) {
Log(LogNotice, "ApiListener")
<< "Discarding config update for object '" << object->GetName()
<< "': Object version " << object->GetVersion()
<< " is more recent than the received version " << objVersion << ".";
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;
}