public bool StopSyncProcess(Tenant tenant)
        {
            PersistencyInfo synchInfo = null;

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

            if (synchInfo != null)
            {
                synchInfo.SynchStarted = false;

                synchInfo.LastSynchStarterId = string.Empty;
                synchInfo.SyncEnd            = DateTime.Now;

                synchInfo.Peers             = new List <DiscoveryPeer>();
                synchInfo.PeerSyncResponses = new List <PeerSyncResponse>();

                return(true);
            }

            return(false);
        }
        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);
        }