Пример #1
0
        private static void MigrateDatabase(CmdOptions opts)
        {
            MongoClient client = new MongoClient(opts.MongoUrl);
            var         mc     = client.GetDatabase(opts.MongoDbName).GetCollection <BsonDocument>("blocks");

            var fb = Builders <BsonDocument> .Filter;

            var tf  = fb.Not(fb.Type("dif", BsonType.Double));
            var cur = mc.Find(tf).Project("{bn:1, dif:1}").ToCursor();

            while (cur.MoveNext())
            {
                Console.WriteLine("Next migration batch...");
                foreach (var doc in cur.Current)
                {
                    double newval = double.Parse(doc["dif"].ToString());
                    //Hard coded for testing
                    var filter = Builders <BsonDocument> .Filter.Eq("bn", doc["bn"]);

                    var update = Builders <BsonDocument> .Update.Set("dif", newval);

                    mc.UpdateOne(filter, update);
                    long bn = doc["bn"].AsInt64;
                    if (bn % 1000 == 0)
                    {
                        Console.WriteLine("Updated block " + doc["bn"].ToString() + " to " + newval);
                    }
                }
            }
        }
Пример #2
0
        static void RunPeriodically(CmdOptions opts)
        {
            SentrySdk.ConfigureScope(scope =>
            {
                scope.SetTag("rpc", opts.RpcUrl);
                scope.SetTag("dbname", opts.MongoDbName);
                scope.SetTag("dburl", opts.MongoUrl);
            });

            // Migration step

            if (opts.MigrateDB)
            {
                Console.WriteLine("Start DB migration");
                MigrateDatabase(opts);
            }

            BlockChainImporter importer = new BlockChainImporter(opts);

            while (true)
            {
                long lag = importer.GetCurrentLag();
                if (lag > 50)
                {
                    importer.RunImporter();
                }
                else
                {
                    Console.WriteLine($"Waiting for more fresh blocks ({lag} blocks waiting)...");
                }
                Thread.Sleep(TimeSpan.FromSeconds(10));
            }
            // ReSharper disable once FunctionNeverReturns
        }
        public BlockChainImporter(CmdOptions opts)
        {
            string mongoDbUrl = opts.MongoUrl;

            if (!mongoDbUrl.StartsWith("mongodb://"))
            {
                throw new Exception("ERROR: first argument has to be a mongo url");
            }

            _rpcUrls = opts.RpcUrl.Split(',').ToList();
            if (!_rpcUrls.All(x => x.StartsWith("http://")))
            {
                throw new Exception("ERROR: second argument has to be a http RPC url");
            }

            _ipc       = opts.IpcPath;
            _db        = new Database(mongoDbUrl, opts.MongoDbName);
            _batchSize = opts.BatchSize;
        }