private void MaybePurge() { if (countUntilPurge.GetAndDecrement() == 0) { Purge(); } }
public override void Run() { DirectoryReader reader = null; bool success = false; try { Random random = Random; while (numUpdates.GetAndDecrement() > 0) { double group = random.NextDouble(); Term t; if (group < 0.1) { t = new Term("updKey", "g0"); } else if (group < 0.5) { t = new Term("updKey", "g1"); } else if (group < 0.8) { t = new Term("updKey", "g2"); } else { t = new Term("updKey", "g3"); } // System.out.println("[" + Thread.currentThread().getName() + "] numUpdates=" + numUpdates + " updateTerm=" + t); if (random.NextBoolean()) // sometimes unset a value { // System.err.println("[" + Thread.currentThread().getName() + "] t=" + t + ", f=" + f + ", updValue=UNSET"); writer.UpdateBinaryDocValue(t, f, null); writer.UpdateNumericDocValue(t, cf, null); } else { long updValue = random.Next(); // System.err.println("[" + Thread.currentThread().getName() + "] t=" + t + ", f=" + f + ", updValue=" + updValue); writer.UpdateBinaryDocValue(t, f, TestBinaryDocValuesUpdates.ToBytes(updValue)); writer.UpdateNumericDocValue(t, cf, updValue * 2); } if (random.NextDouble() < 0.2) { // delete a random document int doc = random.Next(numDocs); // System.out.println("[" + Thread.currentThread().getName() + "] deleteDoc=doc" + doc); writer.DeleteDocuments(new Term("id", "doc" + doc)); } if (random.NextDouble() < 0.05) // commit every 20 updates on average { // System.out.println("[" + Thread.currentThread().getName() + "] commit"); writer.Commit(); } if (random.NextDouble() < 0.1) // reopen NRT reader (apply updates), on average once every 10 updates { if (reader is null) { // System.out.println("[" + Thread.currentThread().getName() + "] open NRT"); reader = DirectoryReader.Open(writer, true); } else { // System.out.println("[" + Thread.currentThread().getName() + "] reopen NRT"); DirectoryReader r2 = DirectoryReader.OpenIfChanged(reader, writer, true); if (r2 != null) { reader.Dispose(); reader = r2; } } } } // System.out.println("[" + Thread.currentThread().getName() + "] DONE"); success = true; } catch (Exception e) when(e.IsIOException()) { throw RuntimeException.Create(e); } finally { if (reader != null) { try { reader.Dispose(); } catch (Exception e) when(e.IsIOException()) { if (success) // suppress this exception only if there was another exception { throw RuntimeException.Create(e); } } } done.Signal(); } }