private static void StartSyncingConfig(ArtifactSyncJobConfig config)
        {
            var sourceMongoUrl = new MongoUrl(config.EventStoreConnectionString);
            var sourceDatabase = new MongoClient(sourceMongoUrl).GetDatabase(sourceMongoUrl.DatabaseName);

            var   rmStream   = sourceDatabase.GetCollection <BsonDocument>("Commits");
            Int64 checkpoint = config.GetLastSyncedCheckpoint();

            var syncUnit = new SyncUnit(new SyncUnitConfigurator());

            while (true)
            {
                var files = rmStream
                            .Find(Builders <BsonDocument> .Filter.Gte("_id", checkpoint))
                            .Sort(Builders <BsonDocument> .Sort.Ascending("_id"))
                            .ToEnumerable();
                foreach (var file in files)
                {
                    BsonArray events = file["Events"].AsBsonArray;
                    foreach (var evt in events)
                    {
                        var body = evt["Payload"]["Body"].AsBsonDocument;
                        if (body.Names.Contains("BlobId"))
                        {
                            string fileId = body["BlobId"].AsString;
                            syncUnit.Sync(fileId, config);
                        }
                    }

                    var checkpointToken = file["_id"].AsInt64;
                    checkpoint = checkpointToken + 1;
                    config.SaveLastSyncedCheckpoint(checkpoint);
                }
                Console.WriteLine("No more commit to sync!!");
                Thread.Sleep(2000);
            }
        }
        internal static void StartSync()
        {
            //grab all tenants from configuration manager.
            Console.WriteLine("Reading data from configuration manager");

            var tenants = ConfigurationServiceClient.Instance.GetStructuredSetting("tenants");
            List <ArtifactSyncJobConfig> configs = new List <ArtifactSyncJobConfig>();

            foreach (string tenantId in tenants) // conversion from dynamic array
            {
                Console.WriteLine("Looking for configuration for tenant {0}", tenantId);

                var artifactSyncJobConfig = new ArtifactSyncJobConfig(tenantId);

                var tenantOriginalConnectionStringSettingName           = tenantId + "-dest-ori";
                ConnectionStringSettings destinationConnectionOriginal  = ConfigurationManager.ConnectionStrings[tenantOriginalConnectionStringSettingName];
                var tenantArtifactsConnectionStringSettingName          = tenantId + "-dest-art";
                ConnectionStringSettings destinationConnectionArtifacts = ConfigurationManager.ConnectionStrings[tenantArtifactsConnectionStringSettingName];

                if (destinationConnectionOriginal == null)
                {
                    Console.WriteLine("Destination connection for original [{1}], tenant {0} not specified, tenant skipped", tenantId, tenantOriginalConnectionStringSettingName);
                    continue;
                }
                if (destinationConnectionArtifacts == null)
                {
                    Console.WriteLine("Destination connection for artifacts [{1}], tenant {0} not specified, tenant skipped", tenantId, tenantArtifactsConnectionStringSettingName);
                    continue;
                }
                Console.WriteLine("Configuration for tenant {0} valid!", tenantId);
                Console.WriteLine("Destination db for tenant/Original {0}: {1}", tenantId, destinationConnectionOriginal.ConnectionString);
                Console.WriteLine("Destination db for tenant/Artifacts {0}: {1}", tenantId, destinationConnectionArtifacts.ConnectionString);
                Console.WriteLine("TENANT {0} sync started from checkpoint token {1}", tenantId, artifactSyncJobConfig.GetLastSyncedCheckpoint());

                Console.Write("Do you want start syncronization for tenant {0} (s/n)?", tenantId);
                Char answer;
                do
                {
                    answer = Console.ReadKey().KeyChar;
                } while (answer != 's' && answer != 'n');
                if (answer == 's')
                {
                    artifactSyncJobConfig.SetDestination(destinationConnectionOriginal.ConnectionString, destinationConnectionArtifacts.ConnectionString);
                    configs.Add(artifactSyncJobConfig);
                }
            }
            Console.WriteLine("Press a key to start sync");
            Console.ReadLine();
            List <Task> tasks = new List <Task>();

            foreach (var config in configs)
            {
                var task = Task.Factory.StartNew(() => StartSyncingConfig(config));
                tasks.Add(task);
            }
            Task.WaitAll(tasks.ToArray());
        }