public void TestDeleteMultiple() { testName = "TestDeleteMultiple"; SetUpTest(true); QueueDatabaseConfig dbConfig = new QueueDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.ExtentSize = 1024; dbConfig.Length = 270; QueueDatabase db = QueueDatabase.Open(testHome + "/" + testName + ".db", dbConfig); List <uint> rList = new List <uint>(); List <DatabaseEntry> kList = new List <DatabaseEntry>(); List <DatabaseEntry> vList = new List <DatabaseEntry>(); DatabaseEntry key, data; for (uint i = 1; i <= 100; i++) { key = new DatabaseEntry(BitConverter.GetBytes(i)); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes( "data" + i.ToString() + Configuration.RandomString(256))); rList.Add(i); kList.Add(key); vList.Add(data); db.Put(key, data); } // Bulk delete all records with recno in rList. db.Delete(new MultipleDatabaseEntry(rList)); Cursor cursor = db.Cursor(); Assert.IsFalse(cursor.MoveFirst()); /* * Bulk insert records whose key bulk buffer is * constructed by recno lists, then delete all. */ db.Put(new MultipleDatabaseEntry(rList), new MultipleDatabaseEntry(vList, false)); Assert.IsTrue(cursor.MoveFirst()); db.Delete(new MultipleDatabaseEntry(kList, true)); Assert.IsFalse(cursor.MoveFirst()); /* * Bulk insert records whose key bulk buffer is * constructed by DatabaseEntry lists, then delete all. */ db.Put(new MultipleDatabaseEntry(kList, true), new MultipleDatabaseEntry(vList, false)); Assert.IsTrue(cursor.MoveFirst()); db.Delete(new MultipleDatabaseEntry(kList, true)); Assert.IsFalse(cursor.MoveFirst()); cursor.Close(); db.Close(); }
public void Read() { Transaction txn = testLockStatsEnv.BeginTransaction(); for (int i = 0; i < 200; i++) { testLockStatsDb.Put(new DatabaseEntry(BitConverter.GetBytes(i)), new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes( Configuration.RandomString(i))), txn); testLockStatsDb.Sync(); } txn.Commit(); }
public void GenerateDeadlock() { Transaction txn = testLockStatsEnv.BeginTransaction(); try { testLockStatsDb.Put( new DatabaseEntry(BitConverter.GetBytes(100)), new DatabaseEntry(ASCIIEncoding.ASCII.GetBytes( Configuration.RandomString(200))), txn); DeadlockDidPut = 1; testLockStatsDb.Get(new DatabaseEntry( BitConverter.GetBytes(10)), txn); } catch (DeadlockException) { } // Abort unconditionally - we don't care about the transaction txn.Abort(); }
public void TestDeleteMultipleKey() { testName = "TestDeleteMultipleKey"; SetUpTest(true); QueueDatabaseConfig dbConfig = new QueueDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.ExtentSize = 1024; dbConfig.Length = 520; QueueDatabase db = QueueDatabase.Open(testHome + "/" + testName + ".db", dbConfig); List <KeyValuePair <DatabaseEntry, DatabaseEntry> > pList = new List <KeyValuePair <DatabaseEntry, DatabaseEntry> >(); DatabaseEntry key, data; for (uint i = 1; i <= 100; i++) { key = new DatabaseEntry( BitConverter.GetBytes(i)); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes( "data" + i.ToString() + Configuration.RandomString(512))); pList.Add(new KeyValuePair < DatabaseEntry, DatabaseEntry>(key, data)); db.Put(key, data); } // Create key/value pair bulk buffer and delete all. db.Delete(new MultipleKeyDatabaseEntry(pList, true)); // Verify that the database is empty. Assert.AreEqual(0, db.Truncate()); db.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 TestPutMultiple() { testName = "TestPutMultiple"; SetUpTest(true); QueueDatabaseConfig dbConfig = new QueueDatabaseConfig(); dbConfig.Creation = CreatePolicy.IF_NEEDED; dbConfig.ExtentSize = 1024; dbConfig.Length = 520; dbConfig.PadByte = 0; QueueDatabase db = QueueDatabase.Open(testHome + "/" + testName + ".db", dbConfig); List <uint> kList = new List <uint>(); List <DatabaseEntry> vList = new List <DatabaseEntry>(); DatabaseEntry key, data; for (uint i = 1; i <= 9; i++) { key = new DatabaseEntry(BitConverter.GetBytes(i)); data = new DatabaseEntry( ASCIIEncoding.ASCII.GetBytes("data" + i + Configuration.RandomString(512))); kList.Add(i); vList.Add(data); } // Create bulk buffer for recno based keys. MultipleDatabaseEntry kBuff = new MultipleDatabaseEntry(kList); Assert.IsTrue(kBuff.Recno); int val = 0; foreach (DatabaseEntry dbt in kBuff) { Assert.AreEqual( BitConverter.GetBytes(kList[val]), dbt.Data); val++; } Assert.AreEqual(9, val); // Create bulk buffer for data. MultipleDatabaseEntry vBuff = new MultipleDatabaseEntry(vList, false); /* * Create recno bulk buffer from another recno bulk * buffer. */ MultipleDatabaseEntry kBuff1 = new MultipleDatabaseEntry(kBuff.Data, kBuff.Recno); val = 0; foreach (DatabaseEntry dbt in kBuff1) { Assert.AreEqual( BitConverter.GetBytes(kList[val]), dbt.Data); val++; } Assert.AreEqual(9, val); // Bulk insert to database with key and value buffers. db.Put(kBuff, vBuff); Cursor cursor = db.Cursor(); KeyValuePair <DatabaseEntry, DatabaseEntry> pair; val = 0; while (cursor.MoveNext()) { pair = cursor.Current; Assert.AreEqual( BitConverter.GetBytes(kList[val]), pair.Key.Data); for (int i = 0; i < 520; i++) { if (i < vList[val].Data.Length) { Assert.AreEqual(vList[val].Data[i], pair.Value.Data[i]); } else { // The pad byte is 0. Assert.AreEqual(0, pair.Value.Data[i]); } } Assert.IsFalse(cursor.MoveNextDuplicate()); val++; } Assert.AreEqual(9, val); cursor.Close(); db.Close(); }