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); } } } }
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; }