You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/01/25 17:44:45 UTC
svn commit: r902868 -
/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java
Author: jbellis
Date: Mon Jan 25 16:44:45 2010
New Revision: 902868
URL: http://svn.apache.org/viewvc?rev=902868&view=rev
Log:
fix potential race in Table.open. patch by jbellis; reviewed by Jeff Hodges for CASSANDRA-734
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java
Modified: incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java?rev=902868&r1=902867&r2=902868&view=diff
==============================================================================
--- incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java (original)
+++ incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/db/Table.java Mon Jan 25 16:44:45 2010
@@ -33,6 +33,7 @@
import java.net.InetAddress;
import org.apache.cassandra.utils.*;
import org.apache.cassandra.db.filter.*;
+import org.cliffc.high_scale_lib.NonBlockingHashMap;
import org.apache.log4j.Logger;
@@ -163,9 +164,8 @@
}
}
- /* Used to lock the factory for creation of Table instance */
- private static final Lock createLock_ = new ReentrantLock();
- private static final Map<String, Table> instances_ = new HashMap<String, Table>();
+ /** Table objects, one per keyspace. only one instance should ever exist for any given keyspace. */
+ private static final Map<String, Table> instances_ = new NonBlockingHashMap<String, Table>();
/* Table name. */
private final String table_;
/* Handle to the Table Metadata */
@@ -178,26 +178,19 @@
public static Table open(String table) throws IOException
{
Table tableInstance = instances_.get(table);
- /*
- * Read the config and figure the column families for this table.
- * Set the isConfigured flag so that we do not read config all the
- * time.
- */
if (tableInstance == null)
{
- Table.createLock_.lock();
- try
+ // instantiate the Table. we could use putIfAbsent but it's important to making sure it is only done once
+ // per keyspace, so we synchronize and re-check before doing it.
+ synchronized (Table.class)
{
+ tableInstance = instances_.get(table);
if (tableInstance == null)
{
tableInstance = new Table(table);
instances_.put(table, tableInstance);
}
}
- finally
- {
- createLock_.unlock();
- }
}
return tableInstance;
}