public void TestDuplicates() { testName = "TestDuplicates"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secBtreeDBConfig = new SecondaryBTreeDatabaseConfig(btreeDB, null); secBtreeDBConfig.Creation = CreatePolicy.IF_NEEDED; secBtreeDBConfig.Duplicates = DuplicatesPolicy.SORTED; SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbSecFileName, secBtreeDBConfig); secDB.Close(); btreeDB.Close(); }
public void TestConfig() { testName = "TestConfig"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; XmlElement xmlElem = Configuration.TestSetUp( testFixtureName, testName); // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(btreeDB, null); Config(xmlElem, ref secDBConfig, true); Confirm(xmlElem, secDBConfig, true); // Close the primary btree database. btreeDB.Close(); }
public void GetSecondaryCursurWithTxn(string home, string name, bool ifCfg) { string dbFileName = name + ".db"; SecondaryCursor cursor; // Open env. DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.Create = true; envConfig.UseTxns = true; envConfig.UseMPool = true; DatabaseEnvironment env = DatabaseEnvironment.Open(home, envConfig); // Open primary/secondary database. Transaction txn = env.BeginTransaction(); BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; BTreeDatabase db = BTreeDatabase.Open(dbFileName, dbConfig, txn); SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(db, new SecondaryKeyGenDelegate(SecondaryKeyGen)); secDBConfig.Env = env; SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbFileName, secDBConfig, txn); for (int i = 0; i < 10; i++) { db.Put(new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(BitConverter.GetBytes((int)i)), txn); } // Create secondary cursor. if (ifCfg == false) { secDB.SecondaryCursor(txn); } else if (ifCfg == true) { CursorConfig cursorConfig = new CursorConfig(); cursorConfig.WriteCursor = false; cursor = secDB.SecondaryCursor(cursorConfig, txn); cursor.Close(); } secDB.Close(); db.Close(); txn.Commit(); env.Close(); }
public void TestDuplicates() { testName = "TestDuplicates"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secBtreeDBConfig = new SecondaryBTreeDatabaseConfig(btreeDB, null); secBtreeDBConfig.Creation = CreatePolicy.IF_NEEDED; secBtreeDBConfig.Duplicates = DuplicatesPolicy.SORTED; SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbSecFileName, secBtreeDBConfig); Assert.AreEqual(DuplicatesPolicy.SORTED, secDB.Duplicates); secDB.Close(); btreeDB.Close(); }
private void Dispose(bool disposing) { if (!disposing) { return; } db?.Close(true); db?.Dispose(); }
public void TestCompare() { testName = "TestCompare"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.ALWAYS; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secBtreeDBConfig = new SecondaryBTreeDatabaseConfig(null, null); secBtreeDBConfig.Primary = btreeDB; secBtreeDBConfig.Compare = new EntryComparisonDelegate( SecondaryEntryComparison); secBtreeDBConfig.KeyGen = new SecondaryKeyGenDelegate(SecondaryKeyGen); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open( dbFileName, secBtreeDBConfig); /* * Get the compare function set in the configuration * and run it in a comparison to see if it is alright. */ EntryComparisonDelegate cmp = secDB.Compare; DatabaseEntry dbt1, dbt2; dbt1 = new DatabaseEntry( BitConverter.GetBytes((int)257)); dbt2 = new DatabaseEntry( BitConverter.GetBytes((int)255)); Assert.Less(0, cmp(dbt1, dbt2)); for (int i = 0; i < 1000; i++) { btreeDB.Put(new DatabaseEntry( BitConverter.GetBytes(i)), new DatabaseEntry( BitConverter.GetBytes(i))); } secDB.Close(); btreeDB.Close(); }
private void Dispose(bool disposing) { if (!disposing) { return; } cursor?.Close(); indexDb?.Close(true); indexDb?.Dispose(); db?.Close(true); db?.Dispose(); }
public void TestDupCompare() { testName = "TestDupCompare"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; BTreeDatabaseConfig cfg = new BTreeDatabaseConfig(); cfg.Creation = CreatePolicy.ALWAYS; BTreeDatabase pDb = BTreeDatabase.Open( dbFileName, "p", cfg); SecondaryBTreeDatabaseConfig sCfg = new SecondaryBTreeDatabaseConfig(pDb, new SecondaryKeyGenDelegate(SecondaryKeyGen)); sCfg.Creation = CreatePolicy.IF_NEEDED; DatabaseEntry dbt1, dbt2; dbt1 = new DatabaseEntry( BitConverter.GetBytes((Int32)1)); dbt2 = new DatabaseEntry( BitConverter.GetBytes((Int64)4294967297)); // Do not set the duplicate comparison delegate. using (SecondaryBTreeDatabase sDb = SecondaryBTreeDatabase.Open(dbFileName, "s1", sCfg)) { try { int ret = sDb.DupCompare(dbt1, dbt2); throw new TestException(); } catch (NullReferenceException) { } } sCfg.DuplicateCompare = new EntryComparisonDelegate( SecondaryEntryComparison); using (SecondaryBTreeDatabase sDb = SecondaryBTreeDatabase.Open(dbFileName, "s2", sCfg)) { /* * Get the dup compare function set in the * configuration and run it in a comparison to * see if it is alright. */ int ret = 1 - BitConverter.ToInt32( BitConverter.GetBytes((Int64)4294967297), 0); Assert.AreEqual(ret, sDb.DupCompare(dbt1, dbt2)); } pDb.Close(); }
public void TestPrefixCompare() { testName = "TestPrefixCompare"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.ALWAYS; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secBtreeDBConfig = new SecondaryBTreeDatabaseConfig(btreeDB, null); secBtreeDBConfig.Primary = btreeDB; secBtreeDBConfig.Compare = new EntryComparisonDelegate( SecondaryEntryComparison); secBtreeDBConfig.PrefixCompare = new EntryComparisonDelegate( SecondaryEntryComparison); secBtreeDBConfig.KeyGen = new SecondaryKeyGenDelegate( SecondaryKeyGen); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open( dbFileName, secBtreeDBConfig); /* * Get the prefix compare function set in the * configuration and run it in a comparison to * see if it is alright. */ EntryComparisonDelegate cmp = secDB.PrefixCompare; DatabaseEntry dbt1, dbt2; dbt1 = new DatabaseEntry( BitConverter.GetBytes((int)1)); dbt2 = new DatabaseEntry( BitConverter.GetBytes((int)129)); Assert.Greater(0, cmp(dbt1, dbt2)); secDB.Close(); btreeDB.Close(); }
/// <summary> /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// </summary> public override void Dispose() { m_left.Dispose(); m_right.Dispose(); if (m_tmpDbsCreated) { m_tmpDbLeft.Close(true); m_tmpDbRight.Close(true); File.Delete(m_tmpDbLeftFile); File.Delete(m_tmpDbRightFile); } }
public void TestLockAndUnlockMutex() { testName = "TestLockAndUnlockMutex"; testHome = testFixtureHome + "/" + testName; Configuration.ClearDir(testHome); /* * Open an environment without locking and * deadlock detection. */ DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.FreeThreaded = true; envConfig.UseLogging = true; envConfig.Create = true; envConfig.UseMPool = true; DatabaseEnvironment env = DatabaseEnvironment.Open( testHome, envConfig); // Open a database. BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; TestDB = BTreeDatabase.Open( testName + ".db", dbConfig); // Get a mutex which will be used in two threads. TestMutex = env.GetMutex(true, false); // Begin two threads to write records into database. Thread mutexThread1 = new Thread( new ThreadStart(MutexThread1)); Thread mutexThread2 = new Thread( new ThreadStart(MutexThread2)); mutexThread1.Start(); mutexThread2.Start(); mutexThread1.Join(); mutexThread2.Join(); // Free the mutex. TestMutex.Dispose(); // Close all. TestDB.Close(); env.Close(); }
public void TestJoin() { testName = "TestJoin"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string secFileName1 = testHome + "/" + "sec_" + testName + "1.db"; string secFileName2 = testHome + "/" + "sec_" + testName + "2.db"; // Open a primary database. BTreeDatabaseConfig dbCfg = new BTreeDatabaseConfig(); dbCfg.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase db = BTreeDatabase.Open(dbFileName, dbCfg); for (int i = 0; i < 10; i++) { db.Put(new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(BitConverter.GetBytes(i))); } /* * Open two databases, their secondary databases and * secondary cursors. */ SecondaryBTreeDatabase secDB1, secDB2; SecondaryCursor[] cursors = new SecondaryCursor[2]; GetSecCursor(db, secFileName1, new SecondaryKeyGenDelegate(KeyGenOnBigByte), out secDB1, out cursors[0], false, null); GetSecCursor(db, secFileName2, new SecondaryKeyGenDelegate(KeyGenOnLittleByte), out secDB2, out cursors[1], true, null); // Get join cursor. JoinCursor joinCursor = db.Join(cursors, true); Assert.IsNotNull(joinCursor.GetEnumerator().Current); // Close all. joinCursor.Dispose(); cursors[0].Close(); cursors[1].Close(); secDB1.Close(); secDB2.Close(); db.Close(); }
public void TestRemoveWithNoSync() { testName = "TestRemoveWithNoSync"; testHome = testFixtureHome + "/" + testName; string dbFileName = testName + ".db"; Configuration.ClearDir(testHome); // Open a database and an increase sequence. DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.Create = true; envConfig.UseLogging = true; envConfig.UseMPool = true; envConfig.UseTxns = true; DatabaseEnvironment env = DatabaseEnvironment.Open(testHome, envConfig); /* Configure and open sequence's database. */ BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.AutoCommit = true; btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; btreeDBConfig.Env = env; BTreeDatabase btreeDB = BTreeDatabase.Open(dbFileName, btreeDBConfig); /* Configure and initialize sequence. */ SequenceConfig seqConfig = new SequenceConfig(); seqConfig.BackingDatabase = btreeDB; seqConfig.Creation = CreatePolicy.IF_NEEDED; seqConfig.Increment = true; seqConfig.InitialValue = Int64.MaxValue; seqConfig.key = new DatabaseEntry(); seqConfig.SetRange(Int64.MinValue, Int64.MaxValue); seqConfig.Wrap = true; seqConfig.key = new DatabaseEntry(); seqConfig.key.Data = ASCIIEncoding.ASCII.GetBytes("ex_csharp_sequence"); Sequence seq = new Sequence(seqConfig); /* * Remove the sequence. The sequence handle can not * be accessed again. */ seq.Remove(true); btreeDB.Close(); env.Close(); }
public void TestSecondaryCursor() { testName = "TestSecondaryCursor"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); // Open primary database. BTreeDatabaseConfig primaryDBConfig = new BTreeDatabaseConfig(); primaryDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase primaryDB = BTreeDatabase.Open(dbFileName, primaryDBConfig); // Open secondary database. SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(primaryDB, new SecondaryKeyGenDelegate(SecondaryKeyGen)); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbFileName, secDBConfig); primaryDB.Put(new DatabaseEntry( BitConverter.GetBytes((int)1)), new DatabaseEntry(BitConverter.GetBytes((int)11))); SecondaryCursor cursor = secDB.SecondaryCursor(); cursor.Move(new DatabaseEntry( BitConverter.GetBytes((int)11)), true); Assert.AreEqual(BitConverter.GetBytes((int)11), cursor.Current.Key.Data); // Close the cursor. cursor.Close(); // Close secondary database. secDB.Close(); // Close primary database. primaryDB.Close(); }
public void TestInvalidToken() { DatabaseEntry key, data; DatabaseEnvironment master = SetUpEnv("./master", 100, 8000, true); BTreeDatabase db = Open(master, true); Transaction txn = master.BeginTransaction(); key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("Key")); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("Data")); db.Put(key, data, txn); txn.Commit(); byte[] token = txn.CommitToken; token[19] += 123; Assert.Throws <DatabaseException>(delegate { master.IsTransactionApplied(token, 1000); }); db.Close(); master.Close(); }
public void TestJoin() { testName = "TestJoin"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string secFileName1 = testHome + "/" + "sec_" + testName + "1.db"; string secFileName2 = testHome + "/" + "sec_" + testName + "2.db"; Configuration.ClearDir(testHome); // Open a primary database. BTreeDatabaseConfig dbCfg = new BTreeDatabaseConfig(); dbCfg.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase db = BTreeDatabase.Open(dbFileName, dbCfg); /* * Open two databases, their secondary databases and * secondary cursors. */ SecondaryBTreeDatabase secDB1, secDB2; SecondaryCursor[] cursors = new SecondaryCursor[2]; GetSecCursor(db, secFileName1, new SecondaryKeyGenDelegate(KeyGenOnBigByte), out secDB1, out cursors[0], false, null); GetSecCursor(db, secFileName2, new SecondaryKeyGenDelegate(KeyGenOnLittleByte), out secDB2, out cursors[1], true, null); // Get join cursor. JoinCursor joinCursor = db.Join(cursors, true); // Close all. joinCursor.Close(); cursors[0].Close(); cursors[1].Close(); secDB1.Close(); secDB2.Close(); db.Close(); }
public void TestConfig() { testName = "TestConfig"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; XmlElement xmlElem = Configuration.TestSetUp( testFixtureName, testName); Configuration.ClearDir(testHome); // Open a database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Configure and initialize sequence. SequenceConfig seqConfig = new SequenceConfig(); seqConfig.BackingDatabase = btreeDB; seqConfig.Creation = CreatePolicy.IF_NEEDED; seqConfig.key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("key")); seqConfig.SetRange(Int64.MinValue, Int64.MaxValue); SequenceConfigTest.Config(xmlElem, ref seqConfig, true); Sequence seq = new Sequence(seqConfig); /* * Confirm that the squence is opened with the * configuration that we set. */ Confirm(xmlElem, seq, true); /* Close sequence, database and environment. */ seq.Close(); btreeDB.Close(); }
public void TestKeyGen() { testName = "TestKeyGen"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); // Open primary database. BTreeDatabaseConfig primaryDBConfig = new BTreeDatabaseConfig(); primaryDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase primaryDB = BTreeDatabase.Open(dbFileName, primaryDBConfig); // Open secondary database. SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(primaryDB, new SecondaryKeyGenDelegate(SecondaryKeyGen)); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbFileName, secDBConfig); primaryDB.Put(new DatabaseEntry( BitConverter.GetBytes((int)1)), new DatabaseEntry(BitConverter.GetBytes((int)11))); KeyValuePair <DatabaseEntry, DatabaseEntry> pair; pair = secDB.Get(new DatabaseEntry( BitConverter.GetBytes((int)11))); Assert.IsNotNull(pair.Value); // Close secondary database. secDB.Close(); // Close primary database. primaryDB.Close(); }
public void TestConfigObj() { testName = "TestConfigObj"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; Configuration.ClearDir(testHome); // Open a database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); /* Configure and initialize sequence. */ SequenceConfig seqConfig = new SequenceConfig(); seqConfig.BackingDatabase = btreeDB; seqConfig.Creation = CreatePolicy.IF_NEEDED; seqConfig.key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("key")); seqConfig.SetRange(Int64.MinValue, Int64.MaxValue); Sequence seq = new Sequence(seqConfig); // Confirm the objects set in SequenceConfig. Assert.AreEqual(dbFileName, seq.BackingDatabase.FileName); Assert.AreEqual(ASCIIEncoding.ASCII.GetBytes("key"), seq.Key.Data); Assert.AreEqual(Int64.MinValue, seq.Min); Assert.AreEqual(Int64.MaxValue, seq.Max); /* Close sequence, database and environment. */ seq.Close(); btreeDB.Close(); }
private void btn_WriteStringToBDB_Click(object sender, RoutedEventArgs e) { BTreeDatabaseConfig bTreeDatabaseConfig = new BTreeDatabaseConfig(); //文件不存在则创建 bTreeDatabaseConfig.Creation = CreatePolicy.IF_NEEDED; //页大小 bTreeDatabaseConfig.PageSize = 512; //缓存大小 bTreeDatabaseConfig.CacheSize = new CacheInfo(0, 64 * 1024, 1); BTreeDatabase bTreeDatabase = BTreeDatabase.Open("demo.db", bTreeDatabaseConfig); string guid = this.tbox_Key.Text; string url = this.tbox_Value.Text; DatabaseEntry key = new DatabaseEntry(); key.Data = Encoding.ASCII.GetBytes(guid); DatabaseEntry value = new DatabaseEntry(); value.Data = Encoding.ASCII.GetBytes(url); bTreeDatabase.Put(key, value); EMessageBox.Show("写入成功"); bTreeDatabase.Close(); }
public void TestOpen() { testName = "TestOpen"; testHome = testFixtureHome + "/" + testName; string dbFileName = testHome + "/" + testName + ".db"; string dbSecFileName = testHome + "/" + testName + "_sec.db"; Configuration.ClearDir(testHome); XmlElement xmlElem = Configuration.TestSetUp( testFixtureName, testName); // Open a primary btree database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open( dbFileName, btreeDBConfig); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(btreeDB, null); SecondaryBTreeDatabaseConfigTest.Config(xmlElem, ref secDBConfig, true); SecondaryBTreeDatabase secDB = SecondaryBTreeDatabase.Open(dbSecFileName, secDBConfig); // Confirm its flags configured in secDBConfig. Confirm(xmlElem, secDB, true); secDB.Close(); btreeDB.Close(); }
public void TestCommitSuccess() { testName = "TestCommitSuccess"; SetUpTest(true); string[] keys = { "key 1", "key 2", "key 3", "key 4", "key 5", "key 6", "key 7", "key 8","key 9", "key 10" }; DatabaseEnvironment master = SetUpEnv(testHome + "/master", 100, masterPort, true); DatabaseEnvironment client = SetUpEnv(testHome + "/client", 0, clientPort, false); master.RepMgrStartMaster(2); Thread.Sleep(2000); client.RepMgrStartClient(2); BTreeDatabase db1 = Open(master, true); BTreeDatabase db2 = null; for (; ;) { if (db2 == null) { try { db2 = Open(client, false); break; } catch (DatabaseException) { if (db2 != null) { db2.Close(true); db2 = null; } System.Threading.Thread.Sleep(1000); continue; } } } try { for (int i = 0; i < 3; i++) { Transaction txn = master.BeginTransaction(); // Get the key. DatabaseEntry key, data; key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes(keys[i])); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes(keys[i])); db1.Put(key, data, txn); txn.Commit(); byte[] token = txn.CommitToken; Assert.AreEqual(master.IsTransactionApplied(token, 5000), TransactionAppliedStatus.APPLIED); Assert.AreEqual(client.IsTransactionApplied(token, 200000), TransactionAppliedStatus.APPLIED); } } finally { db1.Close(); db2.Close(); master.Close(); client.Close(); } }
public void TestBadSecondaryException() { testName = "TestBadSecondaryException"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string secDBFileName = testHome + "/" + testName + "_sec.db"; // Open primary database. BTreeDatabaseConfig btreeDBConfig = new BTreeDatabaseConfig(); btreeDBConfig.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase btreeDB = BTreeDatabase.Open(dbFileName, btreeDBConfig); // Open secondary database. SecondaryBTreeDatabaseConfig secBtDbConfig = new SecondaryBTreeDatabaseConfig(btreeDB, new SecondaryKeyGenDelegate(SecondaryKeyGen)); secBtDbConfig.Creation = CreatePolicy.IF_NEEDED; SecondaryBTreeDatabase secBtDb = SecondaryBTreeDatabase.Open(secDBFileName, secBtDbConfig); // Put some data into primary database. for (int i = 0; i < 10; i++) { btreeDB.Put(new DatabaseEntry( BitConverter.GetBytes(i)), new DatabaseEntry(BitConverter.GetBytes(i))); } // Close the secondary database. secBtDb.Close(); // Delete record(5, 5) in primary database. btreeDB.Delete(new DatabaseEntry( BitConverter.GetBytes((int)5))); // Reopen the secondary database. SecondaryDatabase secDB = SecondaryDatabase.Open( secDBFileName, new SecondaryDatabaseConfig(btreeDB, new SecondaryKeyGenDelegate(SecondaryKeyGen))); /* * Getting record(5, 5) by secondary database should * throw BadSecondaryException since it has been * deleted in the primary database. */ try { secDB.Exists(new DatabaseEntry( BitConverter.GetBytes((int)5))); } catch (BadSecondaryException) { throw new ExpectedTestException(); } finally { secDB.Close(); btreeDB.Close(); } }
public void OpenSecDBWithinTxn(string home, string dbFileName, string dbSecFileName, bool ifDbName) { // Open an environment. DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.Create = true; envConfig.UseTxns = true; envConfig.UseMPool = true; envConfig.UseLogging = true; envConfig.UseLocking = true; DatabaseEnvironment env = DatabaseEnvironment.Open( home, envConfig); // Open a primary btree database. Transaction openDBTxn = env.BeginTransaction(); BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; BTreeDatabase db = BTreeDatabase.Open( dbFileName, dbConfig, openDBTxn); // Open a secondary btree database. SecondaryBTreeDatabaseConfig secDBConfig = new SecondaryBTreeDatabaseConfig(db, new SecondaryKeyGenDelegate(SecondaryKeyGen)); secDBConfig.Env = env; secDBConfig.Creation = CreatePolicy.IF_NEEDED; SecondaryBTreeDatabase secDB; if (ifDbName == false) { secDB = SecondaryBTreeDatabase.Open( dbSecFileName, secDBConfig, openDBTxn); } else { secDB = SecondaryBTreeDatabase.Open( dbSecFileName, "secondary", secDBConfig, openDBTxn); } openDBTxn.Commit(); secDB.Close(); // Open the existing secondary database. Transaction secTxn = env.BeginTransaction(); SecondaryDatabaseConfig secConfig = new SecondaryDatabaseConfig(db, new SecondaryKeyGenDelegate(SecondaryKeyGen)); secConfig.Env = env; SecondaryDatabase secExDB; if (ifDbName == false) { secExDB = SecondaryBTreeDatabase.Open( dbSecFileName, secConfig, secTxn); } else { secExDB = SecondaryBTreeDatabase.Open( dbSecFileName, "secondary", secConfig, secTxn); } secExDB.Close(); secTxn.Commit(); db.Close(); env.Close(); }
public void TestLockStats() { testName = "TestLockStats"; SetUpTest(true); // Configure locking subsystem. LockingConfig lkConfig = new LockingConfig(); lkConfig.MaxLockers = 60; lkConfig.MaxLocks = 50; lkConfig.MaxObjects = 70; lkConfig.Partitions = 20; lkConfig.DeadlockResolution = DeadlockPolicy.DEFAULT; // Configure and open environment. DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.Create = true; envConfig.FreeThreaded = true; envConfig.LockSystemCfg = lkConfig; envConfig.LockTimeout = 1000; envConfig.MPoolSystemCfg = new MPoolConfig(); envConfig.MPoolSystemCfg.CacheSize = new CacheInfo(0, 104800, 1); envConfig.NoLocking = false; envConfig.TxnTimeout = 2000; envConfig.UseLocking = true; envConfig.UseMPool = true; envConfig.UseTxns = true; DatabaseEnvironment env = DatabaseEnvironment.Open(testHome, envConfig); // Get and confirm locking subsystem statistics. LockStats stats = env.LockingSystemStats(); env.Msgfile = testHome + "/" + testName + ".log"; env.PrintLockingSystemStats(true, true); Assert.AreEqual(0, stats.AllocatedLockers); Assert.AreNotEqual(0, stats.AllocatedLocks); Assert.AreNotEqual(0, stats.AllocatedObjects); Assert.AreEqual(0, stats.InitLockers); Assert.AreNotEqual(0, stats.InitLocks); Assert.AreNotEqual(0, stats.InitObjects); Assert.AreEqual(0, stats.LastAllocatedLockerID); Assert.AreEqual(0, stats.LockConflictsNoWait); Assert.AreEqual(0, stats.LockConflictsWait); Assert.AreEqual(0, stats.LockDeadlocks); Assert.AreEqual(0, stats.LockDowngrades); Assert.AreEqual(0, stats.LockerNoWait); Assert.AreEqual(0, stats.Lockers); Assert.AreEqual(0, stats.LockerWait); Assert.AreEqual(9, stats.LockModes); Assert.AreEqual(0, stats.LockPuts); Assert.AreEqual(0, stats.LockRequests); Assert.AreEqual(0, stats.Locks); Assert.AreEqual(0, stats.LockSteals); Assert.AreEqual(1000, stats.LockTimeoutLength); Assert.AreEqual(0, stats.LockTimeouts); Assert.AreEqual(0, stats.LockUpgrades); Assert.AreEqual(0, stats.MaxBucketLength); Assert.AreEqual(0, stats.MaxLockers); Assert.AreEqual(60, stats.MaxLockersInTable); Assert.AreEqual(0, stats.MaxLocks); Assert.AreEqual(0, stats.MaxLocksInBucket); Assert.AreEqual(50, stats.MaxLocksInTable); Assert.AreEqual(0, stats.MaxLockSteals); Assert.AreEqual(0, stats.MaxObjects); Assert.AreEqual(0, stats.MaxObjectsInBucket); Assert.AreEqual(70, stats.MaxObjectsInTable); Assert.AreEqual(0, stats.MaxObjectSteals); Assert.AreEqual(0, stats.MaxPartitionLockNoWait); Assert.AreEqual(0, stats.MaxPartitionLockWait); Assert.AreNotEqual(0, stats.MaxUnusedID); Assert.AreEqual(20, stats.nPartitions); Assert.AreEqual(0, stats.ObjectNoWait); Assert.AreEqual(0, stats.Objects); Assert.AreEqual(0, stats.ObjectSteals); Assert.AreEqual(0, stats.ObjectWait); Assert.LessOrEqual(0, stats.PartitionLockNoWait); Assert.AreEqual(0, stats.PartitionLockWait); Assert.Less(0, stats.RegionNoWait); Assert.AreNotEqual(0, stats.RegionSize); Assert.AreEqual(0, stats.RegionWait); Assert.AreNotEqual(0, stats.TableSize); Assert.AreEqual(2000, stats.TxnTimeoutLength); Assert.AreEqual(0, stats.TxnTimeouts); env.PrintLockingSystemStats(); Transaction txn = env.BeginTransaction(); BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; dbConfig.FreeThreaded = true; BTreeDatabase db = BTreeDatabase.Open( testName + ".db", dbConfig, txn); txn.Commit(); testLockStatsEnv = env; testLockStatsDb = db; // Use some locks, to ensure the stats work when populated. txn = testLockStatsEnv.BeginTransaction(); for (int i = 0; i < 500; i++) { testLockStatsDb.Put( new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes( Configuration.RandomString(i))), txn); testLockStatsDb.Sync(); } txn.Commit(); env.PrintLockingSystemStats(); stats = env.LockingSystemStats(); Assert.Less(0, stats.LastAllocatedLockerID); Assert.Less(0, stats.LockDowngrades); Assert.LessOrEqual(0, stats.LockerNoWait); Assert.Less(0, stats.Lockers); Assert.LessOrEqual(0, stats.LockerWait); Assert.Less(0, stats.LockPuts); Assert.Less(0, stats.LockRequests); Assert.Less(0, stats.Locks); Assert.LessOrEqual(0, stats.LockSteals); Assert.LessOrEqual(0, stats.LockTimeouts); Assert.LessOrEqual(0, stats.LockUpgrades); Assert.Less(0, stats.MaxBucketLength); Assert.Less(0, stats.MaxLockers); Assert.Less(0, stats.MaxLocks); Assert.Less(0, stats.MaxLocksInBucket); Assert.LessOrEqual(0, stats.MaxLockSteals); Assert.Less(0, stats.MaxObjects); Assert.Less(0, stats.MaxObjectsInBucket); Assert.LessOrEqual(0, stats.MaxObjectSteals); Assert.LessOrEqual(0, stats.MaxPartitionLockNoWait); Assert.LessOrEqual(0, stats.MaxPartitionLockWait); Assert.Less(0, stats.MaxUnusedID); Assert.LessOrEqual(0, stats.ObjectNoWait); Assert.Less(0, stats.Objects); Assert.LessOrEqual(0, stats.ObjectSteals); Assert.LessOrEqual(0, stats.ObjectWait); Assert.Less(0, stats.PartitionLockNoWait); Assert.LessOrEqual(0, stats.PartitionLockWait); Assert.Less(0, stats.RegionNoWait); Assert.LessOrEqual(0, stats.RegionWait); Assert.LessOrEqual(0, stats.TxnTimeouts); // Force a deadlock to ensure the stats work. txn = testLockStatsEnv.BeginTransaction(); testLockStatsDb.Put(new DatabaseEntry(BitConverter.GetBytes(10)), new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes( Configuration.RandomString(200))), txn); Thread thread1 = new Thread(GenerateDeadlock); thread1.Start(); while (DeadlockDidPut == 0) { Thread.Sleep(10); } try { testLockStatsDb.Get(new DatabaseEntry( BitConverter.GetBytes(100)), txn); } catch (DeadlockException) { } // Abort unconditionally - we don't care about the transaction txn.Abort(); thread1.Join(); stats = env.LockingSystemStats(); Assert.Less(0, stats.LockConflictsNoWait); Assert.LessOrEqual(0, stats.LockConflictsWait); db.Close(); env.Close(); }
public void TestLoggingSystemStats() { testName = "TestLoggingSystemStats"; SetUpTest(true); string logDir = "./"; Directory.CreateDirectory(testHome + "/" + logDir); DatabaseEnvironmentConfig cfg = new DatabaseEnvironmentConfig(); cfg.Create = true; cfg.UseTxns = true; cfg.AutoCommit = true; cfg.UseLocking = true; cfg.UseMPool = true; cfg.UseLogging = true; cfg.MPoolSystemCfg = new MPoolConfig(); cfg.MPoolSystemCfg.CacheSize = new CacheInfo(0, 1048576, 1); cfg.LogSystemCfg = new LogConfig(); cfg.LogSystemCfg.AutoRemove = false; cfg.LogSystemCfg.BufferSize = 10240; cfg.LogSystemCfg.Dir = logDir; cfg.LogSystemCfg.FileMode = 755; cfg.LogSystemCfg.ForceSync = true; cfg.LogSystemCfg.InMemory = false; cfg.LogSystemCfg.LogBlobContent = false; cfg.LogSystemCfg.MaxFileSize = 1048576; cfg.LogSystemCfg.NoBuffer = false; cfg.LogSystemCfg.RegionSize = 204800; cfg.LogSystemCfg.ZeroOnCreate = true; DatabaseEnvironment env = DatabaseEnvironment.Open(testHome, cfg); LogStats stats = env.LoggingSystemStats(); env.PrintLoggingSystemStats(); Assert.AreEqual(10240, stats.BufferSize); Assert.AreEqual(1, stats.CurrentFile); Assert.AreNotEqual(0, stats.CurrentOffset); Assert.AreEqual(0, stats.FileId); Assert.AreEqual(1048576, stats.FileSize); Assert.AreEqual(0, stats.InitFileId); Assert.AreNotEqual(0, stats.MagicNumber); Assert.AreEqual(0, stats.MaxFileId); Assert.AreNotEqual(0, stats.PermissionsMode); Assert.AreEqual(1, stats.Records); Assert.AreNotEqual(0, stats.RegionLockNoWait); Assert.LessOrEqual(204800, stats.RegionSize); Assert.AreNotEqual(0, stats.Version); Transaction openTxn = env.BeginTransaction(); BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; BTreeDatabase db = BTreeDatabase.Open(testName + ".db", dbConfig, openTxn); openTxn.Commit(); Transaction writeTxn = env.BeginTransaction(); byte[] byteArr = new byte[1024]; for (int i = 0; i < 1000; i++) { db.Put(new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(byteArr), writeTxn); } writeTxn.Commit(); stats = env.LoggingSystemStats(); Assert.AreNotEqual(0, stats.Bytes); Assert.AreNotEqual(0, stats.BytesSinceCheckpoint); Assert.AreNotEqual(0, stats.DiskFileNumber); Assert.AreNotEqual(0, stats.DiskOffset); Assert.AreNotEqual(0, stats.MaxCommitsPerFlush); Assert.AreNotEqual(0, stats.MBytes); Assert.AreNotEqual(0, stats.MBytesSinceCheckpoint); Assert.AreNotEqual(0, stats.MinCommitsPerFlush); Assert.AreNotEqual(0, stats.OverflowWrites); Assert.AreNotEqual(0, stats.Syncs); Assert.AreNotEqual(0, stats.Writes); Assert.AreEqual(0, stats.Reads); Assert.AreEqual(0, stats.RegionLockWait); stats = env.LoggingSystemStats(true); stats = env.LoggingSystemStats(); Assert.AreEqual(0, stats.Bytes); Assert.AreEqual(0, stats.BytesSinceCheckpoint); Assert.AreEqual(0, stats.MaxCommitsPerFlush); Assert.AreEqual(0, stats.MBytes); Assert.AreEqual(0, stats.MBytesSinceCheckpoint); Assert.AreEqual(0, stats.MinCommitsPerFlush); Assert.AreEqual(0, stats.OverflowWrites); Assert.AreEqual(0, stats.Syncs); Assert.AreEqual(0, stats.Writes); Assert.AreEqual(0, stats.Reads); env.PrintLoggingSystemStats(true, true); db.Close(); env.Close(); }
public void TestMoveJoinCursor() { testName = "TestMoveJoinCursor"; SetUpTest(true); string dbFileName = testHome + "/" + testName + ".db"; string secFileName1 = testHome + "/" + "sec_" + testName + "1.db"; string secFileName2 = testHome + "/" + "sec_" + testName + "2.db"; // Open a primary database. BTreeDatabaseConfig dbCfg = new BTreeDatabaseConfig(); dbCfg.Creation = CreatePolicy.IF_NEEDED; BTreeDatabase db = BTreeDatabase.Open(dbFileName, dbCfg); /* * Open a secondary database on high byte of * its data and another secondary database on * little byte of its data. */ SecondaryBTreeDatabase secDB1, secDB2; SecondaryCursor[] cursors = new SecondaryCursor[2]; byte[] byteValue = new byte[1]; byteValue[0] = 0; GetSecCursor(db, secFileName1, new SecondaryKeyGenDelegate(KeyGenOnBigByte), out secDB1, out cursors[0], false, new DatabaseEntry(byteValue)); byteValue[0] = 1; GetSecCursor(db, secFileName2, new SecondaryKeyGenDelegate(KeyGenOnLittleByte), out secDB2, out cursors[1], true, new DatabaseEntry(byteValue)); // Get join cursor. JoinCursor joinCursor = db.Join(cursors, true); /* * MoveNextJoinItem do not use data value found * in all of the cursor so the data in Current won't be * changed. */ Assert.IsTrue(joinCursor.MoveNextItem()); Assert.AreEqual(0, joinCursor.Current.Key.Data[ joinCursor.Current.Key.Data.Length - 1]); Assert.AreEqual(1, joinCursor.Current.Key.Data[0]); Assert.IsNull(joinCursor.Current.Value.Data); // Iterate on join cursor. foreach (KeyValuePair <DatabaseEntry, DatabaseEntry> pair in joinCursor) { /* * Confirm that the key got by join cursor has 0 at * its highest byte and 1 at its lowest byte. */ Assert.AreEqual(0, pair.Key.Data[pair.Key.Data.Length - 1]); Assert.AreEqual(1, pair.Key.Data[0]); } Assert.IsFalse(joinCursor.MoveNext()); // Close all. joinCursor.Close(); cursors[0].Close(); cursors[1].Close(); secDB1.Close(); secDB2.Close(); db.Close(); }
public int doloop() { BTreeDatabase db = null; for (;;) { if (db == null) { BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Env = dbenv.env; if (dbenv.IsMaster) { /* * Open database allowing create only if this is a master * database. A client database uses polling to attempt * to open the database, without creating it, until the * open succeeds. * * This polling logic for allowing create can be * simplified under some circumstances. For example, if * the application can be sure a database is already * there, it would never need to open it allowing create. */ dbConfig.Creation = CreatePolicy.IF_NEEDED; } dbConfig.AutoCommit = true; try { db = BTreeDatabase.Open(RepConfig.progname, dbConfig); } catch (DatabaseException) { Console.WriteLine("no stock database available yet."); if (db != null) { db.Close(true); db = null; } Thread.Sleep(RepConfig.SLEEPTIME); continue; } } /* Listen for input, and add it to the database. */ Console.Write("QUOTESERVER"); if (dbenv.IsMaster == false) { Console.Write("(read-only)"); } Console.Write("> "); string nextLine = null; try { nextLine = Console.ReadLine(); } catch (System.IO.IOException) { Console.WriteLine("Unable to get data"); break; } /* A blank line causes the DB to be dumped. */ string[] words = nextLine.Split(' '); if (words.Length == 0 || words.Length == 1 && words[0].Length == 0) { try { if (dbenv.InClientSync) { Console.WriteLine("Cannot read data during " + "client initialization - please try again."); } else { printStocks(db); } } catch (DeadlockException) { continue; } catch (DatabaseException e) { /* * This could be DB_REP_HANDLE_DEAD, which * should close the database and continue. */ Console.WriteLine("Got db exception reading replication" + "DB: " + e); Console.WriteLine("Expected if it was due to a dead " + "replication handle, otherwise an unexpected error."); db.Close(false); /* Close no sync. */ db = null; continue; } continue; } if (words.Length == 1 && (words[0].ToLower().Equals("quit") || words[0].ToLower().Equals("exit"))) { dbenv.AppFinished = true; break; } else if (words.Length != 2) { Console.WriteLine("Format: TICKER VALUE"); continue; } if (!dbenv.IsMaster) { Console.WriteLine("Can't update client"); continue; } DatabaseEntry key = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes(words[0])); DatabaseEntry data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes(words[1])); db.Put(key, data); } if (db != null) { db.Close(true); } return(0); }
public void MoveWithRMW(string home, string name) { paramEnv = null; paramDB = null; // Open the environment. DatabaseEnvironmentConfig envCfg = new DatabaseEnvironmentConfig(); envCfg.Create = true; envCfg.FreeThreaded = true; envCfg.UseLocking = true; envCfg.UseLogging = true; envCfg.UseMPool = true; envCfg.UseTxns = true; paramEnv = DatabaseEnvironment.Open(home, envCfg); // Open database in transaction. Transaction openTxn = paramEnv.BeginTransaction(); BTreeDatabaseConfig cfg = new BTreeDatabaseConfig(); cfg.Creation = CreatePolicy.ALWAYS; cfg.Env = paramEnv; cfg.FreeThreaded = true; cfg.PageSize = 4096; // Use record number. cfg.UseRecordNumbers = true; paramDB = BTreeDatabase.Open(name + ".db", cfg, openTxn); openTxn.Commit(); /* * Put 10 different, 2 duplicate and another different * records into database. */ Transaction txn = paramEnv.BeginTransaction(); for (int i = 0; i < 13; i++) { DatabaseEntry key, data; if (i == 10 || i == 11) { key = new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("key")); data = new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes("data")); } else { key = new DatabaseEntry(BitConverter.GetBytes(i)); data = new DatabaseEntry(BitConverter.GetBytes(i)); } paramDB.Put(key, data, txn); } txn.Commit(); // Get a event wait handle. signal = new EventWaitHandle(false, EventResetMode.ManualReset); /* * Start RdMfWt() in two threads. RdMfWt() reads * and writes data into database. */ Thread t1 = new Thread(new ThreadStart(RdMfWt)); Thread t2 = new Thread(new ThreadStart(RdMfWt)); t1.Start(); t2.Start(); // Give both threads time to read before signalling them to write. Thread.Sleep(1000); // Invoke the write operation in both threads. signal.Set(); // Return the number of deadlocks. while (t1.IsAlive || t2.IsAlive) { /* * Give both threads time to write before * counting the number of deadlocks. */ Thread.Sleep(1000); uint deadlocks = paramEnv.DetectDeadlocks(DeadlockPolicy.DEFAULT); // Confirm that there won't be any deadlock. Assert.AreEqual(0, deadlocks); } t1.Join(); t2.Join(); paramDB.Close(); paramEnv.Close(); }
public void TestLockStats() { testName = "TestLockStats"; SetUpTest(true); // Configure locking subsystem. LockingConfig lkConfig = new LockingConfig(); lkConfig.MaxLockers = 60; lkConfig.MaxLocks = 50; lkConfig.MaxObjects = 70; lkConfig.Partitions = 20; lkConfig.DeadlockResolution = DeadlockPolicy.DEFAULT; // Configure and open environment. DatabaseEnvironmentConfig envConfig = new DatabaseEnvironmentConfig(); envConfig.Create = true; envConfig.FreeThreaded = true; envConfig.LockSystemCfg = lkConfig; envConfig.LockTimeout = 1000; envConfig.MPoolSystemCfg = new MPoolConfig(); envConfig.MPoolSystemCfg.CacheSize = new CacheInfo(0, 104800, 1); envConfig.NoLocking = false; envConfig.TxnTimeout = 2000; envConfig.UseLocking = true; envConfig.UseMPool = true; envConfig.UseTxns = true; DatabaseEnvironment env = DatabaseEnvironment.Open(testHome, envConfig); // Get and confirm locking subsystem statistics. LockStats stats = env.LockingSystemStats(); env.PrintLockingSystemStats(true, true); Assert.AreEqual(0, stats.LastAllocatedLockerID); Assert.AreEqual(0, stats.LockConflictsNoWait); Assert.AreEqual(0, stats.LockConflictsWait); Assert.AreEqual(0, stats.LockDeadlocks); Assert.AreEqual(0, stats.LockDowngrades); Assert.AreEqual(0, stats.LockerNoWait); Assert.AreEqual(0, stats.Lockers); Assert.AreEqual(0, stats.LockerWait); Assert.AreEqual(9, stats.LockModes); Assert.AreEqual(0, stats.LockPuts); Assert.AreEqual(0, stats.LockRequests); Assert.AreEqual(0, stats.Locks); Assert.AreEqual(0, stats.LockSteals); Assert.AreEqual(1000, stats.LockTimeoutLength); Assert.AreEqual(0, stats.LockTimeouts); Assert.AreEqual(0, stats.LockUpgrades); Assert.AreEqual(0, stats.MaxBucketLength); Assert.AreEqual(0, stats.MaxLockers); Assert.AreEqual(60, stats.MaxLockersInTable); Assert.AreEqual(0, stats.MaxLocks); Assert.AreEqual(0, stats.MaxLocksInBucket); Assert.AreEqual(50, stats.MaxLocksInTable); Assert.AreEqual(0, stats.MaxLockSteals); Assert.AreEqual(0, stats.MaxObjects); Assert.AreEqual(0, stats.MaxObjectsInBucket); Assert.AreEqual(70, stats.MaxObjectsInTable); Assert.AreEqual(0, stats.MaxObjectSteals); Assert.AreEqual(0, stats.MaxPartitionLockNoWait); Assert.AreEqual(0, stats.MaxPartitionLockWait); Assert.AreNotEqual(0, stats.MaxUnusedID); Assert.AreEqual(20, stats.nPartitions); Assert.AreEqual(0, stats.ObjectNoWait); Assert.AreEqual(0, stats.Objects); Assert.AreEqual(0, stats.ObjectSteals); Assert.AreEqual(0, stats.ObjectWait); Assert.LessOrEqual(0, stats.PartitionLockNoWait); Assert.AreEqual(0, stats.PartitionLockWait); Assert.Less(0, stats.RegionNoWait); Assert.AreNotEqual(0, stats.RegionSize); Assert.AreEqual(0, stats.RegionWait); Assert.AreEqual(2000, stats.TxnTimeoutLength); Assert.AreEqual(0, stats.TxnTimeouts); env.PrintLockingSystemStats(); Transaction txn = env.BeginTransaction(); BTreeDatabaseConfig dbConfig = new BTreeDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.Env = env; dbConfig.FreeThreaded = true; BTreeDatabase db = BTreeDatabase.Open( testName + ".db", dbConfig, txn); txn.Commit(); testLockStatsEnv = env; testLockStatsDb = db; Thread thread1 = new Thread(new ThreadStart(Read)); Thread thread2 = new Thread(new ThreadStart(Write)); thread1.Start(); Thread.Sleep(1000); thread2.Start(); thread1.Join(); thread2.Join(); env.PrintLockingSystemStats(); stats = env.LockingSystemStats(); Assert.Less(0, stats.LastAllocatedLockerID); Assert.Less(0, stats.LockConflictsNoWait); Assert.LessOrEqual(0, stats.LockConflictsWait); Assert.LessOrEqual(0, stats.LockDeadlocks); Assert.Less(0, stats.LockDowngrades); Assert.LessOrEqual(0, stats.LockerNoWait); Assert.Less(0, stats.Lockers); Assert.LessOrEqual(0, stats.LockerWait); Assert.Less(0, stats.LockPuts); Assert.Less(0, stats.LockRequests); Assert.Less(0, stats.Locks); Assert.LessOrEqual(0, stats.LockSteals); Assert.LessOrEqual(0, stats.LockTimeouts); Assert.LessOrEqual(0, stats.LockUpgrades); Assert.Less(0, stats.MaxBucketLength); Assert.Less(0, stats.MaxLockers); Assert.Less(0, stats.MaxLocks); Assert.Less(0, stats.MaxLocksInBucket); Assert.LessOrEqual(0, stats.MaxLockSteals); Assert.Less(0, stats.MaxObjects); Assert.Less(0, stats.MaxObjectsInBucket); Assert.LessOrEqual(0, stats.MaxObjectSteals); Assert.LessOrEqual(0, stats.MaxPartitionLockNoWait); Assert.LessOrEqual(0, stats.MaxPartitionLockWait); Assert.Less(0, stats.MaxUnusedID); Assert.Less(0, stats.ObjectNoWait); Assert.Less(0, stats.Objects); Assert.LessOrEqual(0, stats.ObjectSteals); Assert.LessOrEqual(0, stats.ObjectWait); Assert.Less(0, stats.PartitionLockNoWait); Assert.LessOrEqual(0, stats.PartitionLockWait); Assert.Less(0, stats.RegionNoWait); Assert.LessOrEqual(0, stats.RegionWait); Assert.Less(0, stats.TxnTimeouts); db.Close(); env.Close(); }