Author: jbellis
Date: Thu Oct 27 16:44:50 2011
New Revision: 1189863

URL: http://svn.apache.org/viewvc?rev=1189863&view=rev
Log:
ignore 0.8 hints even if compaction begins before we try to purge them
patch by jbellis; reviewed by brandonwilliams for CASSANDRA-3385

Modified:
    cassandra/branches/cassandra-1.0/CHANGES.txt
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/HintedHandOffManager.java
    
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/SystemTable.java

Modified: cassandra/branches/cassandra-1.0/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/CHANGES.txt?rev=1189863&r1=1189862&r2=1189863&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0/CHANGES.txt (original)
+++ cassandra/branches/cassandra-1.0/CHANGES.txt Thu Oct 27 16:44:50 2011
@@ -28,6 +28,8 @@
  * fix cassandra hanging on jsvc stop (CASSANDRA-3302)
  * Avoid leveled compaction getting blocked on errors (CASSANDRA-3408)
  * Make reloading the compaction strategy safe (CASSANDRA-3409)
+ * ignore 0.8 hints even if compaction begins before we try to purge
+   them (CASSANDRA-3385)
 Merged from 0.8:
  * (CQL) update grammar to require key clause in DELETE statement
    (CASSANDRA-3349)

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/HintedHandOffManager.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/HintedHandOffManager.java?rev=1189863&r1=1189862&r2=1189863&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/HintedHandOffManager.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/HintedHandOffManager.java
 Thu Oct 27 16:44:50 2011
@@ -85,9 +85,13 @@ public class HintedHandOffManager implem
 
     private static final Logger logger_ = 
LoggerFactory.getLogger(HintedHandOffManager.class);
     private static final int PAGE_SIZE = 1024;
-    private static final String SEPARATOR = "-";
     private static final int LARGE_NUMBER = 65536; // 64k nodes ought to be 
enough for anybody.
 
+    // in 0.8, subcolumns were KS-CF bytestrings, and the data was stored in 
the "normal" storage there.
+    // (so replay always consisted of sending an entire row,
+    // no matter how little was part of the mutation that created the hint.)
+    private static final String SEPARATOR_08 = "-";
+
     private final NonBlockingHashSet<InetAddress> queuedDeliveries = new 
NonBlockingHashSet<InetAddress>();
 
     private final ExecutorService executor_ = new 
JMXEnabledThreadPoolExecutor("HintedHandoff", Thread.MIN_PRIORITY);
@@ -139,7 +143,7 @@ public class HintedHandOffManager implem
     {
         RowMutation rm = new RowMutation(Table.SYSTEM_TABLE, tokenBytes);
         rm.delete(new QueryPath(HINTS_CF, hintId), timestamp);
-        rm.apply();
+        rm.applyUnsafe(); // don't bother with commitlog since we're going to 
flush as soon as we're done with delivery
     }
 
     public void deleteHintsForEndpoint(final String ipOrHostname)
@@ -275,9 +279,20 @@ public class HintedHandOffManager implem
             if (pagingFinished(hintColumnFamily, startColumn))
                 break;
 
+            page:
             for (IColumn hint : hintColumnFamily.getSortedColumns())
             {
                 startColumn = hint.name();
+                for (IColumn subColumn : hint.getSubColumns())
+                {
+                    // both 0.8 and 1.0 column names are UTF8 strings, so this 
check is safe
+                    if 
(ByteBufferUtil.string(subColumn.name()).contains(SEPARATOR_08))
+                    {
+                        logger_.debug("0.8-style hint found.  This should have 
been taken care of by purgeIncompatibleHints");
+                        deleteHint(tokenBytes, hint.name(), 
subColumn.timestamp());
+                        continue page;
+                    }
+                }
 
                 IColumn versionColumn = 
hint.getSubColumn(ByteBufferUtil.bytes("version"));
                 IColumn tableColumn = 
hint.getSubColumn(ByteBufferUtil.bytes("table"));

Modified: 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/SystemTable.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/SystemTable.java?rev=1189863&r1=1189862&r2=1189863&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/SystemTable.java
 (original)
+++ 
cassandra/branches/cassandra-1.0/src/java/org/apache/cassandra/db/SystemTable.java
 Thu Oct 27 16:44:50 2011
@@ -118,9 +118,15 @@ public class SystemTable
         ColumnFamilyStore hintsCfs = 
Table.open(Table.SYSTEM_TABLE).getColumnFamilyStore(HintedHandOffManager.HINTS_CF);
         if (hintsCfs.getSSTables().size() > 0)
         {
-            logger.info("Possible old-format hints found. Snapshotting as 
'old-hints' and purging");
-            hintsCfs.snapshot("old-hints");
-            hintsCfs.removeAllSSTables();
+            logger.info("Possible old-format hints found. Truncating");
+            try
+            {
+                hintsCfs.truncate();
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException(e);
+            }
         }
         logger.debug("Marking pre-1.0 hints purged");
         RowMutation rm = new RowMutation(Table.SYSTEM_TABLE, COOKIE_KEY);


Reply via email to