//Rolls back index to a chosen ID private void RollBackLast(int id) { // System.out.println("Attempting to rollback to "+id); string ids = "-" + id; IndexCommit last = null; ICollection <IndexCommit> commits = DirectoryReader.ListCommits(Dir); for (IEnumerator <IndexCommit> iterator = commits.GetEnumerator(); iterator.MoveNext();) { IndexCommit commit = iterator.Current; IDictionary <string, string> ud = commit.UserData; if (ud.Count > 0) { if (ud["index"].EndsWith(ids, StringComparison.Ordinal)) { last = commit; } } } if (last == null) { throw new Exception("Couldn't find commit point " + id); } IndexWriter w = new IndexWriter(Dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random)).SetIndexDeletionPolicy(new RollbackDeletionPolicy(this, id)).SetIndexCommit(last)); IDictionary <string, string> data = new Dictionary <string, string>(); data["index"] = "Rolled back to 1-" + id.ToString(CultureInfo.InvariantCulture); w.SetCommitData(data); w.Dispose(); }
public override void SetUp() { base.SetUp(); Dir = NewDirectory(); //Build index, of records 1 to 100, committing after each batch of 10 IndexDeletionPolicy sdp = new KeepAllDeletionPolicy(this); IndexWriter w = new IndexWriter(Dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random)).SetIndexDeletionPolicy(sdp)); for (int currentRecordId = 1; currentRecordId <= 100; currentRecordId++) { Document doc = new Document(); doc.Add(NewTextField(FIELD_RECORD_ID, currentRecordId.ToString(CultureInfo.InvariantCulture), Field.Store.YES)); w.AddDocument(doc); if (currentRecordId % 10 == 0) { IDictionary <string, string> data = new Dictionary <string, string>(); data["index"] = "records 1-" + currentRecordId.ToString(CultureInfo.InvariantCulture); w.SetCommitData(data); w.Commit(); } } w.Dispose(); }
public virtual void TestCommitUserData() { Directory dir = NewDirectory(); IndexWriter w = new IndexWriter(dir, (IndexWriterConfig)NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())).SetMaxBufferedDocs(2)); for (int j = 0; j < 17; j++) { AddDoc(w); } w.Dispose(); DirectoryReader r = DirectoryReader.Open(dir); // commit(Map) never called for this index Assert.AreEqual(0, r.IndexCommit.UserData.Count); r.Dispose(); w = new IndexWriter(dir, (IndexWriterConfig)NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())).SetMaxBufferedDocs(2)); for (int j = 0; j < 17; j++) { AddDoc(w); } IDictionary <string, string> data = new Dictionary <string, string>(); data["label"] = "test1"; w.SetCommitData(data); w.Dispose(); r = DirectoryReader.Open(dir); Assert.AreEqual("test1", r.IndexCommit.UserData["label"]); r.Dispose(); w = new IndexWriter(dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random()))); w.ForceMerge(1); w.Dispose(); dir.Dispose(); }
public virtual void TestFutureCommit() { Directory dir = NewDirectory(); IndexWriter w = new IndexWriter(dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())).SetIndexDeletionPolicy(NoDeletionPolicy.INSTANCE)); Document doc = new Document(); w.AddDocument(doc); // commit to "first" IDictionary <string, string> commitData = new Dictionary <string, string>(); commitData["tag"] = "first"; w.SetCommitData(commitData); w.Commit(); // commit to "second" w.AddDocument(doc); commitData["tag"] = "second"; w.SetCommitData(commitData); w.Dispose(); // open "first" with IndexWriter IndexCommit commit = null; foreach (IndexCommit c in DirectoryReader.ListCommits(dir)) { if (c.UserData["tag"].Equals("first", StringComparison.Ordinal)) { commit = c; break; } } Assert.IsNotNull(commit); w = new IndexWriter(dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random())).SetIndexDeletionPolicy(NoDeletionPolicy.INSTANCE).SetIndexCommit(commit)); Assert.AreEqual(1, w.NumDocs); // commit IndexWriter to "third" w.AddDocument(doc); commitData["tag"] = "third"; w.SetCommitData(commitData); w.Dispose(); // make sure "second" commit is still there commit = null; foreach (IndexCommit c in DirectoryReader.ListCommits(dir)) { if (c.UserData["tag"].Equals("second", StringComparison.Ordinal)) { commit = c; break; } } Assert.IsNotNull(commit); dir.Dispose(); }
public virtual void TestExpirationTimeDeletionPolicy() { const double SECONDS = 2.0; Directory dir = NewDirectory(); IndexWriterConfig conf = NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random)).SetIndexDeletionPolicy(new ExpirationTimeDeletionPolicy(this, dir, SECONDS)); MergePolicy mp = conf.MergePolicy; mp.NoCFSRatio = 1.0; IndexWriter writer = new IndexWriter(dir, conf); ExpirationTimeDeletionPolicy policy = (ExpirationTimeDeletionPolicy)writer.Config.IndexDeletionPolicy; IDictionary <string, string> commitData = new Dictionary <string, string>(); commitData["commitTime"] = Convert.ToString(Environment.TickCount); writer.SetCommitData(commitData); writer.Commit(); writer.Dispose(); long lastDeleteTime = 0; int targetNumDelete = TestUtil.NextInt32(Random, 1, 5); while (policy.NumDelete < targetNumDelete) { // Record last time when writer performed deletes of // past commits lastDeleteTime = Environment.TickCount; conf = NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random)).SetOpenMode(OpenMode.APPEND).SetIndexDeletionPolicy(policy); mp = conf.MergePolicy; mp.NoCFSRatio = 1.0; writer = new IndexWriter(dir, conf); policy = (ExpirationTimeDeletionPolicy)writer.Config.IndexDeletionPolicy; for (int j = 0; j < 17; j++) { AddDoc(writer); } commitData = new Dictionary <string, string>(); commitData["commitTime"] = Convert.ToString(Environment.TickCount); writer.SetCommitData(commitData); writer.Commit(); writer.Dispose(); Thread.Sleep((int)(1000.0 * (SECONDS / 5.0))); } // Then simplistic check: just verify that the // segments_N's that still exist are in fact within SECONDS // seconds of the last one's mod time, and, that I can // open a reader on each: long gen = SegmentInfos.GetLastCommitGeneration(dir); string fileName = IndexFileNames.FileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen); dir.DeleteFile(IndexFileNames.SEGMENTS_GEN); bool oneSecondResolution = true; while (gen > 0) { try { IndexReader reader = DirectoryReader.Open(dir); reader.Dispose(); fileName = IndexFileNames.FileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen); // if we are on a filesystem that seems to have only // 1 second resolution, allow +1 second in commit // age tolerance: SegmentInfos sis = new SegmentInfos(); sis.Read(dir, fileName); long modTime = Convert.ToInt64(sis.UserData["commitTime"]); oneSecondResolution &= (modTime % 1000) == 0; long leeway = (long)((SECONDS + (oneSecondResolution ? 1.0 : 0.0)) * 1000); Assert.IsTrue(lastDeleteTime - modTime <= leeway, "commit point was older than " + SECONDS + " seconds (" + (lastDeleteTime - modTime) + " msec) but did not get deleted "); } #pragma warning disable 168 catch (IOException e) #pragma warning restore 168 { // OK break; } dir.DeleteFile(IndexFileNames.FileNameFromGeneration(IndexFileNames.SEGMENTS, "", gen)); gen--; } dir.Dispose(); }
public virtual void TestReopenOnCommit() { Directory dir = NewDirectory(); IndexWriter writer = new IndexWriter(dir, NewIndexWriterConfig(TEST_VERSION_CURRENT, new MockAnalyzer(Random)).SetIndexDeletionPolicy(new KeepAllCommits()).SetMaxBufferedDocs(-1).SetMergePolicy(NewLogMergePolicy(10))); for (int i = 0; i < 4; i++) { Document doc = new Document(); doc.Add(NewStringField("id", "" + i, Field.Store.NO)); writer.AddDocument(doc); IDictionary <string, string> data = new Dictionary <string, string>(); data["index"] = i + ""; writer.SetCommitData(data); writer.Commit(); } for (int i = 0; i < 4; i++) { writer.DeleteDocuments(new Term("id", "" + i)); IDictionary <string, string> data = new Dictionary <string, string>(); data["index"] = (4 + i) + ""; writer.SetCommitData(data); writer.Commit(); } writer.Dispose(); DirectoryReader r = DirectoryReader.Open(dir); Assert.AreEqual(0, r.NumDocs); ICollection <IndexCommit> commits = DirectoryReader.ListCommits(dir); foreach (IndexCommit commit in commits) { DirectoryReader r2 = DirectoryReader.OpenIfChanged(r, commit); Assert.IsNotNull(r2); Assert.IsTrue(r2 != r); IDictionary <string, string> s = commit.UserData; int v; if (s.Count == 0) { // First commit created by IW v = -1; } else { v = Convert.ToInt32(s["index"]); } if (v < 4) { Assert.AreEqual(1 + v, r2.NumDocs); } else { Assert.AreEqual(7 - v, r2.NumDocs); } r.Dispose(); r = r2; } r.Dispose(); dir.Dispose(); }