Beispiel #1
0
        private static IDocumentStore GenerateStore()
        {
            Logger.Log("Generating RavenDB Store", "RavenDB", LogSeverity.Info);
            string         databaseName = GlobalConfig.DbName;
            IDocumentStore Store        = new DocumentStore()
            {
                Urls     = new string[] { GlobalConfig.DbUrl },
                Database = databaseName
            }.Initialize();

            // Try block to check if the database is actually running.
            try
            {
                // If the database specified in the config doesn't exist, we create it
                if (Store.Maintenance.Server.Send(new GetDatabaseNamesOperation(0, 2)).All(x => x != databaseName))
                {
                    Store.Maintenance.Server.Send(new CreateDatabaseOperation(new DatabaseRecord(databaseName)));
                }
            }

            catch (Exception ex)
            {
                #pragma warning disable 4014
                Logger.AbortAfterLog("Unable to establish connection to database.", "RavenDB", LogSeverity.Critical,

                                     ex.Message.Split('\n')[0] + "\n" + ((ex.InnerException.Message) ?? ex.Message));
                Console.ReadLine();
                #pragma warning restore 4014
            }

            // We run backups to make sure everything works as intended
            DatabaseRecordWithEtag      dbRecord     = Store.Maintenance.Server.Send(new GetDatabaseRecordOperation(databaseName));
            PeriodicBackupConfiguration backupConfig = dbRecord.PeriodicBackups.FirstOrDefault(x => x.Name == "Default Backup");
            try
            {
                if (!Directory.Exists(Directory.GetCurrentDirectory() + @"/Backups"))
                {
                    Directory.CreateDirectory(Directory.GetCurrentDirectory() + @"/Backups");
                }

                if (backupConfig == null)
                {
                    Logger.Log("Backup Config Undefined. Generating Generic.", "RavenDB", LogSeverity.Warning);
                    PeriodicBackupConfiguration newConfig = new PeriodicBackupConfiguration()
                    {
                        Name = "Default Backup",
                        IncrementalBackupFrequency = "*/ 5 * ***",  // every five mins
                        FullBackupFrequency        = "* */3 * * *", // Every 3 hours
                        LocalSettings = new LocalSettings()
                        {
                            FolderPath = Directory.GetCurrentDirectory() + @"/Backups"
                        },
                        Disabled   = false,
                        BackupType = BackupType.Backup
                    };
                    Store.Maintenance.ForDatabase(databaseName).Send(new UpdatePeriodicBackupOperation(newConfig));
                }

                else
                {
                    Logger.Log("Backup Config Loaded.", "RavenDB", LogSeverity.Info);
                    backupConfig.LocalSettings = new LocalSettings()
                    {
                        FolderPath = Directory.GetCurrentDirectory() + @"/Backups"
                    };
                    Store.Maintenance.ForDatabase(databaseName).Send(new UpdatePeriodicBackupOperation(backupConfig));
                }
            }

            catch (Exception ex)
            {
                Logger.Log("Unable to setup RavenDB Automated backups. Backups will not be saved and errors could cause loss of data.", "RavenDB",
                           LogSeverity.Warning, ex.Message);
            }

            return(Store);
        }
Beispiel #2
0
        public async Task MarkPolicyAfterRollup()
        {
            DefaultClusterSettings[RavenConfiguration.GetKey(x => x.Tombstones.CleanupInterval)] = 1.ToString();
            var cluster = await CreateRaftCluster(3, watcherCluster : true);

            using (var store = GetDocumentStore(new Options {
                Server = cluster.Leader, ReplicationFactor = 3, RunInMemory = false
            }))
            {
                var raw    = new RawTimeSeriesPolicy();
                var config = new TimeSeriesConfiguration
                {
                    Collections = new Dictionary <string, TimeSeriesCollectionConfiguration>
                    {
                        ["Users"] = new TimeSeriesCollectionConfiguration
                        {
                            RawPolicy = raw,
                            Policies  = new List <TimeSeriesPolicy> {
                                new TimeSeriesPolicy("ByMinute", TimeSpan.FromMinutes(10))
                            }
                        }
                    },
                    PolicyCheckFrequency = TimeSpan.FromSeconds(1)
                };
                DatabaseRecordWithEtag record = null;
                await WaitForValueAsync(async() =>
                {
                    record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));
                    return(record.Topology.Members.Count);
                }, 3);

                Assert.Equal(3, record.Topology.Members.Count);
                var firstNode = record.Topology.Members[0];
                await store.Maintenance.SendAsync(new ConfigureTimeSeriesOperation(config));

                var now = new DateTime(2021, 6, 1, 10, 7, 29, DateTimeKind.Utc);
                foreach (var server in Servers)
                {
                    var database = await server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.Database);

                    database.Time.UtcDateTime = () => now;
                }

                var baseline = now.Add(-TimeSpan.FromMinutes(15));

                using (var session = store.OpenSession())
                {
                    var id = "users/karmel/0";
                    session.Store(new User {
                        Name = "Karmel"
                    }, id);
                    for (int i = 0; i < 15; i++)
                    {
                        session.TimeSeriesFor(id, "Heartrate")
                        .Append(baseline.AddMinutes(i), i);
                    }

                    session.SaveChanges();
                }

                using (var session = store.OpenSession())
                {
                    session.Store(new User(), "marker");
                    session.SaveChanges();
                    Assert.True(await WaitForDocumentInClusterAsync <User>(cluster.Nodes, store.Database, "marker", null, TimeSpan.FromSeconds(15)));
                }

                var res = new Dictionary <string, int>();
                foreach (var server in Servers)
                {
                    var database = await server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.Database);

                    var tss = database.DocumentsStorage.TimeSeriesStorage;
                    await database.TimeSeriesPolicyRunner.RunRollups();

                    var name = config.Collections["Users"].Policies[0].GetTimeSeriesName("Heartrate");
                    WaitForValue(() =>
                    {
                        using (var session = store.OpenSession())
                        {
                            var val = session.TimeSeriesFor("users/karmel/0", name)
                                      .Get(DateTime.MinValue, DateTime.MaxValue);
                            return(val != null);
                        }
                    }, true);

                    using (var session = store.OpenSession())
                    {
                        var val = session.TimeSeriesFor("users/karmel/0", name)
                                  .Get(DateTime.MinValue, DateTime.MaxValue).Length;
                        res.Add(server.ServerStore.NodeTag, val);
                        Assert.True(val > 0);
                    }
                }

                await WaitForValueAsync(async() =>
                {
                    record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));
                    return(record.Topology.Members.Count);
                }, 3);

                Assert.Equal(3, record.Topology.Members.Count);
                var firstNode2 = record.Topology.Members[0];
                Assert.Equal(firstNode2, firstNode);

                record = store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database)).Result;
                var list = record.Topology.Members;
                list.Reverse();
                await store.Maintenance.Server.SendAsync(new ReorderDatabaseMembersOperation(store.Database, list));
                await WaitForValueAsync(async() =>
                {
                    record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));
                    return(record.Topology.Members.Count);
                }, 3);

                Assert.Equal(3, record.Topology.Members.Count);
                firstNode2 = record.Topology.Members[0];
                Assert.NotEqual(firstNode2, firstNode);

                await Task.Delay(1000);

                foreach (var server in Servers)
                {
                    var database = await server.ServerStore.DatabasesLandlord.TryGetOrCreateResourceStore(store.Database);

                    database.Time.UtcDateTime = () => now.AddMinutes(10);
                    await database.TimeSeriesPolicyRunner.RunRollups();
                }

                foreach (var server in Servers)
                {
                    WaitForValue(() =>
                    {
                        using (var session = store.OpenSession())
                        {
                            var name = config.Collections["Users"].Policies[0].GetTimeSeriesName("Heartrate");
                            var val  = session.TimeSeriesFor("users/karmel/0", name)
                                       .Get(DateTime.MinValue, DateTime.MaxValue);
                            return(val.Length > res[server.ServerStore.NodeTag]);
                        }
                    }, true);
                }

                using (var session = store.OpenSession())
                {
                    var name = config.Collections["Users"].Policies[0].GetTimeSeriesName("Heartrate");
                    var val  = session.TimeSeriesFor("users/karmel/0", name)
                               .Get(DateTime.MinValue, DateTime.MaxValue);

                    Assert.True(val.Length > res[Servers[0].ServerStore.NodeTag]);
                }


                await WaitForValueAsync(async() =>
                {
                    record = await store.Maintenance.Server.SendAsync(new GetDatabaseRecordOperation(store.Database));
                    return(record.Topology.Members.Count);
                }, 3);

                Assert.Equal(3, record.Topology.Members.Count);
                firstNode2 = record.Topology.Members[0];
                Assert.NotEqual(firstNode2, firstNode);
            }
        }