[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