[infinispan-commits] Infinispan SVN: r2233 - in branches/4.1.x/lucene-directory/src: main/java/org/infinispan/lucene/readlocks and 2 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Mon Aug 16 14:11:24 EDT 2010
Author: sannegrinovero
Date: 2010-08-16 14:11:22 -0400 (Mon, 16 Aug 2010)
New Revision: 2233
Added:
branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/DynamicBufferSizeTest.java
Modified:
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/FileMetadata.java
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanDirectory.java
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexInput.java
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexOutput.java
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLocker.java
branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLocker.java
branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLockerTest.java
branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLockerTest.java
Log:
[ISPN-602] (need to store the chunk size of Lucene segments in the metadata) - branch 4.1
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/FileMetadata.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/FileMetadata.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/FileMetadata.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -34,10 +34,11 @@
public final class FileMetadata implements Serializable {
/** The serialVersionUID */
- private static final long serialVersionUID = -2605615719808221213L;
+ private static final long serialVersionUID = -7150923427362644166L;
private long lastModified;
private long size = 0;
+ private int bufferSize;
public FileMetadata() {
touch();
@@ -63,6 +64,23 @@
this.size = size;
}
+ public void setBufferSize(int bufferSize) {
+ this.bufferSize = bufferSize;
+ }
+
+ public int getBufferSize() {
+ return bufferSize;
+ }
+
+ public int getNumberOfChunks() {
+ if (size % bufferSize == 0) {
+ return (int) size / bufferSize;
+ }
+ else {
+ return (int) (size / bufferSize) + 1;
+ }
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -72,7 +90,7 @@
return false;
}
FileMetadata metadata = (FileMetadata) o;
- return lastModified == metadata.lastModified && size == metadata.size;
+ return lastModified == metadata.lastModified && size == metadata.size && bufferSize == metadata.bufferSize;
}
@Override
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanDirectory.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanDirectory.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanDirectory.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -96,14 +96,10 @@
private final SegmentReadLocker readLocks;
public InfinispanDirectory(Cache cache, String indexName, LockFactory lf, int chunkSize, SegmentReadLocker readLocker) {
- if (cache == null)
- throw new IllegalArgumentException("Cache must not be null");
- if (indexName == null)
- throw new IllegalArgumentException("index name must not be null");
- if (lf == null)
- throw new IllegalArgumentException("LockFactory must not be null");
- if (readLocker == null)
- throw new IllegalArgumentException("SegmentReadLocker must not be null");
+ checkNotNull(cache, "cache");
+ checkNotNull(indexName, "indexName");
+ checkNotNull(lf, "LockFactory");
+ checkNotNull(readLocker, "SegmentReadLocker");
if (chunkSize <= 0)
throw new IllegalArgumentException("chunkSize must be a positive integer");
this.cache = cache.getAdvancedCache();
@@ -116,7 +112,7 @@
public InfinispanDirectory(Cache cache, String indexName, LockFactory lf, int chunkSize) {
this(cache, indexName, lf, chunkSize,
- new DistributedSegmentReadLocker(cache, indexName, chunkSize));
+ new DistributedSegmentReadLocker(cache, indexName));
}
public InfinispanDirectory(Cache cache, String indexName, int chunkSize, SegmentReadLocker readLocker) {
@@ -251,7 +247,7 @@
if (fileMetadata == null) {
throw new FileNotFoundException("Error loading medatada for index file: " + fileKey);
}
- else if (fileMetadata.getSize() <= chunkSize) {
+ else if (fileMetadata.getSize() <= fileMetadata.getBufferSize()) {
//files smaller than chunkSize don't need a readLock
return new SingleChunkIndexInput(cache, fileKey, fileMetadata);
}
@@ -261,7 +257,7 @@
// safest reaction is to tell this file doesn't exist anymore.
throw new FileNotFoundException("Error loading medatada for index file: " + fileKey);
}
- return new InfinispanIndexInput(cache, fileKey, chunkSize, fileMetadata, readLocks);
+ return new InfinispanIndexInput(cache, fileKey, fileMetadata, readLocks);
}
}
@@ -293,7 +289,14 @@
}
private static LockFactory makeDefaultLockFactory(Cache cache, String indexName) {
+ checkNotNull(cache, "cache");
+ checkNotNull(indexName, "indexName");
return new BaseLockFactory(cache, indexName);
}
+ private static void checkNotNull(Object v, String objectname) {
+ if (v == null)
+ throw new IllegalArgumentException(objectname + " must not be null");
+ }
+
}
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexInput.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexInput.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexInput.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -45,12 +45,12 @@
private static final Log log = LogFactory.getLog(InfinispanIndexInput.class);
private final AdvancedCache cache;
- private final FileMetadata file;
private final FileCacheKey fileKey;
private final int chunkSize;
private final SegmentReadLocker readLocks;
private final boolean trace;
private final String filename;
+ private final long fileLength;
private int currentBufferSize;
private byte[] buffer;
@@ -59,11 +59,11 @@
private boolean isClone;
- public InfinispanIndexInput(AdvancedCache cache, FileCacheKey fileKey, int chunkSize, FileMetadata fileMetadata, SegmentReadLocker readLocks) throws FileNotFoundException {
+ public InfinispanIndexInput(AdvancedCache cache, FileCacheKey fileKey, FileMetadata fileMetadata, SegmentReadLocker readLocks) throws FileNotFoundException {
this.cache = cache;
this.fileKey = fileKey;
- this.chunkSize = chunkSize;
- this.file = fileMetadata;
+ this.chunkSize = fileMetadata.getBufferSize();
+ this.fileLength = fileMetadata.getSize();
this.readLocks = readLocks;
this.filename = fileKey.getFileName();
trace = log.isTraceEnabled();
@@ -157,7 +157,7 @@
@Override
public long length() {
- return file.getSize();
+ return this.fileLength;
}
@Override
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexOutput.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexOutput.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/InfinispanIndexOutput.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -44,7 +44,6 @@
private static final Log log = LogFactory.getLog(InfinispanIndexOutput.class);
private final int bufferSize;
-
private final AdvancedCache cache;
private final FileMetadata file;
private final FileCacheKey fileKey;
@@ -66,6 +65,7 @@
this.fileOps = fileList;
this.buffer = new byte[this.bufferSize];
this.file = new FileMetadata();
+ this.file.setBufferSize(bufferSize);
trace = log.isTraceEnabled();
if (trace) {
log.trace("Opened new IndexOutput for file:{0} in index: {1}", fileKey.getFileName(), fileKey.getIndexName());
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLocker.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLocker.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLocker.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -47,16 +47,12 @@
private final AdvancedCache cache;
private final String indexName;
- private final int chunkSize;
- public DistributedSegmentReadLocker(Cache cache, String indexName, int chunkSize) {
+ public DistributedSegmentReadLocker(Cache cache, String indexName) {
if (cache == null)
throw new IllegalArgumentException("Cache must not be null");
if (indexName == null)
throw new IllegalArgumentException("index name must not be null");
- if (chunkSize <= 0)
- throw new IllegalArgumentException("chunkSize must be a non-null positive integer");
- this.chunkSize = chunkSize;
this.indexName = indexName;
this.cache = cache.getAdvancedCache();
}
@@ -93,7 +89,7 @@
}
}
if (newValue == 0) {
- realFileDelete(readLockKey, cache, chunkSize);
+ realFileDelete(readLockKey, cache);
}
}
@@ -157,14 +153,13 @@
* @param readLockKey the key representing the values to be deleted
* @param cache the cache containing the elements to be deleted
*/
- static void realFileDelete(FileReadLockKey readLockKey, AdvancedCache cache, int chunkSize) {
+ static void realFileDelete(FileReadLockKey readLockKey, AdvancedCache cache) {
final String indexName = readLockKey.getIndexName();
final String filename = readLockKey.getFileName();
FileCacheKey key = new FileCacheKey(indexName, filename);
boolean batch = cache.startBatch();
FileMetadata file = (FileMetadata) cache.withFlags(Flag.SKIP_LOCKING).remove(key);
- int numChunks = (int) (file.getSize() / chunkSize);
- for (int i = 0; i <= numChunks; i++) {
+ for (int i = 0; i < file.getNumberOfChunks(); i++) {
ChunkCacheKey chunkKey = new ChunkCacheKey(indexName, filename, i);
cache.withFlags(Flag.SKIP_REMOTE_LOOKUP).removeAsync(chunkKey);
}
Modified: branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLocker.java
===================================================================
--- branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLocker.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/main/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLocker.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -41,15 +41,19 @@
private final DistributedSegmentReadLocker delegate;
/**
- * Create a new ReadLockContainer.
+ * Create a new LocalLockMergingSegmentReadLocker for specified cache and index name.
*
* @param cache
* @param indexName
*/
- public LocalLockMergingSegmentReadLocker(Cache cache, String indexName, int chunkSize) {
- this.delegate = new DistributedSegmentReadLocker(cache, indexName, chunkSize);
+ public LocalLockMergingSegmentReadLocker(Cache cache, String indexName) {
+ this.delegate = new DistributedSegmentReadLocker(cache, indexName);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public boolean aquireReadLock(String name) {
LocalReadLock localReadLock = getLocalLockByName(name);
boolean aquired = localReadLock.aquire();
@@ -73,6 +77,10 @@
return localReadLock;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void deleteOrReleaseReadLock(String name) {
getLocalLockByName(name).release();
}
Added: branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/DynamicBufferSizeTest.java
===================================================================
--- branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/DynamicBufferSizeTest.java (rev 0)
+++ branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/DynamicBufferSizeTest.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.infinispan.lucene;
+
+import static org.infinispan.lucene.CacheTestSupport.assertTextIsFoundInIds;
+import static org.infinispan.lucene.CacheTestSupport.writeTextToIndex;
+
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+import org.apache.lucene.store.Directory;
+import org.infinispan.config.Configuration;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.test.SingleCacheManagerTest;
+import org.infinispan.test.fwk.TestCacheManagerFactory;
+import org.testng.annotations.Test;
+
+/**
+ * The chunk size might be changed after a segment has been created.
+ * This test verifies an existing index is still readable.
+ *
+ * @author Sanne Grinovero
+ * @since 4.1
+ */
+ at Test(groups = "functional", testName = "lucene.DynamicBufferSizeTest")
+public class DynamicBufferSizeTest extends SingleCacheManagerTest {
+
+ @Override
+ protected EmbeddedCacheManager createCacheManager() throws Exception {
+ Configuration configuration = new Configuration();
+ configuration.setCacheMode(Configuration.CacheMode.LOCAL);
+ configuration.setInvocationBatchingEnabled(true);
+ return TestCacheManagerFactory.createCacheManager(configuration);
+ }
+
+ @Test
+ public void roundingTest() {
+ FileMetadata m = new FileMetadata();
+ m.setBufferSize(10);
+ m.setSize(10);
+ Assert.assertEquals(1, m.getNumberOfChunks());
+ m.setSize(11);
+ Assert.assertEquals(2, m.getNumberOfChunks());
+ m.setBufferSize(11);
+ Assert.assertEquals(1, m.getNumberOfChunks());
+ m.setSize(22);
+ Assert.assertEquals(2, m.getNumberOfChunks());
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void testReadingFromDifferentlySizedBuffers() throws IOException {
+ cache = cacheManager.getCache();
+ Directory dirA = new InfinispanDirectory(cache, "indexName", 7);
+ writeTextToIndex(dirA, 0, "hi from node A");
+ Directory dirB = new InfinispanDirectory(cache, "indexName", 8);
+ assertTextIsFoundInIds(dirB, "hi", 0);
+ writeTextToIndex(dirB, 1, "index B is sharing the same index but using a differently sized chunk size");
+ assertTextIsFoundInIds(dirA, "size", 1);
+ }
+
+}
Modified: branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLockerTest.java
===================================================================
--- branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLockerTest.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/DistributedSegmentReadLockerTest.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -112,7 +112,7 @@
Directory createDirectory(Cache cache) {
return new InfinispanDirectory(cache, INDEX_NAME, CHUNK_SIZE,
- new DistributedSegmentReadLocker(cache, INDEX_NAME, CHUNK_SIZE));
+ new DistributedSegmentReadLocker(cache, INDEX_NAME));
}
void verifyBoth(Cache cache0, Cache cache1) {
Modified: branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLockerTest.java
===================================================================
--- branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLockerTest.java 2010-08-16 16:01:54 UTC (rev 2232)
+++ branches/4.1.x/lucene-directory/src/test/java/org/infinispan/lucene/readlocks/LocalLockMergingSegmentReadLockerTest.java 2010-08-16 18:11:22 UTC (rev 2233)
@@ -76,7 +76,7 @@
@Override
Directory createDirectory(Cache cache) {
return new InfinispanDirectory(cache, INDEX_NAME, CHUNK_SIZE,
- new LocalLockMergingSegmentReadLocker(cache, INDEX_NAME, CHUNK_SIZE));
+ new LocalLockMergingSegmentReadLocker(cache, INDEX_NAME));
}
}
More information about the infinispan-commits
mailing list