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);