public void TestStats()
        {
            testName = "TestStats";
            SetUpTest(true);
            string dbFileName = testHome + "/" + testName + ".db";

            HashDatabaseConfig dbConfig = new HashDatabaseConfig();

            ConfigCase1(dbConfig);
            HashDatabase db = HashDatabase.Open(dbFileName, dbConfig);

            HashStats stats     = db.Stats();
            HashStats fastStats = db.FastStats();

            ConfirmStatsPart1Case1(stats);
            ConfirmStatsPart1Case1(fastStats);

            // Put 100 records into the database.
            PutRecordCase1(db, null);

            stats = db.Stats();
            ConfirmStatsPart2Case1(stats);

            // Delete some data to get some free pages.
            byte[] bigArray = new byte[262144];
            db.Delete(new DatabaseEntry(bigArray));
            stats = db.Stats();
            ConfirmStatsPart3Case1(stats);

            db.Close();
        }
Esempio n. 2
0
 async Task HandleGameContents(HashStats hashStats) {
     await new StatusChanged(Status.Preparing).RaiseEvent().ConfigureAwait(false);
     try {
         await TryHandleGameContents(hashStats).ConfigureAwait(false);
     } finally {
         await new StatusChanged(Status.Synchronized).RaiseEvent().ConfigureAwait(false);
     }
 }
 public void ConfirmStatsPart2Case1(HashStats stats)
 {
     Assert.AreNotEqual(0, stats.BigPages);
     Assert.AreNotEqual(0, stats.BigPagesFreeBytes);
     Assert.AreNotEqual(0, stats.BucketPagesFreeBytes);
     Assert.AreNotEqual(0, stats.DuplicatePages);
     Assert.AreNotEqual(0, stats.DuplicatePagesFreeBytes);
     Assert.AreNotEqual(0, stats.MagicNumber);
     Assert.AreNotEqual(0, stats.MetadataFlags);
     Assert.AreEqual(100, stats.nData);
     Assert.AreNotEqual(0, stats.nHashBuckets);
     Assert.AreEqual(51, stats.nKeys);
     Assert.AreNotEqual(0, stats.nPages);
     Assert.AreEqual(0, stats.OverflowPages);
     Assert.AreEqual(0, stats.OverflowPagesFreeBytes);
 }
        private async Task <HashStats> GetHashStats(Game game, CancellationToken ct)
        {
            var syncInfo    = game.SyncInfo;
            var localHashes = syncInfo.ApiHashes;
            var hashes      = await GetHashesV3(game.Id, ct).ConfigureAwait(false);

            var hashStats = new HashStats {
                Hashes = hashes,
                ShouldSyncBecauseHashes = (localHashes == null) || (localHashes.Mods != hashes.Mods),

                /*
                 * ShouldSyncBecauseTime = syncInfo.LastSync.ToLocalTime() <
                 *                      Tools.Generic.GetCurrentUtcDateTime.ToLocalTime()
                 *                          .Subtract(TimeSpan.FromMinutes(10)),
                 */
                ShouldSyncBecauseVersion = syncInfo.LastSyncVersion != Consts.SyncVersion
            };

            return(hashStats);
        }
 public void ConfirmStatsPart3Case1(HashStats stats)
 {
     Assert.AreNotEqual(0, stats.FreePages);
 }
 public void ConfirmStatsPart1Case1(HashStats stats)
 {
     Assert.AreEqual(10, stats.FillFactor);
     Assert.AreEqual(4096, stats.PageSize);
     Assert.AreNotEqual(0, stats.Version);
 }
        /*
         * Test the external file database with or without environment.
         * 1. Config and open the environment;
         * 2. Verify the environment external file configs;
         * 3. Config and open the database;
         * 4. Verify the database external file configs;
         * 5. Insert and verify some external file data by database methods;
         * 6. Insert some external file data by cursor, update it and verify
         * the update by database stream and cursor;
         * 7. Verify the stats;
         * 8. Close all handles.
         * If "blobdbt" is true, set the data DatabaseEntry.ExternalFile as
         * true, otherwise make the data DatabaseEntry reach the external file
         * threshold in size.
         */
        void TestBlobHashDatabase(uint env_threshold, string env_blobdir,
                                  uint db_threshold, string db_blobdir, bool blobdbt)
        {
            if (env_threshold == 0 && db_threshold == 0)
            {
                return;
            }

            string hashDBName =
                testHome + "/" + testName + ".db";

            Configuration.ClearDir(testHome);
            HashDatabaseConfig cfg = new HashDatabaseConfig();

            cfg.Creation = CreatePolicy.ALWAYS;
            string blrootdir = "__db_bl";

            // Open the environment and verify the external file config.
            if (env_threshold > 0)
            {
                DatabaseEnvironmentConfig envConfig =
                    new DatabaseEnvironmentConfig();
                envConfig.AutoCommit            = true;
                envConfig.Create                = true;
                envConfig.UseMPool              = true;
                envConfig.UseLogging            = true;
                envConfig.UseTxns               = true;
                envConfig.UseLocking            = true;
                envConfig.ExternalFileThreshold = env_threshold;
                if (env_blobdir != null)
                {
                    envConfig.ExternalFileDir = env_blobdir;
                    blrootdir = env_blobdir;
                }
                DatabaseEnvironment env = DatabaseEnvironment.Open(
                    testHome, envConfig);
                if (env_blobdir == null)
                {
                    Assert.IsNull(env.ExternalFileDir);
                }
                else
                {
                    Assert.AreEqual(0,
                                    env.ExternalFileDir.CompareTo(env_blobdir));
                }
                Assert.AreEqual(env_threshold,
                                env.ExternalFileThreshold);
                cfg.Env    = env;
                hashDBName = testName + ".db";
            }

            // Open the database and verify the external file config.
            if (db_threshold > 0)
            {
                cfg.ExternalFileThreshold = db_threshold;
            }
            if (db_blobdir != null)
            {
                cfg.ExternalFileDir = db_blobdir;

                /*
                 * The external file directory setting in the database
                 * is effective only when it is opened without
                 * an environment.
                 */
                if (cfg.Env == null)
                {
                    blrootdir = db_blobdir;
                }
            }

            HashDatabase db = HashDatabase.Open(hashDBName, cfg);

            Assert.AreEqual(
                db_threshold > 0 ? db_threshold : env_threshold,
                db.ExternalFileThreshold);
            if (db_blobdir == null && cfg.Env == null)
            {
                Assert.IsNull(db.ExternalFileDir);
            }
            else
            {
                Assert.AreEqual(0,
                                db.ExternalFileDir.CompareTo(blrootdir));
            }

            // Insert and verify some external file data by database
            // methods.
            string[]      records = { "a", "b", "c", "d", "e", "f", "g", "h",
                                      "i",      "j", "k", "l", "m", "n", "o", "p","q","r", "s",
                                      "t",      "u", "v", "w", "x", "y", "z" };
            DatabaseEntry kdbt = new DatabaseEntry();
            DatabaseEntry ddbt = new DatabaseEntry();

            byte[] kdata, ddata;
            string str;
            KeyValuePair <DatabaseEntry, DatabaseEntry> pair;

            ddbt.ExternalFile = blobdbt;
            Assert.AreEqual(blobdbt, ddbt.ExternalFile);
            for (int i = 0; i < records.Length; i++)
            {
                kdata = BitConverter.GetBytes(i);
                str   = records[i];
                if (!blobdbt)
                {
                    for (int j = 0; j < db_threshold; j++)
                    {
                        str = str + records[i];
                    }
                }
                ddata     = Encoding.ASCII.GetBytes(str);
                kdbt.Data = kdata;
                ddbt.Data = ddata;
                db.Put(kdbt, ddbt);
                try
                {
                    pair = db.Get(kdbt);
                }
                catch (DatabaseException)
                {
                    db.Close();
                    if (cfg.Env != null)
                    {
                        cfg.Env.Close();
                    }
                    throw new TestException();
                }
                Assert.AreEqual(ddata, pair.Value.Data);
            }

            /*
             * Insert some external file data by cursor, update it and
             * verify the update by database stream.
             */
            kdata             = BitConverter.GetBytes(records.Length);
            ddata             = Encoding.ASCII.GetBytes("abc");
            kdbt.Data         = kdata;
            ddbt.Data         = ddata;
            ddbt.ExternalFile = true;
            Assert.IsTrue(ddbt.ExternalFile);
            pair =
                new KeyValuePair <DatabaseEntry, DatabaseEntry>(kdbt, ddbt);
            CursorConfig dbcConfig = new CursorConfig();
            Transaction  txn       = null;

            if (cfg.Env != null)
            {
                txn = cfg.Env.BeginTransaction();
            }
            HashCursor cursor = db.Cursor(dbcConfig, txn);

            cursor.Add(pair);
            DatabaseStreamConfig dbsc = new DatabaseStreamConfig();

            dbsc.SyncPerWrite = true;
            DatabaseStream dbs = cursor.DbStream(dbsc);

            Assert.AreNotEqual(null, dbs);
            Assert.IsFalse(dbs.GetConfig.ReadOnly);
            Assert.IsTrue(dbs.GetConfig.SyncPerWrite);
            Assert.AreEqual(3, dbs.Size());
            DatabaseEntry sdbt = dbs.Read(0, 3);

            Assert.IsNotNull(sdbt);
            Assert.AreEqual(ddata, sdbt.Data);
            sdbt = new DatabaseEntry(Encoding.ASCII.GetBytes("defg"));
            Assert.IsTrue(dbs.Write(sdbt, 3));
            Assert.AreEqual(7, dbs.Size());
            sdbt = dbs.Read(0, 7);
            Assert.IsNotNull(sdbt);
            Assert.AreEqual(Encoding.ASCII.GetBytes("abcdefg"), sdbt.Data);
            dbs.Close();

            /*
             * Verify the database stream can not write when it is
             * configured to be read-only.
             */
            dbsc.ReadOnly = true;
            dbs           = cursor.DbStream(dbsc);
            Assert.IsTrue(dbs.GetConfig.ReadOnly);
            try
            {
                Assert.IsFalse(dbs.Write(sdbt, 7));
                throw new TestException();
            }
            catch (DatabaseException)
            {
            }
            dbs.Close();

            // Verify the update by cursor.
            Assert.IsTrue(cursor.Move(kdbt, true));
            pair = cursor.Current;
            Assert.AreEqual(Encoding.ASCII.GetBytes("abcdefg"),
                            pair.Value.Data);
            cursor.Close();
            if (cfg.Env != null)
            {
                txn.Commit();
            }

            /*
             * Verify the external files are created in the expected
             * location.
             * This part of test is disabled since BTreeDatabase.BlobSubDir
             * is not exposed to users.
             */
            //if (cfg.Env != null)
            //	blrootdir = testHome + "/" + blrootdir;
            //string blobdir = blrootdir + "/" + db.BlobSubDir;
            //Assert.AreEqual(records.Length + 1,
            //    Directory.GetFiles(blobdir, "__db.bl*").Length);
            //Assert.AreEqual(1,
            //    Directory.GetFiles(blobdir, "__db_blob_meta.db").Length);

            // Verify the stats.
            HashStats st = db.Stats();

            Assert.AreEqual(records.Length + 1, st.nExternalFiles);

            // Close all handles.
            db.Close();
            if (cfg.Env != null)
            {
                cfg.Env.Close();
            }

            /*
             * Remove the default external file directory
             * when it is not under the test home.
             */
            if (db_blobdir == null && cfg.Env == null)
            {
                Directory.Delete("__db_bl", true);
            }
        }
        private async Task<HashStats> GetHashStats(Game game, CancellationToken ct) {
            var syncInfo = game.SyncInfo;
            var localHashes = syncInfo.ApiHashes;
            var hashes = await GetHashesV3(game.Id, ct).ConfigureAwait(false);

            var hashStats = new HashStats {
                Hashes = hashes,
                ShouldSyncBecauseHashes = (localHashes == null) || (localHashes.Mods != hashes.Mods),
                /*
                ShouldSyncBecauseTime = syncInfo.LastSync.ToLocalTime() <
                                        Tools.Generic.GetCurrentUtcDateTime.ToLocalTime()
                                            .Subtract(TimeSpan.FromMinutes(10)),
                                            */
                ShouldSyncBecauseVersion = syncInfo.LastSyncVersion != Consts.SyncVersion
            };
            return hashStats;
        }
Esempio n. 9
0
        async Task TryHandleGameContents(HashStats hashStats) {
            var gc = _gameContextFactory.GetGameContext();
            await gc.LoadAll().ConfigureAwait(false);

            if (hashStats.ShouldSyncBecauseHashes)
                await SynchronizeContent(gc.Games, hashStats.Hashes).ConfigureAwait(false);
            await new StatusChanged(Status.Preparing, 50).RaiseEvent().ConfigureAwait(false);
            await SynchronizeCollections(gc.Games).ConfigureAwait(false);
            await gc.SaveChanges().ConfigureAwait(false);
        }