Add properties and vars config checksums

refs #4991
This commit is contained in:
Michael Friedrich 2017-03-21 11:16:04 +01:00
parent 6178ca3886
commit f29a82bcfe
3 changed files with 40 additions and 12 deletions

View File

@ -59,6 +59,7 @@ void RedisWriter::UpdateAllConfigObjects(void)
{ {
AssertOnWorkQueue(); AssertOnWorkQueue();
//TODO: "Publish" the config dump by adding another event, globally or by object
redisReply *reply1 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "MULTI")); redisReply *reply1 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "MULTI"));
if (!reply1) { if (!reply1) {
@ -86,7 +87,7 @@ void RedisWriter::UpdateAllConfigObjects(void)
String typeName = type->GetName(); String typeName = type->GetName();
/* replace into aka delete insert is faster than a full diff */ /* replace into aka delete insert is faster than a full diff */
redisReply *reply2 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "DEL icinga:config:%s icinga:status:%s", typeName.CStr(), typeName.CStr())); redisReply *reply2 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "DEL icinga:config:%s icinga:config:%s:checksum, icinga:status:%s", typeName.CStr(), typeName.CStr(), typeName.CStr()));
if (!reply2) { if (!reply2) {
redisFree(m_Context); redisFree(m_Context);
@ -146,7 +147,6 @@ void RedisWriter::SendConfigUpdate(const ConfigObject::Ptr& object, const String
String jsonBody = JsonEncode(objectAttrs); String jsonBody = JsonEncode(objectAttrs);
//TODO: checksum
String objectName = object->GetName(); String objectName = object->GetName();
redisReply *reply1 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "HSET icinga:config:%s %s %s", typeName.CStr(), objectName.CStr(), jsonBody.CStr())); redisReply *reply1 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "HSET icinga:config:%s %s %s", typeName.CStr(), objectName.CStr(), jsonBody.CStr()));
@ -191,6 +191,9 @@ void RedisWriter::SendConfigUpdate(const ConfigObject::Ptr& object, const String
checkSum->Set("groups_checksum", CalculateCheckSumGroups(host->GetGroups())); checkSum->Set("groups_checksum", CalculateCheckSumGroups(host->GetGroups()));
} }
checkSum->Set("properties_checksum", CalculateCheckSumProperties(object));
checkSum->Set("vars_checksum", CalculateCheckSumVars(object));
String checkSumBody = JsonEncode(checkSum); String checkSumBody = JsonEncode(checkSum);
redisReply *reply2 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "HSET icinga:config:%s:checksum %s %s", typeName.CStr(), objectName.CStr(), checkSumBody.CStr())); redisReply *reply2 = reinterpret_cast<redisReply *>(redisCommand(m_Context, "HSET icinga:config:%s:checksum %s %s", typeName.CStr(), objectName.CStr(), checkSumBody.CStr()));

View File

@ -54,18 +54,39 @@ String RedisWriter::CalculateCheckSumGroups(const Array::Ptr& groups)
return SHA1(output); return SHA1(output);
} }
String RedisWriter::CalculateCheckSumAttrs(const Dictionary::Ptr& attrs) String RedisWriter::CalculateCheckSumProperties(const ConfigObject::Ptr& object)
{ {
String output; //TODO: consider precision of 6 for double values; use specific config fields for hashing?
return HashValue(object);
}
//TODO: Implement String RedisWriter::CalculateCheckSumVars(const ConfigObject::Ptr& object)
for (const Dictionary::Pair& kv: attrs) { {
if (kv.second.IsNumber()) { CustomVarObject::Ptr customVarObject = dynamic_pointer_cast<CustomVarObject>(object);
//use a precision of 6 for floating point numbers
}
}
return output; if (!customVarObject)
return Empty;
Dictionary::Ptr vars = customVarObject->GetVars();
if (!vars)
return Empty;
return HashValue(vars);
}
String RedisWriter::HashValue(const Value& value)
{
Value temp;
Type::Ptr type = value.GetReflectionType();
if (ConfigObject::TypeInstance->IsAssignableFrom(type))
temp = Serialize(value, FAConfig);
else
temp = value;
return SHA1(JsonEncode(temp));
} }
Dictionary::Ptr RedisWriter::SerializeObjectAttrs(const Object::Ptr& object, int fieldType) Dictionary::Ptr RedisWriter::SerializeObjectAttrs(const Object::Ptr& object, int fieldType)

View File

@ -66,9 +66,13 @@ private:
/* utilities */ /* utilities */
static String FormatCheckSumBinary(const String& str); static String FormatCheckSumBinary(const String& str);
static String CalculateCheckSumString(const String& str); static String CalculateCheckSumString(const String& str);
static String CalculateCheckSumGroups(const Array::Ptr& groups); static String CalculateCheckSumGroups(const Array::Ptr& groups);
static String CalculateCheckSumAttrs(const Dictionary::Ptr& attrs); static String CalculateCheckSumProperties(const ConfigObject::Ptr& object);
static String CalculateCheckSumVars(const ConfigObject::Ptr& object);
static String HashValue(const Value& value);
static Dictionary::Ptr SerializeObjectAttrs(const Object::Ptr& object, int fieldType); static Dictionary::Ptr SerializeObjectAttrs(const Object::Ptr& object, int fieldType);
static void StateChangedHandler(const ConfigObject::Ptr& object); static void StateChangedHandler(const ConfigObject::Ptr& object);