| package org.apache.lucene.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. |
| */ |
| |
| import java.io.IOException; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| |
| import org.apache.lucene.document.Document; |
| import org.apache.lucene.index.IndexWriterConfig.OpenMode; |
| import org.apache.lucene.store.Directory; |
| import org.apache.lucene.store.LockObtainFailedException; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class TestPersistentSnapshotDeletionPolicy extends TestSnapshotDeletionPolicy { |
| |
| // Keep it a class member so that getDeletionPolicy can use it |
| private Directory snapshotDir; |
| |
| // so we can close it if called by SDP tests |
| private PersistentSnapshotDeletionPolicy psdp; |
| |
| @Before |
| @Override |
| public void setUp() throws Exception { |
| super.setUp(); |
| snapshotDir = newDirectory(); |
| } |
| |
| @After |
| @Override |
| public void tearDown() throws Exception { |
| if (psdp != null) psdp.close(); |
| snapshotDir.close(); |
| super.tearDown(); |
| } |
| |
| @Override |
| protected SnapshotDeletionPolicy getDeletionPolicy() throws IOException { |
| if (psdp != null) psdp.close(); |
| snapshotDir.close(); |
| snapshotDir = newDirectory(); |
| return psdp = new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.CREATE, |
| TEST_VERSION_CURRENT); |
| } |
| |
| @Override |
| protected SnapshotDeletionPolicy getDeletionPolicy(Map<String, String> snapshots) throws IOException { |
| SnapshotDeletionPolicy sdp = getDeletionPolicy(); |
| if (snapshots != null) { |
| for (Entry<String, String> e: snapshots.entrySet()) { |
| sdp.registerSnapshotInfo(e.getKey(), e.getValue(), null); |
| } |
| } |
| return sdp; |
| } |
| |
| @Override |
| @Test |
| public void testExistingSnapshots() throws Exception { |
| int numSnapshots = 3; |
| Directory dir = newDirectory(); |
| PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy) getDeletionPolicy(); |
| IndexWriter writer = new IndexWriter(dir, getConfig(random, psdp)); |
| prepareIndexAndSnapshots(psdp, writer, numSnapshots, "snapshot"); |
| writer.close(); |
| psdp.close(); |
| |
| // Re-initialize and verify snapshots were persisted |
| psdp = new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT); |
| new IndexWriter(dir, getConfig(random, psdp)).close(); |
| |
| assertSnapshotExists(dir, psdp, numSnapshots); |
| assertEquals(numSnapshots, psdp.getSnapshots().size()); |
| psdp.close(); |
| dir.close(); |
| } |
| |
| @Test(expected=IllegalArgumentException.class) |
| public void testIllegalSnapshotId() throws Exception { |
| getDeletionPolicy().snapshot("$SNAPSHOTS_DOC$"); |
| } |
| |
| @Test |
| public void testInvalidSnapshotInfos() throws Exception { |
| // Add the correct number of documents (1), but without snapshot information |
| IndexWriter writer = new IndexWriter(snapshotDir, getConfig(random, null)); |
| writer.addDocument(new Document()); |
| writer.close(); |
| try { |
| new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT); |
| fail("should not have succeeded to read from an invalid Directory"); |
| } catch (IllegalStateException e) { |
| } |
| } |
| |
| @Test |
| public void testNoSnapshotInfos() throws Exception { |
| // Initialize an empty index in snapshotDir - PSDP should initialize successfully. |
| new IndexWriter(snapshotDir, getConfig(random, null)).close(); |
| new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT).close(); |
| } |
| |
| @Test(expected=IllegalStateException.class) |
| public void testTooManySnapshotInfos() throws Exception { |
| // Write two documents to the snapshots directory - illegal. |
| IndexWriter writer = new IndexWriter(snapshotDir, getConfig(random, null)); |
| writer.addDocument(new Document()); |
| writer.addDocument(new Document()); |
| writer.close(); |
| |
| new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT).close(); |
| fail("should not have succeeded to open an invalid directory"); |
| } |
| |
| @Test |
| public void testSnapshotRelease() throws Exception { |
| Directory dir = newDirectory(); |
| PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy) getDeletionPolicy(); |
| IndexWriter writer = new IndexWriter(dir, getConfig(random, psdp)); |
| prepareIndexAndSnapshots(psdp, writer, 1, "snapshot"); |
| writer.close(); |
| |
| psdp.release("snapshot0"); |
| psdp.close(); |
| |
| psdp = new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT); |
| assertEquals("Should have no snapshots !", 0, psdp.getSnapshots().size()); |
| psdp.close(); |
| dir.close(); |
| } |
| |
| @Test |
| public void testStaticRead() throws Exception { |
| // While PSDP is open, it keeps a lock on the snapshots directory and thus |
| // prevents reading the snapshots information. This test checks that the |
| // static read method works. |
| int numSnapshots = 1; |
| Directory dir = newDirectory(); |
| PersistentSnapshotDeletionPolicy psdp = (PersistentSnapshotDeletionPolicy) getDeletionPolicy(); |
| IndexWriter writer = new IndexWriter(dir, getConfig(random, psdp)); |
| prepareIndexAndSnapshots(psdp, writer, numSnapshots, "snapshot"); |
| writer.close(); |
| dir.close(); |
| |
| try { |
| // This should fail, since the snapshots directory is locked - we didn't close it ! |
| new PersistentSnapshotDeletionPolicy( |
| new KeepOnlyLastCommitDeletionPolicy(), snapshotDir, OpenMode.APPEND, |
| TEST_VERSION_CURRENT); |
| fail("should not have reached here - the snapshots directory should be locked!"); |
| } catch (LockObtainFailedException e) { |
| // expected |
| } finally { |
| psdp.close(); |
| } |
| |
| // Reading the snapshots info should succeed though |
| Map<String, String> snapshots = PersistentSnapshotDeletionPolicy.readSnapshotsInfo(snapshotDir); |
| assertEquals("expected " + numSnapshots + " snapshots, got " + snapshots.size(), numSnapshots, snapshots.size()); |
| } |
| |
| } |