public void T05_TestBackgroundFlushAndMergeConsistency()
{
// (1) one key to each of NUM_SEGMENTS separate segments
// (2) setup a separate thread that just repeatedly checks each key
// (3) perform a merge
// (4) shutdown the threads and see if any detected a readback failure
LayerManager db = new LayerManager(InitMode.NEW_REGION, "c:\\BENDtst\\7");
List<ValueCheckerThread> checkers = new List<ValueCheckerThread>();
int NUM_SEGMENTS = 7;
int performed_iterations = 0;
int TARGET_ITERATIONS = 10;
try {
for (int iter = 0; iter < TARGET_ITERATIONS; iter++) {
// setup the initial keys and checker threads
for (int x = 0; x < NUM_SEGMENTS; x++) {
string key = "test-" + x;
string value = "test-value-" + x;
db.setValueParsed(key, value);
// put it in it's own segment
db.flushWorkingSegment();
// start a checking thread
ValueCheckerThread checker = new ValueCheckerThread(db, key, value);
Thread newthread = new Thread(checker.doValidate);
newthread.Start();
checkers.Add(checker);
}
Thread.Sleep(5);
// verify there are no errors
foreach (ValueCheckerThread checker in checkers) {
Console.WriteLine("Thread key:{0} checks:{1} errors:{2}", checker.key_to_check, checker.num_checks, checker.num_errors);
}
foreach (ValueCheckerThread checker in checkers) {
Assert.AreEqual(0, checker.num_errors, "checker thread error, key(" + checker.key_to_check + ") error count != 0");
}
// trigger a merge
for (int x = 0; x < 20; x++) {
db.mergeIfNeeded();
}
Thread.Sleep(5);
// verify there are no errors
foreach (ValueCheckerThread checker in checkers) {
Console.WriteLine("Thread key:{0} checks:{1} errors:{2}", checker.key_to_check, checker.num_checks, checker.num_errors);
}
foreach (ValueCheckerThread checker in checkers) {
Assert.AreEqual(0, checker.num_errors, "checker thread error, key:" + checker.key_to_check);
}
// end the threads..
foreach (ValueCheckerThread checker in checkers) {
checker.end();
}
Thread.Sleep(10);
foreach (ValueCheckerThread checker in checkers) {
checker.waitForEnd();
}
checkers.Clear();
Thread.Sleep(5);
// delete the keys
System.Console.WriteLine("======= Clearing for next run...");
for (int x = 0; x < NUM_SEGMENTS; x++) {
string key = "test-" + x;
string value = "test-value-" + x;
db.setValue(new RecordKey().appendParsedKey(key), RecordUpdate.DeletionTombstone());
}
db.flushWorkingSegment();
Thread.Sleep(5);
db.mergeIfNeeded();
Thread.Sleep(5);
System.Console.WriteLine("======= Cleared for next run...");
performed_iterations = iter;
}
} finally {
System.Console.WriteLine("performed iterations = " + performed_iterations + " target iterations = " + TARGET_ITERATIONS);
}
}