You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2010/11/29 23:22:57 UTC

svn commit: r1040320 - /lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java

Author: uschindler
Date: Mon Nov 29 22:22:57 2010
New Revision: 1040320

URL: http://svn.apache.org/viewvc?rev=1040320&view=rev
Log:
Revert: LUCENE-2779: Use ConcurrentHashMap in RAMDirectory (3x)

Modified:
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java?rev=1040320&r1=1040319&r2=1040320&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/store/RAMDirectory.java Mon Nov 29 22:22:57 2010
@@ -20,8 +20,8 @@ package org.apache.lucene.store;
 import java.io.IOException;
 import java.io.FileNotFoundException;
 import java.io.Serializable;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.HashMap;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.lucene.index.IndexFileNameFilter;
@@ -36,7 +36,7 @@ public class RAMDirectory extends Direct
 
   private static final long serialVersionUID = 1l;
 
-  protected Map<String,RAMFile> fileMap = new ConcurrentHashMap<String,RAMFile>();
+  protected HashMap<String,RAMFile> fileMap = new HashMap<String,RAMFile>();
   protected final AtomicLong sizeInBytes = new AtomicLong();
   
   // *****
@@ -83,16 +83,25 @@ public class RAMDirectory extends Direct
   }
 
   @Override
-  public final String[] listAll() {
+  public synchronized final String[] listAll() {
     ensureOpen();
-    return fileMap.keySet().toArray(new String[0]);
+    Set<String> fileNames = fileMap.keySet();
+    String[] result = new String[fileNames.size()];
+    int i = 0;
+    for(final String fileName: fileNames) 
+      result[i++] = fileName;
+    return result;
   }
 
   /** Returns true iff the named file exists in this directory. */
   @Override
   public final boolean fileExists(String name) {
     ensureOpen();
-    return fileMap.containsKey(name);
+    RAMFile file;
+    synchronized (this) {
+      file = fileMap.get(name);
+    }
+    return file != null;
   }
 
   /** Returns the time the named file was last modified.
@@ -101,10 +110,12 @@ public class RAMDirectory extends Direct
   @Override
   public final long fileModified(String name) throws IOException {
     ensureOpen();
-    RAMFile file = fileMap.get(name);
-    if (file == null) {
-      throw new FileNotFoundException(name);
+    RAMFile file;
+    synchronized (this) {
+      file = fileMap.get(name);
     }
+    if (file==null)
+      throw new FileNotFoundException(name);
     return file.getLastModified();
   }
 
@@ -114,10 +125,12 @@ public class RAMDirectory extends Direct
   @Override
   public void touchFile(String name) throws IOException {
     ensureOpen();
-    RAMFile file = fileMap.get(name);
-    if (file == null) {
-      throw new FileNotFoundException(name);
+    RAMFile file;
+    synchronized (this) {
+      file = fileMap.get(name);
     }
+    if (file==null)
+      throw new FileNotFoundException(name);
     
     long ts2, ts1 = System.currentTimeMillis();
     do {
@@ -138,18 +151,19 @@ public class RAMDirectory extends Direct
   @Override
   public final long fileLength(String name) throws IOException {
     ensureOpen();
-    RAMFile file = fileMap.get(name);
-    if (file == null) {
-      throw new FileNotFoundException(name);
+    RAMFile file;
+    synchronized (this) {
+      file = fileMap.get(name);
     }
+    if (file==null)
+      throw new FileNotFoundException(name);
     return file.getLength();
   }
   
-  /**
-   * Return total size in bytes of all files in this directory. This is
-   * currently quantized to RAMOutputStream.BUFFER_SIZE.
-   */
-  public final long sizeInBytes() {
+  /** Return total size in bytes of all files in this
+   * directory.  This is currently quantized to
+   * RAMOutputStream.BUFFER_SIZE. */
+  public synchronized final long sizeInBytes() {
     ensureOpen();
     return sizeInBytes.get();
   }
@@ -158,15 +172,14 @@ public class RAMDirectory extends Direct
    * @throws IOException if the file does not exist
    */
   @Override
-  public void deleteFile(String name) throws IOException {
+  public synchronized void deleteFile(String name) throws IOException {
     ensureOpen();
     RAMFile file = fileMap.remove(name);
-    if (file != null) {
-      file.directory = null;
-      sizeInBytes.addAndGet(-file.sizeInBytes);
-    } else {
+    if (file!=null) {
+        file.directory = null;
+        sizeInBytes.addAndGet(-file.sizeInBytes);
+    } else
       throw new FileNotFoundException(name);
-    }
   }
 
   /** Creates a new, empty file in the directory with the given name. Returns a stream writing this file. */
@@ -174,12 +187,14 @@ public class RAMDirectory extends Direct
   public IndexOutput createOutput(String name) throws IOException {
     ensureOpen();
     RAMFile file = newRAMFile();
-    RAMFile existing = fileMap.remove(name);
-    if (existing != null) {
-      sizeInBytes.addAndGet(-existing.sizeInBytes);
-      existing.directory = null;
+    synchronized (this) {
+      RAMFile existing = fileMap.get(name);
+      if (existing!=null) {
+        sizeInBytes.addAndGet(-existing.sizeInBytes);
+        existing.directory = null;
+      }
+      fileMap.put(name, file);
     }
-    fileMap.put(name, file);
     return new RAMOutputStream(file);
   }
 
@@ -196,10 +211,12 @@ public class RAMDirectory extends Direct
   @Override
   public IndexInput openInput(String name) throws IOException {
     ensureOpen();
-    RAMFile file = fileMap.get(name);
-    if (file == null) {
-      throw new FileNotFoundException(name);
+    RAMFile file;
+    synchronized (this) {
+      file = fileMap.get(name);
     }
+    if (file == null)
+      throw new FileNotFoundException(name);
     return new RAMInputStream(file);
   }