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 2009/08/14 23:00:18 UTC

svn commit: r804372 - in /incubator/cassandra/trunk: src/java/org/apache/cassandra/db/SystemTable.java src/java/org/apache/cassandra/service/StorageService.java test/unit/org/apache/cassandra/db/SystemTableTest.java

Author: jbellis
Date: Fri Aug 14 21:00:18 2009
New Revision: 804372

URL: http://svn.apache.org/viewvc?rev=804372&view=rev
Log:
make StorageTable.StorageMetadata a singleton, so multiple initMetadatas are safe.
patch by Bill de hOra and jbellis; reviewed by Michael Greene for CASSANDRA-358

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SystemTable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SystemTableTest.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SystemTable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SystemTable.java?rev=804372&r1=804371&r2=804372&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SystemTable.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/SystemTable.java Fri Aug 14 21:00:18 2009
@@ -43,6 +43,7 @@
     private static final String LOCATION_KEY = "L"; // only one row in Location CF
     private static final byte[] TOKEN = utf8("Token");
     private static final byte[] GENERATION = utf8("Generation");
+    private static StorageMetadata metadata_;
 
     private static byte[] utf8(String str)
     {
@@ -57,10 +58,11 @@
     }
 
     /*
-     * This method is used to update the SystemTable with the new token.
+     * This method is used to update the SystemTable on disk with the new token.
     */
-    public static void updateToken(Token token) throws IOException
+    public static synchronized void updateToken(Token token) throws IOException
     {
+        assert metadata_ != null;
         IPartitioner p = StorageService.getPartitioner();
         Table table = Table.open(Table.SYSTEM_TABLE);
         /* Retrieve the "LocationInfo" column family */
@@ -76,6 +78,7 @@
         cf.addColumn(tokenColumn);
         rm.add(cf);
         rm.apply();
+        metadata_.setStorageId(token);
     }
 
     /*
@@ -85,8 +88,11 @@
      * columns namely "Token" and "Generation". This is the token that
      * gets gossiped around and the generation info is used for FD.
     */
-    public static StorageMetadata initMetadata() throws IOException
+    public static synchronized StorageMetadata initMetadata() throws IOException
     {
+        if (metadata_ != null)  // guard to protect against being called twice
+            return metadata_;
+
         /* Read the system table to retrieve the storage ID and the generation */
         Table table = Table.open(Table.SYSTEM_TABLE);
         QueryFilter filter = new IdentityQueryFilter(LOCATION_KEY, new QueryPath(LOCATION_CF));
@@ -104,7 +110,8 @@
             cf.addColumn(new Column(GENERATION, BasicUtilities.intToByteArray(generation)) );
             rm.add(cf);
             rm.apply();
-            return new StorageMetadata(token, generation);
+            metadata_ = new StorageMetadata(token, generation);
+            return metadata_;
         }
 
         /* we crashed and came back up need to bump generation # */
@@ -120,7 +127,8 @@
         cf.addColumn(generation2);
         rm.add(cf);
         rm.apply();
-        return new StorageMetadata(token, gen);
+        metadata_ = new StorageMetadata(token, gen);
+        return metadata_;
     }
 
     public static class StorageMetadata

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=804372&r1=804371&r2=804372&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Fri Aug 14 21:00:18 2009
@@ -489,8 +489,6 @@
     {
         /* update the token on disk */
         SystemTable.updateToken(token);
-        /* Update the storageMetadata cache */
-        storageMetadata_.setStorageId(token);
         /* Update the token maps */
         /* Get the old token. This needs to be removed. */
         tokenMetadata_.update(token, StorageService.tcpAddr_);

Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SystemTableTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SystemTableTest.java?rev=804372&r1=804371&r2=804372&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SystemTableTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/SystemTableTest.java Fri Aug 14 21:00:18 2009
@@ -21,16 +21,28 @@
 import java.io.IOException;
 
 import org.junit.Test;
+import org.junit.Assert;
 
 import org.apache.cassandra.CleanupHelper;
 import org.apache.cassandra.service.StorageService;
 
 public class SystemTableTest extends CleanupHelper
 {
+
+    @Test
+    public void testOnlyOnceCreationOfStorageMetadata() throws IOException
+    {
+        SystemTable.StorageMetadata storageMetadata1 = SystemTable.initMetadata();
+        SystemTable.StorageMetadata storageMetadata2 = SystemTable.initMetadata();
+        Assert.assertTrue("smd should not change after calling initMetadata twice", storageMetadata1 == storageMetadata2);
+    }
+
     @Test
-    public void testMain() throws IOException
+    public void testTokenGetsUpdated() throws IOException
     {
-        SystemTable.initMetadata();
+        SystemTable.StorageMetadata storageMetadata1 = SystemTable.initMetadata();
         SystemTable.updateToken(StorageService.getPartitioner().getInitialToken("503545744:0"));
+        SystemTable.StorageMetadata storageMetadata2 = SystemTable.initMetadata();
+        Assert.assertTrue("smd should still be a singleton after updateToken", storageMetadata1 == storageMetadata2);
     }
 }