blob: 21ad338a8d3b36d3539983f556d2592cb21be7b1 [file] [log] [blame]
using Lucene.Net.Store;
using Lucene.Net.Util;
using NUnit.Framework;
using System;
using System.IO;
using Assert = Lucene.Net.TestFramework.Assert;
namespace Lucene.Net.Index
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using Directory = Lucene.Net.Store.Directory;
using Document = Documents.Document;
using MockDirectoryWrapper = Lucene.Net.Store.MockDirectoryWrapper;
[TestFixture]
public class TestPersistentSnapshotDeletionPolicy : TestSnapshotDeletionPolicy
{
[SetUp]
public override void SetUp()
{
base.SetUp();
}
[TearDown]
public override void TearDown()
{
base.TearDown();
}
private SnapshotDeletionPolicy GetDeletionPolicy(Directory dir)
{
return new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.CREATE);
}
[Test]
public virtual void TestExistingSnapshots()
{
int numSnapshots = 3;
MockDirectoryWrapper dir = NewMockDirectory();
IndexWriter writer = new IndexWriter(dir, GetConfig(Random, GetDeletionPolicy(dir)));
PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy)writer.Config.IndexDeletionPolicy;
Assert.IsNull(psdp.LastSaveFile);
PrepareIndexAndSnapshots(psdp, writer, numSnapshots);
Assert.IsNotNull(psdp.LastSaveFile);
writer.Dispose();
// Make sure only 1 save file exists:
int count = 0;
foreach (string file in dir.ListAll())
{
if (file.StartsWith(PersistentSnapshotDeletionPolicy.SNAPSHOTS_PREFIX, StringComparison.Ordinal))
{
count++;
}
}
Assert.AreEqual(1, count);
// Make sure we fsync:
dir.Crash();
dir.ClearCrash();
// Re-initialize and verify snapshots were persisted
psdp = new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.APPEND);
writer = new IndexWriter(dir, GetConfig(Random, psdp));
psdp = (PersistentSnapshotDeletionPolicy)writer.Config.IndexDeletionPolicy;
Assert.AreEqual(numSnapshots, psdp.GetSnapshots().Count);
Assert.AreEqual(numSnapshots, psdp.SnapshotCount);
AssertSnapshotExists(dir, psdp, numSnapshots, false);
writer.AddDocument(new Document());
writer.Commit();
snapshots.Add(psdp.Snapshot());
Assert.AreEqual(numSnapshots + 1, psdp.GetSnapshots().Count);
Assert.AreEqual(numSnapshots + 1, psdp.SnapshotCount);
AssertSnapshotExists(dir, psdp, numSnapshots + 1, false);
writer.Dispose();
dir.Dispose();
}
[Test]
public virtual void TestNoSnapshotInfos()
{
Directory dir = NewDirectory();
new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.CREATE);
dir.Dispose();
}
[Test]
public virtual void TestMissingSnapshots()
{
Directory dir = NewDirectory();
try
{
new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.APPEND);
Assert.Fail("did not hit expected exception");
}
#pragma warning disable 168
catch (InvalidOperationException ise)
#pragma warning restore 168
{
// expected
}
dir.Dispose();
}
[Test]
public virtual void TestExceptionDuringSave()
{
MockDirectoryWrapper dir = NewMockDirectory();
dir.FailOn(new FailureAnonymousClass(this, dir));
IndexWriter writer = new IndexWriter(dir, GetConfig(Random, new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.CREATE_OR_APPEND)));
writer.AddDocument(new Document());
writer.Commit();
PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy)writer.Config.IndexDeletionPolicy;
try
{
psdp.Snapshot();
}
catch (IOException ioe)
{
if (ioe.Message.Equals("now fail on purpose", StringComparison.Ordinal))
{
// ok
}
else
{
throw; // LUCENENET: CA2200: Rethrow to preserve stack details
}
}
Assert.AreEqual(0, psdp.SnapshotCount);
writer.Dispose();
Assert.AreEqual(1, DirectoryReader.ListCommits(dir).Count);
dir.Dispose();
}
private class FailureAnonymousClass : Failure
{
private readonly TestPersistentSnapshotDeletionPolicy outerInstance;
private MockDirectoryWrapper dir;
public FailureAnonymousClass(TestPersistentSnapshotDeletionPolicy outerInstance, MockDirectoryWrapper dir)
{
this.outerInstance = outerInstance;
this.dir = dir;
}
public override void Eval(MockDirectoryWrapper dir)
{
// LUCENENET specific: for these to work in release mode, we have added [MethodImpl(MethodImplOptions.NoInlining)]
// to each possible target of the StackTraceHelper. If these change, so must the attribute on the target methods.
if (StackTraceHelper.DoesStackTraceContainMethod(typeof(PersistentSnapshotDeletionPolicy).Name, "Persist"))
{
throw new IOException("now fail on purpose");
}
}
}
[Test]
public virtual void TestSnapshotRelease()
{
Directory dir = NewDirectory();
IndexWriter writer = new IndexWriter(dir, GetConfig(Random, GetDeletionPolicy(dir)));
PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy)writer.Config.IndexDeletionPolicy;
PrepareIndexAndSnapshots(psdp, writer, 1);
writer.Dispose();
psdp.Release(snapshots[0]);
psdp = new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.APPEND);
Assert.AreEqual(0, psdp.SnapshotCount, "Should have no snapshots !");
dir.Dispose();
}
[Test]
public virtual void TestSnapshotReleaseByGeneration()
{
Directory dir = NewDirectory();
IndexWriter writer = new IndexWriter(dir, GetConfig(Random, GetDeletionPolicy(dir)));
PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy)writer.Config.IndexDeletionPolicy;
PrepareIndexAndSnapshots(psdp, writer, 1);
writer.Dispose();
psdp.Release(snapshots[0].Generation);
psdp = new PersistentSnapshotDeletionPolicy(new KeepOnlyLastCommitDeletionPolicy(), dir, OpenMode.APPEND);
Assert.AreEqual(0, psdp.SnapshotCount, "Should have no snapshots !");
dir.Dispose();
}
#region TestSnapshotDeletionPolicy
// LUCENENET NOTE: Tests in a base class are not pulled into the correct
// context in Visual Studio. This fixes that with the minimum amount of code necessary
// to run them in the correct context without duplicating all of the tests.
[Test]
public override void TestSnapshotDeletionPolicy_Mem()
{
base.TestSnapshotDeletionPolicy_Mem();
}
[Test]
public override void TestBasicSnapshots()
{
base.TestBasicSnapshots();
}
[Test]
public override void TestMultiThreadedSnapshotting()
{
base.TestMultiThreadedSnapshotting();
}
[Test]
public override void TestRollbackToOldSnapshot()
{
base.TestRollbackToOldSnapshot();
}
[Test]
public override void TestReleaseSnapshot()
{
base.TestReleaseSnapshot();
}
[Test]
public override void TestSnapshotLastCommitTwice()
{
base.TestSnapshotLastCommitTwice();
}
[Test]
public override void TestMissingCommits()
{
base.TestMissingCommits();
}
#endregion
}
}