Multiple values for CurrentLocal Node ID patch by slebresne; reviewed by jbellis for CASSANDRA-4626
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9b08a7f1 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9b08a7f1 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9b08a7f1 Branch: refs/heads/trunk Commit: 9b08a7f187e14e93ed06e7a07b34a0ce64c1aa46 Parents: dcf27a5 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Fri Sep 7 16:14:58 2012 +0200 Committer: Pavel Yaskevich <xe...@apache.org> Committed: Tue Sep 11 00:12:09 2012 +0300 ---------------------------------------------------------------------- CHANGES.txt | 3 + src/java/org/apache/cassandra/db/SystemTable.java | 50 ++++++---------- 2 files changed, 21 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b08a7f1/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 9ae8999..a6141f9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -97,6 +97,9 @@ Merged from 1.0: (CASSANDRA-4494) Merged from 1.0: * (Hadoop) fix setting key length for old-style mapred api (CASSANDRA-4534) + * (Hadoop) fix iterating through a resultset consisting entirely + of tombstoned rows (CASSANDRA-4466) + * Fix multiple values for CurrentLocal NodeID (CASSANDRA-4626) * munmap commitlog segments before rename (CASSANDRA-4337) http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b08a7f1/src/java/org/apache/cassandra/db/SystemTable.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/SystemTable.java b/src/java/org/apache/cassandra/db/SystemTable.java index 1cbab1a..8ff2b8d 100644 --- a/src/java/org/apache/cassandra/db/SystemTable.java +++ b/src/java/org/apache/cassandra/db/SystemTable.java @@ -450,25 +450,19 @@ public class SystemTable { ByteBuffer id = null; Table table = Table.open(Table.SYSTEM_KS); - QueryFilter filter = QueryFilter.getIdentityFilter(decorate(CURRENT_LOCAL_NODE_ID_KEY), - new QueryPath(NODE_ID_CF)); + + // Get the last NodeId (since NodeId are timeuuid is thus ordered from the older to the newer one) + QueryFilter filter = QueryFilter.getSliceFilter(decorate(ALL_LOCAL_NODE_ID_KEY), + new QueryPath(NODE_ID_CF), + ByteBufferUtil.EMPTY_BYTE_BUFFER, + ByteBufferUtil.EMPTY_BYTE_BUFFER, + true, + 1); ColumnFamily cf = table.getColumnFamilyStore(NODE_ID_CF).getColumnFamily(filter); - // Even though gc_grace==0 on System table, we can have a race where we get back tombstones (see CASSANDRA-2824) - cf = ColumnFamilyStore.removeDeleted(cf, 0); - if (cf != null) - { - assert cf.getColumnCount() <= 1; - if (cf.getColumnCount() > 0) - id = cf.iterator().next().name(); - } - if (id != null) - { - return NodeId.wrap(id); - } + if (cf != null && cf.getColumnCount() != 0) + return NodeId.wrap(cf.iterator().next().name()); else - { return null; - } } /** @@ -482,21 +476,14 @@ public class SystemTable */ public static void writeCurrentLocalNodeId(NodeId oldNodeId, NodeId newNodeId, long now) { + ByteBuffer ip = ByteBuffer.wrap(FBUtilities.getBroadcastAddress().getAddress()); + ColumnFamily cf = ColumnFamily.create(Table.SYSTEM_KS, NODE_ID_CF); - cf.addColumn(new Column(newNodeId.bytes(), ByteBufferUtil.EMPTY_BYTE_BUFFER, now)); - ColumnFamily cf2 = cf.cloneMe(); - if (oldNodeId != null) - { - // previously used (int)(now /1000) for the localDeletionTime - // tests use single digit long values for now, so use actual time. - cf2.addColumn(new DeletedColumn(oldNodeId.bytes(), (int)(System.currentTimeMillis() / 1000), now)); - } - RowMutation rmCurrent = new RowMutation(Table.SYSTEM_KS, CURRENT_LOCAL_NODE_ID_KEY); - RowMutation rmAll = new RowMutation(Table.SYSTEM_KS, ALL_LOCAL_NODE_ID_KEY); - rmCurrent.add(cf2); - rmAll.add(cf); - rmCurrent.apply(); - rmAll.apply(); + cf.addColumn(new Column(newNodeId.bytes(), ip, now)); + RowMutation rm = new RowMutation(Table.SYSTEM_KS, ALL_LOCAL_NODE_ID_KEY); + rm.add(cf); + rm.apply(); + forceBlockingFlush(NODE_ID_CF); } public static List<NodeId.NodeIdRecord> getOldLocalNodeIds() @@ -504,8 +491,7 @@ public class SystemTable List<NodeId.NodeIdRecord> l = new ArrayList<NodeId.NodeIdRecord>(); Table table = Table.open(Table.SYSTEM_KS); - QueryFilter filter = QueryFilter.getIdentityFilter(decorate(ALL_LOCAL_NODE_ID_KEY), - new QueryPath(NODE_ID_CF)); + QueryFilter filter = QueryFilter.getIdentityFilter(decorate(ALL_LOCAL_NODE_ID_KEY), new QueryPath(NODE_ID_CF)); ColumnFamily cf = table.getColumnFamilyStore(NODE_ID_CF).getColumnFamily(filter); NodeId previous = null;