/* * 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. */ package org.apache.nifi.provenance.index.lucene; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.apache.nifi.provenance.RepositoryConfiguration; import org.junit.Test; public class TestIndexDirectoryManager { @Test public void testGetDirectoriesIncludesMatchingTimestampPlusOne() { final List<IndexLocation> locations = new ArrayList<>(); locations.add(createLocation(999L)); locations.add(createLocation(1002L)); locations.add(createLocation(1005L)); final List<File> directories = IndexDirectoryManager.getDirectories(1000L, 1001L, locations); assertEquals(2, directories.size()); assertTrue(directories.contains(new File("index-999"))); assertTrue(directories.contains(new File("index-1002"))); } @Test public void testGetDirectoriesOnlyObtainsDirectoriesForDesiredPartition() { final RepositoryConfiguration config = createConfig(2); final File storageDir1 = config.getStorageDirectories().get("1"); final File storageDir2 = config.getStorageDirectories().get("2"); final File index1 = new File(storageDir1, "index-1"); final File index2 = new File(storageDir1, "index-2"); final File index3 = new File(storageDir2, "index-3"); final File index4 = new File(storageDir2, "index-4"); final File[] allIndices = new File[] {index1, index2, index3, index4}; for (final File file : allIndices) { assertTrue(file.mkdirs() || file.exists()); } try { final IndexDirectoryManager mgr = new IndexDirectoryManager(config); mgr.initialize(); final List<File> indexes1 = mgr.getDirectories(0L, Long.MAX_VALUE, "1"); final List<File> indexes2 = mgr.getDirectories(0L, Long.MAX_VALUE, "2"); assertEquals(2, indexes1.size()); assertTrue(indexes1.contains(index1)); assertTrue(indexes1.contains(index2)); assertEquals(2, indexes2.size()); assertTrue(indexes2.contains(index3)); assertTrue(indexes2.contains(index4)); } finally { for (final File file : allIndices) { file.delete(); } } } @Test public void testActiveIndexNotLostWhenSizeExceeded() throws IOException, InterruptedException { final RepositoryConfiguration config = createConfig(2); config.setDesiredIndexSize(4096 * 128); final File storageDir1 = config.getStorageDirectories().get("1"); final File storageDir2 = config.getStorageDirectories().get("2"); final File index1 = new File(storageDir1, "index-1"); final File index2 = new File(storageDir1, "index-2"); final File index3 = new File(storageDir2, "index-3"); final File index4 = new File(storageDir2, "index-4"); final File[] allIndices = new File[] {index1, index2, index3, index4}; for (final File file : allIndices) { assertTrue(file.mkdirs() || file.exists()); } try { final IndexDirectoryManager mgr = new IndexDirectoryManager(config); mgr.initialize(); File indexDir = mgr.getWritableIndexingDirectory(System.currentTimeMillis(), "1"); final File newFile = new File(indexDir, "1.bin"); try (final OutputStream fos = new FileOutputStream(newFile)) { final byte[] data = new byte[4096]; for (int i = 0; i < 1024; i++) { fos.write(data); } } try { final File newDir = mgr.getWritableIndexingDirectory(System.currentTimeMillis(), "1"); assertEquals(indexDir, newDir); } finally { newFile.delete(); } } finally { for (final File file : allIndices) { file.delete(); } } } private IndexLocation createLocation(final long timestamp) { return createLocation(timestamp, "1"); } private IndexLocation createLocation(final long timestamp, final String partitionName) { return new IndexLocation(new File("index-" + timestamp), timestamp, partitionName); } private RepositoryConfiguration createConfig(final int partitions) { final RepositoryConfiguration repoConfig = new RepositoryConfiguration(); for (int i = 1; i <= partitions; i++) { repoConfig.addStorageDirectory(String.valueOf(i), new File("target/storage/testIndexDirectoryManager/" + UUID.randomUUID() + "/" + i)); } return repoConfig; } }