public KeysSyncInfo GetAllKeysSyncInfo()
        {
            var info = new KeysSyncInfo();

            Tenant tenant = GetTenant();

            info.TenantId = tenant.TenantId;

            try
            {
                var tenantKeys = Memory.ConfigurationStore.AllKeyValues.FindAll(g => g.TenantId.CompareTo(repoTenantId) == 0 && g.AppName.CompareTo(string.Empty) == 0).ToList();

                tenantKeys = tenantKeys.OrderBy(k => k.Key).ToList();

                var keysJson = JsonConvert.SerializeObject(tenantKeys);
                info.Keys = JsonConvert.DeserializeObject <List <StoreKeyValue> >(keysJson);

                StringBuilder signature = new StringBuilder();

                foreach (var k in info.Keys)
                {
                    signature.Append(k.Key + "_" + k.Value + "_");
                }

                var sigStr = signature.ToString();

                if (!string.IsNullOrEmpty(sigStr))
                {
                    info.MD5Hash = sigStr.GetMd5Hash();
                }
                else
                {
                    info.MD5Hash = string.Empty;
                }

                return(info);
            }
            catch (Exception err)
            {
                Console.WriteLine("GetAllKeysSyncInfo ERROR - ", err.Message);
            }

            return(null);
        }
        public bool StartSyncProcess(Tenant tenant, List <DiscoveryPeer> peers, AppsSyncInfo apps, KeysSyncInfo keys, int seconds)
        {
            PersistencyInfo synchInfo = null;

            // save sync state infos for tenant

            lock (SyncInfos){
                synchInfo = SyncInfos.SingleOrDefault(s => s.SynchTenant.TenantId.CompareTo(tenant.TenantId) == 0);

                if (synchInfo == null)
                {
                    synchInfo             = new PersistencyInfo();
                    synchInfo.SynchTenant = tenant;
                    SyncInfos.Add(synchInfo);
                }
            }

            synchInfo.SynchStarted       = true;
            synchInfo.LastSynchStarterId = Program.InstanceConfig.ServerInstanceID;
            synchInfo.SyncStart          = DateTime.Now;
            synchInfo.SyncEnd            = DateTime.Now.AddSeconds(seconds);
            synchInfo.Apps              = JsonConvert.DeserializeObject <AllApplications>(JsonConvert.SerializeObject(apps.Apps));
            synchInfo.KeyValues         = JsonConvert.DeserializeObject <List <StoreKeyValue> >(JsonConvert.SerializeObject(keys.Keys));
            synchInfo.Peers             = JsonConvert.DeserializeObject <List <DiscoveryPeer> >(JsonConvert.SerializeObject(peers));
            synchInfo.PeerSyncResponses = new List <PeerSyncResponse>();
            synchInfo.AppsMD5           = apps.MD5Hash;
            synchInfo.KeysMD5           = keys.MD5Hash;

            // send MQTT PERSISTENCY_SYNC message
            if (!string.IsNullOrEmpty(synchInfo.AppsMD5))
            {
                var syncMessage = new MQTTPersistencySyncAppsMessageContent()
                {
                    TenantId    = tenant.TenantId,
                    PeerId      = Program.InstanceConfig.ServerInstanceID,
                    AppsMd5Hash = synchInfo.AppsMD5
                };

                var toIds = new List <string>();
                toIds.Add("ALL");

                var jsonMessage = JsonConvert.SerializeObject(syncMessage);
                jsonMessage = jsonMessage.Replace("\"", "'");

                var mqttMessage = new MQTTMessage()
                {
                    FromInstanceId = Program.InstanceConfig.ServerInstanceID,
                    ToInstancesIds = toIds,
                    Type           = "PERSISTENCY_SYNC_APPS",
                    Message        = jsonMessage
                };

                Program.mqttService.SendMQTTMessageToAll(synchInfo.SynchTenant.TenantId, mqttMessage);
            }

            if (!string.IsNullOrEmpty(synchInfo.KeysMD5))
            {
                var syncMessage = new MQTTPersistencySyncKeysMessageContent()
                {
                    TenantId    = tenant.TenantId,
                    PeerId      = Program.InstanceConfig.ServerInstanceID,
                    KeysMd5Hash = synchInfo.KeysMD5
                };

                var toIds = new List <string>();
                toIds.Add("ALL");

                var jsonMessage = JsonConvert.SerializeObject(syncMessage);
                jsonMessage = jsonMessage.Replace("\"", "'");

                var mqttMessage = new MQTTMessage()
                {
                    FromInstanceId = Program.InstanceConfig.ServerInstanceID,
                    ToInstancesIds = toIds,
                    Type           = "PERSISTENCY_SYNC_KEYS",
                    Message        = jsonMessage
                };

                Program.mqttService.SendMQTTMessageToAll(synchInfo.SynchTenant.TenantId, mqttMessage);
            }

            return(true);
        }