http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/thrift/CassandraServer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java index 4399a80..1aadd78 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -108,7 +108,7 @@ public class CassandraServer implements Cassandra.Iface public List<ColumnOrSuperColumn> thriftifyColumns(CFMetaData metadata, Iterator<LegacyLayout.LegacyCell> cells) { - ArrayList<ColumnOrSuperColumn> thriftColumns = new ArrayList<ColumnOrSuperColumn>(); + ArrayList<ColumnOrSuperColumn> thriftColumns = new ArrayList<>(); while (cells.hasNext()) { LegacyLayout.LegacyCell cell = cells.next(); @@ -142,7 +142,7 @@ public class CassandraServer implements Cassandra.Iface private List<Column> thriftifyColumnsAsColumns(CFMetaData metadata, Iterator<LegacyLayout.LegacyCell> cells) { - List<Column> thriftColumns = new ArrayList<Column>(); + List<Column> thriftColumns = new ArrayList<>(); while (cells.hasNext()) thriftColumns.add(thriftifySubColumn(metadata, cells.next())); return thriftColumns; @@ -162,7 +162,7 @@ public class CassandraServer implements Cassandra.Iface { if (subcolumnsOnly) { - ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<ColumnOrSuperColumn>(); + ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<>(); while (cells.hasNext()) { LegacyLayout.LegacyCell cell = cells.next(); @@ -185,7 +185,7 @@ public class CassandraServer implements Cassandra.Iface private List<ColumnOrSuperColumn> thriftifySuperColumns(Iterator<LegacyLayout.LegacyCell> cells, boolean reversed) { - ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<ColumnOrSuperColumn>(); + ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<>(); SuperColumn current = null; while (cells.hasNext()) { @@ -198,7 +198,7 @@ public class CassandraServer implements Cassandra.Iface if (current != null && reversed) Collections.reverse(current.columns); - current = new SuperColumn(scName, new ArrayList<Column>()); + current = new SuperColumn(scName, new ArrayList<>()); thriftSuperColumns.add(new ColumnOrSuperColumn().setSuper_column(current)); } current.getColumns().add(thriftifySubColumn(cell, cell.name.superColumnSubName())); @@ -212,7 +212,7 @@ public class CassandraServer implements Cassandra.Iface private List<ColumnOrSuperColumn> thriftifyCounterSuperColumns(CFMetaData metadata, Iterator<LegacyLayout.LegacyCell> cells, boolean reversed) { - ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<ColumnOrSuperColumn>(); + ArrayList<ColumnOrSuperColumn> thriftSuperColumns = new ArrayList<>(); CounterSuperColumn current = null; while (cells.hasNext()) { @@ -225,7 +225,7 @@ public class CassandraServer implements Cassandra.Iface if (current != null && reversed) Collections.reverse(current.columns); - current = new CounterSuperColumn(scName, new ArrayList<CounterColumn>()); + current = new CounterSuperColumn(scName, new ArrayList<>()); thriftSuperColumns.add(new ColumnOrSuperColumn().setCounter_super_column(current)); } current.getColumns().add(thriftifySubCounter(metadata, cell).setName(cell.name.superColumnSubName())); @@ -262,7 +262,7 @@ public class CassandraServer implements Cassandra.Iface { try (PartitionIterator results = read(commands, consistency_level, cState)) { - Map<ByteBuffer, List<ColumnOrSuperColumn>> columnFamiliesMap = new HashMap<ByteBuffer, List<ColumnOrSuperColumn>>(); + Map<ByteBuffer, List<ColumnOrSuperColumn>> columnFamiliesMap = new HashMap<>(); while (results.hasNext()) { try (RowIterator iter = results.next()) @@ -360,7 +360,7 @@ public class CassandraServer implements Cassandra.Iface private ClusteringIndexFilter toInternalFilter(CFMetaData metadata, ColumnParent parent, SliceRange range) { if (metadata.isSuper() && parent.isSetSuper_column()) - return new ClusteringIndexNamesFilter(FBUtilities.<Clustering>singleton(new SimpleClustering(parent.bufferForSuper_column()), metadata.comparator), range.reversed); + return new ClusteringIndexNamesFilter(FBUtilities.singleton(new Clustering(parent.bufferForSuper_column()), metadata.comparator), range.reversed); else return new ClusteringIndexSliceFilter(makeSlices(metadata, range), range.reversed); } @@ -384,13 +384,13 @@ public class CassandraServer implements Cassandra.Iface { if (parent.isSetSuper_column()) { - return new ClusteringIndexNamesFilter(FBUtilities.<Clustering>singleton(new SimpleClustering(parent.bufferForSuper_column()), metadata.comparator), false); + return new ClusteringIndexNamesFilter(FBUtilities.singleton(new Clustering(parent.bufferForSuper_column()), metadata.comparator), false); } else { NavigableSet<Clustering> clusterings = new TreeSet<>(metadata.comparator); for (ByteBuffer bb : predicate.column_names) - clusterings.add(new SimpleClustering(bb)); + clusterings.add(new Clustering(bb)); return new ClusteringIndexNamesFilter(clusterings, false); } } @@ -455,7 +455,7 @@ public class CassandraServer implements Cassandra.Iface // We only want to include the static columns that are selected by the slices for (ColumnDefinition def : columns.statics) { - if (slices.selects(new SimpleClustering(def.name.bytes))) + if (slices.selects(new Clustering(def.name.bytes))) builder.add(def); } columns = builder.build(); @@ -608,21 +608,20 @@ public class CassandraServer implements Cassandra.Iface builder.select(dynamicDef, CellPath.create(column_path.column)); columns = builder.build(); } - filter = new ClusteringIndexNamesFilter(FBUtilities.<Clustering>singleton(new SimpleClustering(column_path.super_column), metadata.comparator), + filter = new ClusteringIndexNamesFilter(FBUtilities.singleton(new Clustering(column_path.super_column), metadata.comparator), false); } else { LegacyLayout.LegacyCellName cellname = LegacyLayout.decodeCellName(metadata, column_path.super_column, column_path.column); columns = ColumnFilter.selection(PartitionColumns.of(cellname.column)); - filter = new ClusteringIndexNamesFilter(FBUtilities.<Clustering>singleton(cellname.clustering, metadata.comparator), false); + filter = new ClusteringIndexNamesFilter(FBUtilities.singleton(cellname.clustering, metadata.comparator), false); } - long now = System.currentTimeMillis(); DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); SinglePartitionReadCommand<?> command = SinglePartitionReadCommand.create(true, metadata, FBUtilities.nowInSeconds(), columns, RowFilter.NONE, DataLimits.NONE, dk, filter); - try (RowIterator result = PartitionIterators.getOnlyElement(read(Arrays.<SinglePartitionReadCommand<?>>asList(command), consistencyLevel, cState), command)) + try (RowIterator result = PartitionIterators.getOnlyElement(read(Arrays.asList(command), consistencyLevel, cState), command)) { if (!result.hasNext()) throw new NotFoundException(); @@ -768,7 +767,7 @@ public class CassandraServer implements Cassandra.Iface String keyspace = cState.getKeyspace(); cState.hasColumnFamilyAccess(keyspace, column_parent.column_family, Permission.SELECT); - Map<ByteBuffer, Integer> counts = new HashMap<ByteBuffer, Integer>(); + Map<ByteBuffer, Integer> counts = new HashMap<>(); Map<ByteBuffer, List<ColumnOrSuperColumn>> columnFamiliesMap = multigetSliceInternal(keyspace, keys, column_parent, @@ -791,6 +790,14 @@ public class CassandraServer implements Cassandra.Iface } } + private Cell cellFromColumn(CFMetaData metadata, LegacyLayout.LegacyCellName name, Column column) + { + CellPath path = name.collectionElement == null ? null : CellPath.create(name.collectionElement); + return column.ttl == 0 + ? BufferCell.live(metadata, name.column, column.timestamp, column.value, path) + : BufferCell.expiring(name.column, column.timestamp, column.ttl, FBUtilities.nowInSeconds(), column.value, path); + } + private void internal_insert(ByteBuffer key, ColumnParent column_parent, Column column, ConsistencyLevel consistency_level) throws RequestValidationException, UnavailableException, TimedOutException { @@ -806,22 +813,17 @@ public class CassandraServer implements Cassandra.Iface { throw new org.apache.cassandra.exceptions.InvalidRequestException("missing mandatory super column name for super CF " + column_parent.column_family); } - ThriftValidation.validateColumnNames(metadata, column_parent, Arrays.asList(column.name)); + ThriftValidation.validateColumnNames(metadata, column_parent, Collections.singletonList(column.name)); ThriftValidation.validateColumnData(metadata, column_parent.super_column, column); org.apache.cassandra.db.Mutation mutation; try { - LegacyLayout.LegacyCellName name = LegacyLayout.decodeCellName(metadata, column_parent.super_column, column.name); - DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); - PartitionUpdate update = new PartitionUpdate(metadata, dk, PartitionColumns.of(name.column), 1); - Row.Writer writer = name.column.isStatic() ? update.staticWriter() : update.writer(); - name.clustering.writeTo(writer); - CellPath path = name.collectionElement == null ? null : CellPath.create(name.collectionElement); - writer.writeCell(name.column, false, column.value, SimpleLivenessInfo.forUpdate(column.timestamp, column.ttl, FBUtilities.nowInSeconds(), metadata), path); - writer.endOfRow(); + LegacyLayout.LegacyCellName name = LegacyLayout.decodeCellName(metadata, column_parent.super_column, column.name); + Cell cell = cellFromColumn(metadata, name, column); + PartitionUpdate update = PartitionUpdate.singleRowUpdate(metadata, dk, ArrayBackedRow.singleCellRow(name.clustering, cell)); mutation = new org.apache.cassandra.db.Mutation(update); } @@ -829,7 +831,7 @@ public class CassandraServer implements Cassandra.Iface { throw new org.apache.cassandra.exceptions.InvalidRequestException(e.getMessage()); } - doInsert(consistency_level, Arrays.asList(mutation)); + doInsert(consistency_level, Collections.singletonList(mutation)); } public void insert(ByteBuffer key, ColumnParent column_parent, Column column, ConsistencyLevel consistency_level) @@ -896,23 +898,15 @@ public class CassandraServer implements Cassandra.Iface if (metadata.isSuper()) throw new org.apache.cassandra.exceptions.InvalidRequestException("CAS does not support supercolumns"); - Iterable<ByteBuffer> names = Iterables.transform(updates, new Function<Column, ByteBuffer>() - { - public ByteBuffer apply(Column column) - { - return column.name; - } - }); + Iterable<ByteBuffer> names = Iterables.transform(updates, column -> column.name); ThriftValidation.validateColumnNames(metadata, new ColumnParent(column_family), names); for (Column column : updates) ThriftValidation.validateColumnData(metadata, null, column); - CFMetaData cfm = Schema.instance.getCFMetaData(cState.getKeyspace(), column_family); - DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); int nowInSec = FBUtilities.nowInSeconds(); - PartitionUpdate partitionUpdates = RowIterators.toUpdate(LegacyLayout.toRowIterator(metadata, dk, toLegacyCells(metadata, updates, nowInSec).iterator(), nowInSec)); + PartitionUpdate partitionUpdates = PartitionUpdate.fromIterator(LegacyLayout.toRowIterator(metadata, dk, toLegacyCells(metadata, updates, nowInSec).iterator(), nowInSec)); FilteredPartition partitionExpected = null; if (!expected.isEmpty()) @@ -1096,7 +1090,7 @@ public class CassandraServer implements Cassandra.Iface if (metadata.isCounter()) ThriftConversion.fromThrift(consistency_level).validateCounterForWrite(metadata); - DeletionInfo delInfo = DeletionInfo.live(); + MutableDeletionInfo delInfo = MutableDeletionInfo.live(); List<LegacyLayout.LegacyCell> cells = new ArrayList<>(); for (Mutation m : muts) { @@ -1113,7 +1107,7 @@ public class CassandraServer implements Cassandra.Iface } sortAndMerge(metadata, cells, nowInSec); - PartitionUpdate update = UnfilteredRowIterators.toUpdate(LegacyLayout.toUnfilteredRowIterator(metadata, dk, delInfo, cells.iterator())); + PartitionUpdate update = PartitionUpdate.fromIterator(LegacyLayout.toUnfilteredRowIterator(metadata, dk, delInfo, cells.iterator())); org.apache.cassandra.db.Mutation mutation; if (metadata.isCounter()) @@ -1173,12 +1167,12 @@ public class CassandraServer implements Cassandra.Iface } } - private void addRange(CFMetaData cfm, DeletionInfo delInfo, Slice.Bound start, Slice.Bound end, long timestamp, int nowInSec) + private void addRange(CFMetaData cfm, MutableDeletionInfo delInfo, Slice.Bound start, Slice.Bound end, long timestamp, int nowInSec) { - delInfo.add(new RangeTombstone(Slice.make(start, end), new SimpleDeletionTime(timestamp, nowInSec)), cfm.comparator); + delInfo.add(new RangeTombstone(Slice.make(start, end), new DeletionTime(timestamp, nowInSec)), cfm.comparator); } - private void deleteColumnOrSuperColumn(DeletionInfo delInfo, List<LegacyLayout.LegacyCell> cells, CFMetaData cfm, Deletion del, int nowInSec) + private void deleteColumnOrSuperColumn(MutableDeletionInfo delInfo, List<LegacyLayout.LegacyCell> cells, CFMetaData cfm, Deletion del, int nowInSec) throws InvalidRequestException { if (del.predicate != null && del.predicate.column_names != null) @@ -1227,7 +1221,7 @@ public class CassandraServer implements Cassandra.Iface if (del.super_column != null) addRange(cfm, delInfo, Slice.Bound.inclusiveStartOf(del.super_column), Slice.Bound.inclusiveEndOf(del.super_column), del.timestamp, nowInSec); else - delInfo.add(new SimpleDeletionTime(del.timestamp, nowInSec)); + delInfo.add(new DeletionTime(del.timestamp, nowInSec)); } } @@ -1320,23 +1314,17 @@ public class CassandraServer implements Cassandra.Iface } else if (column_path.super_column != null && column_path.column == null) { - update = new PartitionUpdate(metadata, dk, PartitionColumns.NONE, 1); - Row.Writer writer = update.writer(); - writer.writeClusteringValue(column_path.super_column); - writer.writeRowDeletion(new SimpleDeletionTime(timestamp, nowInSec)); - writer.endOfRow(); + Row row = ArrayBackedRow.emptyDeletedRow(new Clustering(column_path.super_column), new DeletionTime(timestamp, nowInSec)); + update = PartitionUpdate.singleRowUpdate(metadata, dk, row); } else { try { LegacyLayout.LegacyCellName name = LegacyLayout.decodeCellName(metadata, column_path.super_column, column_path.column); - update = new PartitionUpdate(metadata, dk, PartitionColumns.of(name.column), 1); - Row.Writer writer = name.column.isStatic() ? update.staticWriter() : update.writer(); - name.clustering.writeTo(writer); CellPath path = name.collectionElement == null ? null : CellPath.create(name.collectionElement); - writer.writeCell(name.column, false, ByteBufferUtil.EMPTY_BYTE_BUFFER, SimpleLivenessInfo.forDeletion(timestamp, nowInSec), path); - writer.endOfRow(); + Cell cell = BufferCell.tombstone(name.column, timestamp, nowInSec, path); + update = PartitionUpdate.singleRowUpdate(metadata, dk, ArrayBackedRow.singleCellRow(name.clustering, cell)); } catch (UnknownColumnException e) { @@ -1347,9 +1335,9 @@ public class CassandraServer implements Cassandra.Iface org.apache.cassandra.db.Mutation mutation = new org.apache.cassandra.db.Mutation(update); if (isCommutativeOp) - doInsert(consistency_level, Arrays.asList(new CounterMutation(mutation, ThriftConversion.fromThrift(consistency_level)))); + doInsert(consistency_level, Collections.singletonList(new CounterMutation(mutation, ThriftConversion.fromThrift(consistency_level)))); else - doInsert(consistency_level, Arrays.asList(mutation)); + doInsert(consistency_level, Collections.singletonList(mutation)); } public void remove(ByteBuffer key, ColumnPath column_path, long timestamp, ConsistencyLevel consistency_level) @@ -1483,7 +1471,7 @@ public class CassandraServer implements Cassandra.Iface PartitionPosition end = range.end_key == null ? p.getTokenFactory().fromString(range.end_token).maxKeyBound() : PartitionPosition.ForKey.get(range.end_key, p); - bounds = new Bounds<PartitionPosition>(PartitionPosition.ForKey.get(range.start_key, p), end); + bounds = new Bounds<>(PartitionPosition.ForKey.get(range.start_key, p), end); } int nowInSec = FBUtilities.nowInSeconds(); schedule(DatabaseDescriptor.getRangeRpcTimeout()); @@ -1569,7 +1557,7 @@ public class CassandraServer implements Cassandra.Iface PartitionPosition end = range.end_key == null ? p.getTokenFactory().fromString(range.end_token).maxKeyBound() : PartitionPosition.ForKey.get(range.end_key, p); - bounds = new Bounds<PartitionPosition>(PartitionPosition.ForKey.get(range.start_key, p), end); + bounds = new Bounds<>(PartitionPosition.ForKey.get(range.start_key, p), end); } if (range.row_filter != null && !range.row_filter.isEmpty()) @@ -1582,7 +1570,7 @@ public class CassandraServer implements Cassandra.Iface ClusteringIndexFilter filter = new ClusteringIndexSliceFilter(Slices.ALL, false); DataLimits limits = getLimits(range.count, true, Integer.MAX_VALUE); Clustering pageFrom = metadata.isSuper() - ? new SimpleClustering(start_column) + ? new Clustering(start_column) : LegacyLayout.decodeCellName(metadata, start_column).clustering; PartitionRangeReadCommand cmd = new PartitionRangeReadCommand(false, true, @@ -1624,7 +1612,7 @@ public class CassandraServer implements Cassandra.Iface { try (PartitionIterator iter = results) { - List<KeySlice> keySlices = new ArrayList<KeySlice>(); + List<KeySlice> keySlices = new ArrayList<>(); while (iter.hasNext()) { try (RowIterator partition = iter.next()) @@ -1667,8 +1655,8 @@ public class CassandraServer implements Cassandra.Iface consistencyLevel.validateForRead(keyspace); IPartitioner p = StorageService.getPartitioner(); - AbstractBounds<PartitionPosition> bounds = new Bounds<PartitionPosition>(PartitionPosition.ForKey.get(index_clause.start_key, p), - p.getMinimumToken().minKeyBound()); + AbstractBounds<PartitionPosition> bounds = new Bounds<>(PartitionPosition.ForKey.get(index_clause.start_key, p), + p.getMinimumToken().minKeyBound()); int nowInSec = FBUtilities.nowInSeconds(); ColumnFilter columns = makeColumnFilter(metadata, column_parent, column_predicate); @@ -1706,7 +1694,7 @@ public class CassandraServer implements Cassandra.Iface validateLogin(); Set<String> keyspaces = Schema.instance.getKeyspaces(); - List<KsDef> ksset = new ArrayList<KsDef>(keyspaces.size()); + List<KsDef> ksset = new ArrayList<>(keyspaces.size()); for (String ks : keyspaces) { try @@ -1778,7 +1766,7 @@ public class CassandraServer implements Cassandra.Iface throws TException, InvalidRequestException { List<CfSplit> splits = describe_splits_ex(cfName, start_token, end_token, keys_per_split); - List<String> result = new ArrayList<String>(splits.size() + 1); + List<String> result = new ArrayList<>(splits.size() + 1); result.add(splits.get(0).getStart_token()); for (CfSplit cfSplit : splits) @@ -1793,10 +1781,10 @@ public class CassandraServer implements Cassandra.Iface try { Token.TokenFactory tf = StorageService.getPartitioner().getTokenFactory(); - Range<Token> tr = new Range<Token>(tf.fromString(start_token), tf.fromString(end_token)); + Range<Token> tr = new Range<>(tf.fromString(start_token), tf.fromString(end_token)); List<Pair<Range<Token>, Long>> splits = StorageService.instance.getSplits(state().getKeyspace(), cfName, tr, keys_per_split); - List<CfSplit> result = new ArrayList<CfSplit>(splits.size()); + List<CfSplit> result = new ArrayList<>(splits.size()); for (Pair<Range<Token>, Long> split : splits) result.add(new CfSplit(split.left.left.toString(), split.left.right.toString(), split.right)); return result; @@ -2115,17 +2103,13 @@ public class CassandraServer implements Cassandra.Iface { LegacyLayout.LegacyCellName name = LegacyLayout.decodeCellName(metadata, column_parent.super_column, column.name); DecoratedKey dk = StorageService.getPartitioner().decorateKey(key); - PartitionUpdate update = new PartitionUpdate(metadata, dk, PartitionColumns.of(name.column), 1); - - Row.Writer writer = name.column.isStatic() ? update.staticWriter() : update.writer(); - name.clustering.writeTo(writer); - CellPath path = name.collectionElement == null ? null : CellPath.create(name.collectionElement); // See UpdateParameters.addCounter() for more details on this ByteBuffer value = CounterContext.instance().createLocal(column.value); + CellPath path = name.collectionElement == null ? null : CellPath.create(name.collectionElement); + Cell cell = BufferCell.live(metadata, name.column, FBUtilities.timestampMicros(), value, path); - writer.writeCell(name.column, true, value, SimpleLivenessInfo.forUpdate(FBUtilities.timestampMicros(), LivenessInfo.NO_TTL, FBUtilities.nowInSeconds(), metadata), path); - writer.endOfRow(); + PartitionUpdate update = PartitionUpdate.singleRowUpdate(metadata, dk, ArrayBackedRow.singleCellRow(name.clustering, cell)); org.apache.cassandra.db.Mutation mutation = new org.apache.cassandra.db.Mutation(update); doInsert(consistency_level, Arrays.asList(new CounterMutation(mutation, ThriftConversion.fromThrift(consistency_level)))); @@ -2489,7 +2473,7 @@ public class CassandraServer implements Cassandra.Iface // Gather the clustering for the expected values and query those. BTreeSet.Builder<Clustering> clusterings = BTreeSet.builder(metadata.comparator); for (Row row : expected) - clusterings.add(row.clustering().takeAlias()); + clusterings.add(row.clustering()); PartitionColumns columns = expected.staticRow().isEmpty() ? metadata.partitionColumns().withoutStatics() : metadata.partitionColumns(); @@ -2511,11 +2495,29 @@ public class CassandraServer implements Cassandra.Iface if (c == null) return false; - for (Cell ce : e) + SearchIterator<ColumnDefinition, ColumnData> searchIter = c.searchIterator(); + for (ColumnData expectedData : e) { - Cell cc = c.getCell(ce.column()); - if (cc == null || !cc.value().equals(ce.value())) + ColumnDefinition column = expectedData.column(); + ColumnData currentData = searchIter.next(column); + if (currentData == null) return false; + + if (column.isSimple()) + { + if (!((Cell)currentData).value().equals(((Cell)expectedData).value())) + return false; + } + else + { + ComplexColumnData currentComplexData = (ComplexColumnData)currentData; + for (Cell expectedCell : (ComplexColumnData)expectedData) + { + Cell currentCell = currentComplexData.getCell(expectedCell.path()); + if (currentCell == null || !currentCell.value().equals(expectedCell.value())) + return false; + } + } } } return true;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/thrift/ThriftConversion.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/thrift/ThriftConversion.java b/src/java/org/apache/cassandra/thrift/ThriftConversion.java index d99217d..c9e5062 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftConversion.java +++ b/src/java/org/apache/cassandra/thrift/ThriftConversion.java @@ -350,7 +350,7 @@ public class ThriftConversion { // SuperColumn tables: we use a special map to hold dynamic values within a given super column defs.add(ColumnDefinition.clusteringKeyDef(ks, cf, names.defaultClusteringName(), comparator, 0)); - defs.add(ColumnDefinition.regularDef(ks, cf, CompactTables.SUPER_COLUMN_MAP_COLUMN_STR, MapType.getInstance(subComparator, defaultValidator, true), null)); + defs.add(ColumnDefinition.regularDef(ks, cf, CompactTables.SUPER_COLUMN_MAP_COLUMN_STR, MapType.getInstance(subComparator, defaultValidator, true))); } else { @@ -361,7 +361,7 @@ public class ThriftConversion for (int i = 0; i < subTypes.size(); i++) defs.add(ColumnDefinition.clusteringKeyDef(ks, cf, names.defaultClusteringName(), subTypes.get(i), i)); - defs.add(ColumnDefinition.regularDef(ks, cf, names.defaultCompactValueName(), defaultValidator, null)); + defs.add(ColumnDefinition.regularDef(ks, cf, names.defaultCompactValueName(), defaultValidator)); } } @@ -454,7 +454,6 @@ public class ThriftConversion { boolean isSuper = thriftSubcomparator != null; // For super columns, the componentIndex is 1 because the ColumnDefinition applies to the column component. - Integer componentIndex = isSuper ? 1 : null; AbstractType<?> comparator = thriftSubcomparator == null ? thriftComparator : thriftSubcomparator; try { @@ -475,7 +474,7 @@ public class ThriftConversion thriftColumnDef.index_type == null ? null : org.apache.cassandra.config.IndexType.valueOf(thriftColumnDef.index_type.name()), thriftColumnDef.index_options, thriftColumnDef.index_name, - componentIndex, + null, kind); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/thrift/ThriftResultsMerger.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/thrift/ThriftResultsMerger.java b/src/java/org/apache/cassandra/thrift/ThriftResultsMerger.java index ccb6e74..9c5a99f 100644 --- a/src/java/org/apache/cassandra/thrift/ThriftResultsMerger.java +++ b/src/java/org/apache/cassandra/thrift/ThriftResultsMerger.java @@ -101,10 +101,10 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator // We initialize lazily to avoid having this iterator fetch the wrapped iterator before it's actually asked for it. private boolean isInit; - private Row staticRow; - private int i; // the index of the next column of static row to return + private Iterator<Cell> staticCells; - private ReusableRow nextToMerge; + private final Row.Builder builder; + private Row nextToMerge; private Unfiltered nextFromWrapped; private PartitionMerger(UnfilteredRowIterator results, int nowInSec) @@ -112,15 +112,16 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator super(results); assert results.metadata().isStaticCompactTable(); this.nowInSec = nowInSec; + this.builder = ArrayBackedRow.sortedBuilder(results.columns().regulars); } private void init() { assert !isInit; - this.staticRow = super.staticRow(); + Row staticRow = super.staticRow(); assert staticRow.columns().complexColumnCount() == 0; - this.nextToMerge = createReusableRow(); + staticCells = staticRow.cells().iterator(); updateNextToMerge(); isInit = true; } @@ -131,11 +132,6 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator return Rows.EMPTY_STATIC_ROW; } - private ReusableRow createReusableRow() - { - return new ReusableRow(metadata().clusteringColumns().size(), metadata().partitionColumns().regulars, true, metadata().isCounter()); - } - @Override public boolean hasNext() { @@ -171,11 +167,9 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator if (cmp > 0) return consumeNextWrapped(); - // Same row, but we know the row has only a single column so just pick the more recent + // Same row, so merge them assert nextFromWrapped instanceof Row; - ReusableRow row = createReusableRow(); - Rows.merge((Row)consumeNextWrapped(), consumeNextToMerge(), columns().regulars, row.writer(), nowInSec); - return row; + return Rows.merge((Row)consumeNextWrapped(), consumeNextToMerge(), nowInSec); } private Unfiltered consumeNextWrapped() @@ -194,29 +188,26 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator private void updateNextToMerge() { - while (i < staticRow.columns().simpleColumnCount()) + if (!staticCells.hasNext()) { - Cell cell = staticRow.getCell(staticRow.columns().getSimple(i++)); - if (cell != null) - { - // Given a static cell, the equivalent row uses the column name as clustering and the - // value as unique cell value. - Row.Writer writer = nextToMerge.writer(); - writer.writeClusteringValue(cell.column().name.bytes); - writer.writeCell(metadata().compactValueColumn(), cell.isCounterCell(), cell.value(), cell.livenessInfo(), cell.path()); - writer.endOfRow(); - return; - } + // Nothing more to merge. + nextToMerge = null; + return; } - // Nothing more to merge. - nextToMerge = null; + + Cell cell = staticCells.next(); + + // Given a static cell, the equivalent row uses the column name as clustering and the value as unique cell value. + builder.newRow(new Clustering(cell.column().name.bytes)); + builder.addCell(new BufferCell(metadata().compactValueColumn(), cell.timestamp(), cell.ttl(), cell.localDeletionTime(), cell.value(), cell.path())); + nextToMerge = builder.build(); } } - private static class SuperColumnsPartitionMerger extends WrappingUnfilteredRowIterator + private static class SuperColumnsPartitionMerger extends AlteringUnfilteredRowIterator { private final int nowInSec; - private final ReusableRow reusableRow; + private final Row.Builder builder; private final ColumnDefinition superColumnMapColumn; private final AbstractType<?> columnComparator; @@ -229,30 +220,23 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator this.superColumnMapColumn = results.metadata().compactValueColumn(); assert superColumnMapColumn != null && superColumnMapColumn.type instanceof MapType; - this.reusableRow = new ReusableRow(results.metadata().clusteringColumns().size(), - Columns.of(superColumnMapColumn), - true, - results.metadata().isCounter()); + this.builder = ArrayBackedRow.sortedBuilder(Columns.of(superColumnMapColumn)); this.columnComparator = ((MapType)superColumnMapColumn.type).nameComparator(); } @Override - public Unfiltered next() + protected Row computeNext(Row row) { - Unfiltered next = super.next(); - if (next.kind() != Unfiltered.Kind.ROW) - return next; - - Row row = (Row)next; - Row.Writer writer = reusableRow.writer(); - row.clustering().writeTo(writer); - - PeekingIterator<Cell> staticCells = Iterators.peekingIterator(makeStaticCellIterator(row)); + PeekingIterator<Cell> staticCells = Iterators.peekingIterator(simpleCellsIterator(row)); if (!staticCells.hasNext()) return row; - Iterator<Cell> cells = row.getCells(superColumnMapColumn); - PeekingIterator<Cell> dynamicCells = Iterators.peekingIterator(cells.hasNext() ? cells : Collections.<Cell>emptyIterator()); + builder.newRow(row.clustering()); + + ComplexColumnData complexData = row.getComplexColumnData(superColumnMapColumn); + PeekingIterator<Cell> dynamicCells = Iterators.peekingIterator(complexData == null ? Collections.<Cell>emptyIterator() : complexData.iterator()); + + builder.addComplexDeletion(superColumnMapColumn, complexData.complexDeletion()); while (staticCells.hasNext() && dynamicCells.hasNext()) { @@ -260,52 +244,37 @@ public class ThriftResultsMerger extends WrappingUnfilteredPartitionIterator Cell dynamicCell = dynamicCells.peek(); int cmp = columnComparator.compare(staticCell.column().name.bytes, dynamicCell.path().get(0)); if (cmp < 0) - { - staticCell = staticCells.next(); - writer.writeCell(superColumnMapColumn, staticCell.isCounterCell(), staticCell.value(), staticCell.livenessInfo(), CellPath.create(staticCell.column().name.bytes)); - } + builder.addCell(makeDynamicCell(staticCells.next())); else if (cmp > 0) - { - dynamicCells.next().writeTo(writer); - } + builder.addCell(dynamicCells.next()); else - { - staticCell = staticCells.next(); - Cell toMerge = Cells.create(superColumnMapColumn, - staticCell.isCounterCell(), - staticCell.value(), - staticCell.livenessInfo(), - CellPath.create(staticCell.column().name.bytes)); - Cells.reconcile(toMerge, dynamicCells.next(), nowInSec).writeTo(writer); - } + builder.addCell(Cells.reconcile(makeDynamicCell(staticCells.next()), dynamicCells.next(), nowInSec)); } while (staticCells.hasNext()) - { - Cell staticCell = staticCells.next(); - writer.writeCell(superColumnMapColumn, staticCell.isCounterCell(), staticCell.value(), staticCell.livenessInfo(), CellPath.create(staticCell.column().name.bytes)); - } + builder.addCell(makeDynamicCell(staticCells.next())); while (dynamicCells.hasNext()) - { - dynamicCells.next().writeTo(writer); - } + builder.addCell(dynamicCells.next()); + + return builder.build(); + } - writer.endOfRow(); - return reusableRow; + private Cell makeDynamicCell(Cell staticCell) + { + return new BufferCell(superColumnMapColumn, staticCell.timestamp(), staticCell.ttl(), staticCell.localDeletionTime(), staticCell.value(), CellPath.create(staticCell.column().name.bytes)); } - private static Iterator<Cell> makeStaticCellIterator(final Row row) + private Iterator<Cell> simpleCellsIterator(Row row) { + final Iterator<Cell> cells = row.cells().iterator(); return new AbstractIterator<Cell>() { - private int i; - protected Cell computeNext() { - while (i < row.columns().simpleColumnCount()) + if (cells.hasNext()) { - Cell cell = row.getCell(row.columns().getSimple(i++)); - if (cell != null) + Cell cell = cells.next(); + if (cell.column().isSimple()) return cell; } return endOfData(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/ByteBufferUtil.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java index 65ed23c..abc2a37 100644 --- a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java +++ b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java @@ -34,6 +34,7 @@ import java.util.UUID; import net.nicoulaj.compilecommand.annotations.Inline; import org.apache.cassandra.db.TypeSizes; +import org.apache.cassandra.io.util.DataInputPlus; import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.io.util.FileUtils; @@ -290,6 +291,12 @@ public class ByteBufferUtil out.write(bytes); } + public static void writeWithVIntLength(ByteBuffer bytes, DataOutputPlus out) throws IOException + { + out.writeVInt(bytes.remaining()); + out.write(bytes); + } + public static void writeWithLength(byte[] bytes, DataOutput out) throws IOException { out.writeInt(bytes.length); @@ -323,12 +330,36 @@ public class ByteBufferUtil return ByteBufferUtil.read(in, length); } + public static ByteBuffer readWithVIntLength(DataInputPlus in) throws IOException + { + int length = (int)in.readVInt(); + if (length < 0) + throw new IOException("Corrupt (negative) value length encountered"); + + return ByteBufferUtil.read(in, length); + } + public static int serializedSizeWithLength(ByteBuffer buffer) { int size = buffer.remaining(); return TypeSizes.sizeof(size) + size; } + public static int serializedSizeWithVIntLength(ByteBuffer buffer) + { + int size = buffer.remaining(); + return TypeSizes.sizeofVInt(size) + size; + } + + public static void skipWithVIntLength(DataInputPlus in) throws IOException + { + int length = (int)in.readVInt(); + if (length < 0) + throw new IOException("Corrupt (negative) value length encountered"); + + FileUtils.skipBytesFully(in, length); + } + /* @return An unsigned short in an integer. */ public static int readShortLength(DataInput in) throws IOException { http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/ObjectSizes.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/ObjectSizes.java b/src/java/org/apache/cassandra/utils/ObjectSizes.java index e05dcba..e7469c1 100644 --- a/src/java/org/apache/cassandra/utils/ObjectSizes.java +++ b/src/java/org/apache/cassandra/utils/ObjectSizes.java @@ -23,6 +23,8 @@ package org.apache.cassandra.utils; import java.nio.ByteBuffer; +import java.util.ArrayList; + import org.github.jamm.MemoryLayoutSpecification; import org.github.jamm.MemoryMeter; @@ -111,6 +113,7 @@ public class ObjectSizes { return BUFFER_EMPTY_SIZE * array.length + sizeOfArray(array); } + /** * Memory a byte buffer consumes * @param buffer ByteBuffer to calculate in memory size http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/Sorting.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/Sorting.java b/src/java/org/apache/cassandra/utils/Sorting.java deleted file mode 100644 index b1c0b46..0000000 --- a/src/java/org/apache/cassandra/utils/Sorting.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.cassandra.utils; - -public abstract class Sorting -{ - private Sorting() {} - - /** - * Interface that allows to sort elements addressable by index, but without actually requiring those - * to elements to be part of a list/array. - */ - public interface Sortable - { - /** - * The number of elements to sort. - */ - public int size(); - - /** - * Compares the element with index i should sort before the element with index j. - */ - public int compare(int i, int j); - - /** - * Swaps element i and j. - */ - public void swap(int i, int j); - } - - /** - * Sort a sortable. - * - * The actual algorithm is a direct adaptation of the standard sorting in golang - * at http://golang.org/src/pkg/sort/sort.go (comments included). - * - * It makes one call to data.Len to determine n, and O(n*log(n)) calls to - * data.Less and data.Swap. The sort is not guaranteed to be stable. - */ - public static void sort(Sortable data) - { - // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. - int n = data.size(); - int maxDepth = 0; - for (int i = n; i > 0; i >>= 1) - maxDepth++; - maxDepth *= 2; - quickSort(data, 0, n, maxDepth); - } - - private static void insertionSort(Sortable data, int a, int b) - { - for (int i = a + 1; i < b; i++) - for(int j = i; j > a && data.compare(j, j-1) < 0; j--) - data.swap(j, j-1); - } - - // siftDown implements the heap property on data[lo, hi). - // first is an offset into the array where the root of the heap lies. - private static void siftDown(Sortable data, int lo, int hi, int first) - { - int root = lo; - while (true) - { - int child = 2*root + 1; - if (child >= hi) - return; - - if (child + 1 < hi && data.compare(first+child, first+child+1) < 0) - child++; - - if (data.compare(first+root, first+child) >= 0) - return; - - data.swap(first+root, first+child); - root = child; - } - } - - private static void heapSort(Sortable data, int a, int b) - { - int first = a; - int lo = 0; - int hi = b - a; - - // Build heap with greatest element at top. - for (int i = (hi - 1) / 2; i >= 0; i--) - siftDown(data, i, hi, first); - - // Pop elements, largest first, into end of data. - for (int i = hi - 1; i >= 0; i--) { - data.swap(first, first+i); - siftDown(data, lo, i, first); - } - } - - // Quicksort, following Bentley and McIlroy, - // ``Engineering a Sort Function,'' SP&E November 1993. - - // medianOfThree moves the median of the three values data[a], data[b], data[c] into data[a]. - private static void medianOfThree(Sortable data, int a, int b, int c) - { - int m0 = b; - int m1 = a; - int m2 = c; - // bubble sort on 3 elements - if (data.compare(m1, m0) < 0) - data.swap(m1, m0); - if (data.compare(m2, m1) < 0) - data.swap(m2, m1); - if (data.compare(m1, m0) < 0) - data.swap(m1, m0); - // now data[m0] <= data[m1] <= data[m2] - } - - private static void swapRange(Sortable data, int a, int b, int n) - { - for (int i = 0; i < n; i++) - data.swap(a+i, b+i); - } - - private static void doPivot(Sortable data, int lo, int hi, int[] result) - { - int m = lo + (hi-lo)/2; // Written like this to avoid integer overflow. - if (hi-lo > 40) { - // Tukey's ``Ninther,'' median of three medians of three. - int s = (hi - lo) / 8; - medianOfThree(data, lo, lo+s, lo+2*s); - medianOfThree(data, m, m-s, m+s); - medianOfThree(data, hi-1, hi-1-s, hi-1-2*s); - } - medianOfThree(data, lo, m, hi-1); - - // Invariants are: - // data[lo] = pivot (set up by ChoosePivot) - // data[lo <= i < a] = pivot - // data[a <= i < b] < pivot - // data[b <= i < c] is unexamined - // data[c <= i < d] > pivot - // data[d <= i < hi] = pivot - // - // Once b meets c, can swap the "= pivot" sections - // into the middle of the slice. - int pivot = lo; - int a = lo+1, b = lo+1, c = hi, d =hi; - while (true) - { - while (b < c) - { - int cmp = data.compare(b, pivot); - if (cmp < 0) // data[b] < pivot - { - b++; - } - else if (cmp == 0) // data[b] = pivot - { - data.swap(a, b); - a++; - b++; - } - else - { - break; - } - } - - while (b < c) - { - int cmp = data.compare(pivot, c-1); - if (cmp < 0) // data[c-1] > pivot - { - c--; - } - else if (cmp == 0) // data[c-1] = pivot - { - data.swap(c-1, d-1); - c--; - d--; - } - else - { - break; - } - } - - if (b >= c) - break; - - // data[b] > pivot; data[c-1] < pivot - data.swap(b, c-1); - b++; - c--; - } - - int n = Math.min(b-a, a-lo); - swapRange(data, lo, b-n, n); - - n = Math.min(hi-d, d-c); - swapRange(data, c, hi-n, n); - - result[0] = lo + b - a; - result[1] = hi - (d - c); - } - - private static void quickSort(Sortable data, int a, int b, int maxDepth) - { - int[] buffer = new int[2]; - - while (b-a > 7) - { - if (maxDepth == 0) - { - heapSort(data, a, b); - return; - } - - maxDepth--; - - doPivot(data, a, b, buffer); - int mlo = buffer[0]; - int mhi = buffer[1]; - // Avoiding recursion on the larger subproblem guarantees - // a stack depth of at most lg(b-a). - if (mlo-a < b-mhi) - { - quickSort(data, a, mlo, maxDepth); - a = mhi; // i.e., quickSort(data, mhi, b) - } - else - { - quickSort(data, mhi, b, maxDepth); - b = mlo; // i.e., quickSort(data, a, mlo) - } - } - - if (b-a > 1) - insertionSort(data, a, b); - } -} http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/memory/AbstractAllocator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/memory/AbstractAllocator.java b/src/java/org/apache/cassandra/utils/memory/AbstractAllocator.java index 0735d6e..a470527 100644 --- a/src/java/org/apache/cassandra/utils/memory/AbstractAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/AbstractAllocator.java @@ -19,6 +19,11 @@ package org.apache.cassandra.utils.memory; import java.nio.ByteBuffer; +import org.apache.cassandra.db.Clustering; +import org.apache.cassandra.db.Columns; +import org.apache.cassandra.db.rows.ArrayBackedRow; +import org.apache.cassandra.db.rows.Cell; +import org.apache.cassandra.db.rows.Row; import org.apache.cassandra.utils.ByteBufferUtil; public abstract class AbstractAllocator @@ -40,4 +45,32 @@ public abstract class AbstractAllocator } public abstract ByteBuffer allocate(int size); + + public Row.Builder cloningArrayBackedRowBuilder(Columns columns) + { + return new CloningArrayBackedRowBuilder(columns, this); + } + + private static class CloningArrayBackedRowBuilder extends ArrayBackedRow.SortedBuilder + { + private final AbstractAllocator allocator; + + private CloningArrayBackedRowBuilder(Columns columns, AbstractAllocator allocator) + { + super(columns); + this.allocator = allocator; + } + + @Override + public void newRow(Clustering clustering) + { + super.newRow(clustering.copy(allocator)); + } + + @Override + public void addCell(Cell cell) + { + super.addCell(cell.copy(allocator)); + } + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java b/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java index 443aca2..15499ae 100644 --- a/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java @@ -59,8 +59,7 @@ public abstract class MemtableAllocator this.offHeap = offHeap; } - public abstract MemtableRowData.ReusableRow newReusableRow(); - public abstract RowAllocator newRowAllocator(CFMetaData cfm, OpOrder.Group writeOp); + public abstract Row.Builder rowBuilder(CFMetaData metadata, OpOrder.Group opGroup, boolean isStatic); public abstract DecoratedKey clone(DecoratedKey key, OpOrder.Group opGroup); public abstract DataReclaimer reclaimer(); @@ -103,16 +102,10 @@ public abstract class MemtableAllocator return state == LifeCycle.LIVE; } - public static interface RowAllocator extends Row.Writer - { - public void allocateNewRow(int clusteringSize, Columns columns, boolean isStatic); - public MemtableRowData allocatedRowData(); - } - public static interface DataReclaimer { - public DataReclaimer reclaim(MemtableRowData row); - public DataReclaimer reclaimImmediately(MemtableRowData row); + public DataReclaimer reclaim(Row row); + public DataReclaimer reclaimImmediately(Row row); public DataReclaimer reclaimImmediately(DecoratedKey key); public void cancel(); public void commit(); @@ -120,12 +113,12 @@ public abstract class MemtableAllocator public static final DataReclaimer NO_OP = new DataReclaimer() { - public DataReclaimer reclaim(MemtableRowData update) + public DataReclaimer reclaim(Row update) { return this; } - public DataReclaimer reclaimImmediately(MemtableRowData update) + public DataReclaimer reclaimImmediately(Row update) { return this; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/memory/MemtableBufferAllocator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/memory/MemtableBufferAllocator.java b/src/java/org/apache/cassandra/utils/memory/MemtableBufferAllocator.java index 144f439..31df444 100644 --- a/src/java/org/apache/cassandra/utils/memory/MemtableBufferAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/MemtableBufferAllocator.java @@ -27,20 +27,15 @@ import org.apache.cassandra.utils.concurrent.OpOrder; public abstract class MemtableBufferAllocator extends MemtableAllocator { - protected MemtableBufferAllocator(SubAllocator onHeap, SubAllocator offHeap) { super(onHeap, offHeap); } - public MemtableRowData.ReusableRow newReusableRow() + public Row.Builder rowBuilder(CFMetaData metadata, OpOrder.Group writeOp, boolean isStatic) { - return MemtableRowData.BufferRowData.createReusableRow(); - } - - public RowAllocator newRowAllocator(CFMetaData cfm, OpOrder.Group writeOp) - { - return new RowBufferAllocator(allocator(writeOp), cfm.isCounter()); + Columns columns = isStatic ? metadata.partitionColumns().statics : metadata.partitionColumns().regulars; + return allocator(writeOp).cloningArrayBackedRowBuilder(columns); } public DecoratedKey clone(DecoratedKey key, OpOrder.Group writeOp) @@ -54,71 +49,4 @@ public abstract class MemtableBufferAllocator extends MemtableAllocator { return new ContextAllocator(writeOp, this); } - - private static class RowBufferAllocator extends RowDataBlock.Writer implements RowAllocator - { - private final AbstractAllocator allocator; - private final boolean isCounter; - - private MemtableRowData.BufferClustering clustering; - private int clusteringIdx; - private LivenessInfo info; - private DeletionTime deletion; - private RowDataBlock data; - - private RowBufferAllocator(AbstractAllocator allocator, boolean isCounter) - { - super(true); - this.allocator = allocator; - this.isCounter = isCounter; - } - - public void allocateNewRow(int clusteringSize, Columns columns, boolean isStatic) - { - data = new RowDataBlock(columns, 1, false, isCounter); - clustering = isStatic ? null : new MemtableRowData.BufferClustering(clusteringSize); - clusteringIdx = 0; - updateWriter(data); - } - - public MemtableRowData allocatedRowData() - { - MemtableRowData row = new MemtableRowData.BufferRowData(clustering == null ? Clustering.STATIC_CLUSTERING : clustering, - info, - deletion, - data); - - clustering = null; - info = LivenessInfo.NONE; - deletion = DeletionTime.LIVE; - data = null; - - return row; - } - - public void writeClusteringValue(ByteBuffer value) - { - clustering.setClusteringValue(clusteringIdx++, value == null ? null : allocator.clone(value)); - } - - public void writePartitionKeyLivenessInfo(LivenessInfo info) - { - this.info = info; - } - - public void writeRowDeletion(DeletionTime deletion) - { - this.deletion = deletion; - } - - @Override - public void writeCell(ColumnDefinition column, boolean isCounter, ByteBuffer value, LivenessInfo info, CellPath path) - { - ByteBuffer v = allocator.clone(value); - if (column.isComplex()) - complexWriter.addCell(column, v, info, MemtableRowData.BufferCellPath.clone(path, allocator)); - else - simpleWriter.addCell(column, v, info); - } - } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java index 7ca859d..7b95430 100644 --- a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java +++ b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java @@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.NativeDecoratedKey; -import org.apache.cassandra.db.rows.MemtableRowData; +import org.apache.cassandra.db.rows.Row; import org.apache.cassandra.utils.concurrent.OpOrder; public class NativeAllocator extends MemtableAllocator @@ -53,13 +53,7 @@ public class NativeAllocator extends MemtableAllocator super(pool.onHeap.newAllocator(), pool.offHeap.newAllocator()); } - public MemtableRowData.ReusableRow newReusableRow() - { - // TODO - throw new UnsupportedOperationException(); - } - - public RowAllocator newRowAllocator(CFMetaData cfm, OpOrder.Group writeOp) + public Row.Builder rowBuilder(CFMetaData metadata, OpOrder.Group opGroup, boolean isStatic) { // TODO throw new UnsupportedOperationException(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-CRC.db ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-CRC.db b/test/data/corrupt-sstables/la-1-big-CRC.db index f13b9c7..1a0c525 100644 Binary files a/test/data/corrupt-sstables/la-1-big-CRC.db and b/test/data/corrupt-sstables/la-1-big-CRC.db differ http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-Data.db ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-Data.db b/test/data/corrupt-sstables/la-1-big-Data.db index dc516d8..e6c5eb9 100644 Binary files a/test/data/corrupt-sstables/la-1-big-Data.db and b/test/data/corrupt-sstables/la-1-big-Data.db differ http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-Digest.adler32 ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-Digest.adler32 b/test/data/corrupt-sstables/la-1-big-Digest.adler32 index e447277..93deb45 100644 --- a/test/data/corrupt-sstables/la-1-big-Digest.adler32 +++ b/test/data/corrupt-sstables/la-1-big-Digest.adler32 @@ -1 +1 @@ -2370519993 \ No newline at end of file +3942663153 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-Index.db ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-Index.db b/test/data/corrupt-sstables/la-1-big-Index.db index 178221e..6e5e352 100644 Binary files a/test/data/corrupt-sstables/la-1-big-Index.db and b/test/data/corrupt-sstables/la-1-big-Index.db differ http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-Statistics.db ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-Statistics.db b/test/data/corrupt-sstables/la-1-big-Statistics.db index 23b76ac..15220e0 100644 Binary files a/test/data/corrupt-sstables/la-1-big-Statistics.db and b/test/data/corrupt-sstables/la-1-big-Statistics.db differ http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/data/corrupt-sstables/la-1-big-TOC.txt ---------------------------------------------------------------------- diff --git a/test/data/corrupt-sstables/la-1-big-TOC.txt b/test/data/corrupt-sstables/la-1-big-TOC.txt index 9cbcd44..9ad71ef 100644 --- a/test/data/corrupt-sstables/la-1-big-TOC.txt +++ b/test/data/corrupt-sstables/la-1-big-TOC.txt @@ -1,8 +1,8 @@ Statistics.db -Filter.db -Data.db -Summary.db -Digest.adler32 CRC.db TOC.txt +Data.db Index.db +Summary.db +Digest.adler32 +Filter.db http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java ---------------------------------------------------------------------- diff --git a/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java b/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java index e1dd953..8a63a27 100644 --- a/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java +++ b/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java @@ -487,7 +487,7 @@ public class CommitLogStressTest if (!(UTF8Type.instance.compose(row.clustering().get(0)).startsWith("name"))) continue; - for (Cell cell : row) + for (Cell cell : row.cells()) { hash = hash(hash, cell.value()); ++cells; http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/SchemaLoader.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java index ce6ac22..12305ef 100644 --- a/test/unit/org/apache/cassandra/SchemaLoader.java +++ b/test/unit/org/apache/cassandra/SchemaLoader.java @@ -319,7 +319,7 @@ public class SchemaLoader .addPartitionKey("key", AsciiType.instance) .build(); - return cfm.addOrReplaceColumnDefinition(ColumnDefinition.regularDef(ksName, cfName, "indexed", AsciiType.instance, null) + return cfm.addOrReplaceColumnDefinition(ColumnDefinition.regularDef(ksName, cfName, "indexed", AsciiType.instance) .setIndex("indexe1", IndexType.CUSTOM, indexOptions)); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/Util.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java index 423b3c0..654b8c6 100644 --- a/test/unit/org/apache/cassandra/Util.java +++ b/test/unit/org/apache/cassandra/Util.java @@ -340,7 +340,7 @@ public class Util assert !iterator.hasNext() : "Expecting a single partition but got more"; assert partition.hasNext() : "Expecting one row in one partition but got an empty partition"; - Row row = ((Row)partition.next()).takeAlias(); + Row row = ((Row)partition.next()); assert !partition.hasNext() : "Expecting a single row but got more"; return row; } @@ -356,7 +356,7 @@ public class Util { assert !iterator.hasNext() : "Expecting a single partition but got more"; assert partition.hasNext() : "Expecting one row in one partition but got an empty partition"; - Row row = partition.next().takeAlias(); + Row row = partition.next(); assert !partition.hasNext() : "Expecting a single row but got more"; return row; } @@ -444,10 +444,22 @@ public class Util return CBuilder.create(new ClusteringComparator(types)); } + public static boolean equal(UnfilteredRowIterator a, UnfilteredRowIterator b) + { + return Objects.equals(a.columns(), b.columns()) + && Objects.equals(a.metadata(), b.metadata()) + && Objects.equals(a.isReverseOrder(), b.isReverseOrder()) + && Objects.equals(a.partitionKey(), b.partitionKey()) + && Objects.equals(a.partitionLevelDeletion(), b.partitionLevelDeletion()) + && Objects.equals(a.staticRow(), b.staticRow()) + && Objects.equals(a.stats(), b.stats()) + && Iterators.elementsEqual(a, b); + } + // moved & refactored from KeyspaceTest in < 3.0 public static void assertColumns(Row row, String... expectedColumnNames) { - Iterator<Cell> cells = row == null ? Iterators.<Cell>emptyIterator() : row.iterator(); + Iterator<Cell> cells = row == null ? Iterators.<Cell>emptyIterator() : row.cells().iterator(); String[] actual = Iterators.toArray(Iterators.transform(cells, new Function<Cell, String>() { public String apply(Cell cell) @@ -472,7 +484,7 @@ public class Util { assertNotNull(cell); assertEquals(0, ByteBufferUtil.compareUnsigned(cell.value(), ByteBufferUtil.bytes(value))); - assertEquals(timestamp, cell.livenessInfo().timestamp()); + assertEquals(timestamp, cell.timestamp()); } public static void assertClustering(CFMetaData cfm, Row row, Object... clusteringValue) http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java index fb5d84f..71b87f9 100644 --- a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java +++ b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java @@ -56,7 +56,7 @@ public class AutoSavingCacheTest ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1); for (int i = 0; i < 2; i++) { - ColumnDefinition colDef = new ColumnDefinition(cfs.metadata, ByteBufferUtil.bytes("col1"), AsciiType.instance, 0, ColumnDefinition.Kind.REGULAR); + ColumnDefinition colDef = ColumnDefinition.regularDef(cfs.metadata, ByteBufferUtil.bytes("col1"), AsciiType.instance); RowUpdateBuilder rowBuilder = new RowUpdateBuilder(cfs.metadata, System.currentTimeMillis(), "key1"); rowBuilder.add(colDef, "val1"); rowBuilder.build().apply(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java index 0e5e192..c875165 100644 --- a/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java +++ b/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java @@ -38,10 +38,10 @@ public class ColumnDefinitionTest .addRegularColumn("val", AsciiType.instance) .build(); - ColumnDefinition cd0 = ColumnDefinition.staticDef(cfm, ByteBufferUtil.bytes("TestColumnDefinitionName0"), BytesType.instance, null) + ColumnDefinition cd0 = ColumnDefinition.staticDef(cfm, ByteBufferUtil.bytes("TestColumnDefinitionName0"), BytesType.instance) .setIndex("random index name 0", IndexType.KEYS, null); - ColumnDefinition cd1 = ColumnDefinition.staticDef(cfm, ByteBufferUtil.bytes("TestColumnDefinition1"), LongType.instance, null); + ColumnDefinition cd1 = ColumnDefinition.staticDef(cfm, ByteBufferUtil.bytes("TestColumnDefinition1"), LongType.instance); testSerializeDeserialize(cfm, cd0); testSerializeDeserialize(cfm, cd1); http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/cql3/ColumnConditionTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/ColumnConditionTest.java b/test/unit/org/apache/cassandra/cql3/ColumnConditionTest.java index 9a768de..71524c5 100644 --- a/test/unit/org/apache/cassandra/cql3/ColumnConditionTest.java +++ b/test/unit/org/apache/cassandra/cql3/ColumnConditionTest.java @@ -25,19 +25,20 @@ import org.junit.Test; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.LivenessInfo; -import org.apache.cassandra.db.rows.AbstractCell; +import org.apache.cassandra.db.rows.BufferCell; import org.apache.cassandra.db.rows.Cell; import org.apache.cassandra.db.rows.CellPath; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.serializers.Int32Serializer; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.UUIDGen; import static org.junit.Assert.*; public class ColumnConditionTest { - public static ByteBuffer UNSET_BYTE_BUFFER = ByteBuffer.wrap(new byte[]{}); + private static final CellPath LIST_PATH = CellPath.create(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes())); public static final ByteBuffer ZERO = Int32Type.instance.fromString("0"); public static final ByteBuffer ONE = Int32Type.instance.fromString("1"); @@ -51,12 +52,17 @@ public class ColumnConditionTest Cell cell = null; if (columnValue != null) { - ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true), null); - cell = new TestCell(definition, null, columnValue, LivenessInfo.NONE); + ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true)); + cell = testCell(definition, columnValue, LIST_PATH); } return bound.isSatisfiedByValue(conditionValue, cell, Int32Type.instance, bound.operator); } + private static Cell testCell(ColumnDefinition column, ByteBuffer value, CellPath path) + { + return new BufferCell(column, 0L, Cell.NO_TTL, Cell.NO_DELETION_TIME, value, path); + } + private static void assertThrowsIRE(ColumnCondition.Bound bound, ByteBuffer conditionValue, ByteBuffer columnValue) { try @@ -69,7 +75,7 @@ public class ColumnConditionTest @Test public void testSimpleBoundIsSatisfiedByValue() throws InvalidRequestException { - ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true), null); + ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true)); // EQ ColumnCondition condition = ColumnCondition.condition(definition, new Constants.Value(ONE), Operator.EQ); @@ -157,7 +163,7 @@ public class ColumnConditionTest Map<ByteBuffer, CollectionType> typeMap = new HashMap<>(); typeMap.put(ByteBufferUtil.bytes("c"), ListType.getInstance(Int32Type.instance, true)); - ColumnDefinition definition = new ColumnDefinition(cfm, ByteBufferUtil.bytes("c"), ListType.getInstance(Int32Type.instance, true), 0, ColumnDefinition.Kind.REGULAR); + ColumnDefinition definition = ColumnDefinition.regularDef(cfm, ByteBufferUtil.bytes("c"), ListType.getInstance(Int32Type.instance, true)); List<Cell> cells = new ArrayList<>(columnValues.size()); if (columnValues != null) @@ -166,7 +172,7 @@ public class ColumnConditionTest { ByteBuffer key = Int32Serializer.instance.serialize(i); ByteBuffer value = columnValues.get(i); - cells.add(new TestCell(definition, CellPath.create(key), value, LivenessInfo.NONE)); + cells.add(testCell(definition, value, CellPath.create(key))); }; } @@ -177,7 +183,7 @@ public class ColumnConditionTest // sets use the same check as lists public void testListCollectionBoundAppliesTo() throws InvalidRequestException { - ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true), null); + ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true)); // EQ ColumnCondition condition = ColumnCondition.condition(definition, null, new Lists.Value(Arrays.asList(ONE)), Operator.EQ); @@ -288,7 +294,7 @@ public class ColumnConditionTest CFMetaData cfm = CFMetaData.compile("create table foo(a int PRIMARY KEY, b int, c set<int>)", "ks"); Map<ByteBuffer, CollectionType> typeMap = new HashMap<>(); typeMap.put(ByteBufferUtil.bytes("c"), SetType.getInstance(Int32Type.instance, true)); - ColumnDefinition definition = new ColumnDefinition(cfm, ByteBufferUtil.bytes("c"), SetType.getInstance(Int32Type.instance, true), 0, ColumnDefinition.Kind.REGULAR); + ColumnDefinition definition = ColumnDefinition.regularDef(cfm, ByteBufferUtil.bytes("c"), SetType.getInstance(Int32Type.instance, true)); List<Cell> cells = new ArrayList<>(columnValues.size()); if (columnValues != null) @@ -296,7 +302,7 @@ public class ColumnConditionTest for (int i = 0; i < columnValues.size(); i++) { ByteBuffer key = columnValues.get(i); - cells.add(new TestCell(definition, CellPath.create(key), ByteBufferUtil.EMPTY_BYTE_BUFFER, LivenessInfo.NONE)); + cells.add(testCell(definition, ByteBufferUtil.EMPTY_BYTE_BUFFER, CellPath.create(key))); }; } @@ -306,7 +312,7 @@ public class ColumnConditionTest @Test public void testSetCollectionBoundAppliesTo() throws InvalidRequestException { - ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true), null); + ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true)); // EQ ColumnCondition condition = ColumnCondition.condition(definition, null, new Sets.Value(set(ONE)), Operator.EQ); @@ -420,13 +426,13 @@ public class ColumnConditionTest CFMetaData cfm = CFMetaData.compile("create table foo(a int PRIMARY KEY, b map<int, int>)", "ks"); Map<ByteBuffer, CollectionType> typeMap = new HashMap<>(); typeMap.put(ByteBufferUtil.bytes("b"), MapType.getInstance(Int32Type.instance, Int32Type.instance, true)); - ColumnDefinition definition = new ColumnDefinition(cfm, ByteBufferUtil.bytes("b"), MapType.getInstance(Int32Type.instance, Int32Type.instance, true), 0, ColumnDefinition.Kind.REGULAR); + ColumnDefinition definition = ColumnDefinition.regularDef(cfm, ByteBufferUtil.bytes("b"), MapType.getInstance(Int32Type.instance, Int32Type.instance, true)); List<Cell> cells = new ArrayList<>(columnValues.size()); if (columnValues != null) { for (Map.Entry<ByteBuffer, ByteBuffer> entry : columnValues.entrySet()) - cells.add(new TestCell(definition, CellPath.create(entry.getKey()), entry.getValue(), LivenessInfo.NONE)); + cells.add(testCell(definition, entry.getValue(), CellPath.create(entry.getKey()))); } return bound.mapAppliesTo(MapType.getInstance(Int32Type.instance, Int32Type.instance, true), cells.iterator(), conditionValues, bound.operator); @@ -435,7 +441,7 @@ public class ColumnConditionTest @Test public void testMapCollectionBoundIsSatisfiedByValue() throws InvalidRequestException { - ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true), null); + ColumnDefinition definition = ColumnDefinition.regularDef("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true)); Map<ByteBuffer, ByteBuffer> placeholderMap = new TreeMap<>(); placeholderMap.put(ONE, ONE); @@ -573,45 +579,4 @@ public class ColumnConditionTest assertTrue(mapAppliesTo(bound, map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE))); assertTrue(mapAppliesTo(bound, map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER))); } - - static class TestCell extends AbstractCell - { - private final ColumnDefinition column; - private final CellPath path; - private final ByteBuffer value; - private final LivenessInfo info; - - public TestCell(ColumnDefinition column, CellPath path, ByteBuffer value, LivenessInfo info) - { - this.column = column; - this.path = path; - this.value = value; - this.info = info.takeAlias(); - } - - public ColumnDefinition column() - { - return column; - } - - public boolean isCounterCell() - { - return false; - } - - public ByteBuffer value() - { - return value; - } - - public LivenessInfo livenessInfo() - { - return info; - } - - public CellPath path() - { - return path; - } - } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/cql3/SimpleQueryTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/SimpleQueryTest.java b/test/unit/org/apache/cassandra/cql3/SimpleQueryTest.java index ad0dd7b..052b53d 100644 --- a/test/unit/org/apache/cassandra/cql3/SimpleQueryTest.java +++ b/test/unit/org/apache/cassandra/cql3/SimpleQueryTest.java @@ -307,7 +307,7 @@ public class SimpleQueryTest extends CQLTester createTable("CREATE TABLE %s (k text, t int, v1 text, v2 int, PRIMARY KEY (k, t));"); for (int t = 0; t < N; t++) - execute("INSERT INTO %s (k, t, v1, v2) values (?, ?, ?, ?)", "key", t, "v" + t, t + 10); + execute("INSERT INTO %s (k, t, v1, v2) values (?, ?, ?, ?)", "key", t, "v" + t, t + 10); flush(); @@ -434,7 +434,7 @@ public class SimpleQueryTest extends CQLTester @Test public void collectionDeletionTest() throws Throwable { - createTable("CREATE TABLE %s (k text PRIMARY KEY, s set<int>);"); + createTable("CREATE TABLE %s (k int PRIMARY KEY, s set<int>);"); execute("INSERT INTO %s (k, s) VALUES (?, ?)", 1, set(1)); http://git-wip-us.apache.org/repos/asf/cassandra/blob/24575994/test/unit/org/apache/cassandra/db/CellTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/CellTest.java b/test/unit/org/apache/cassandra/db/CellTest.java index 9560804..e8cb1cb 100644 --- a/test/unit/org/apache/cassandra/db/CellTest.java +++ b/test/unit/org/apache/cassandra/db/CellTest.java @@ -60,12 +60,12 @@ public class CellTest // don't test equality for both sides native, as this is based on CellName resolution if (lhs && rhs) continue; - Cell a = buildCell(cfm, "a", "a", 1, 1); - Cell b = buildCell(cfm, "a", "a", 1, 0); + Cell a = expiring(cfm, "val", "a", 1, 1); + Cell b = regular(cfm, "val", "a", 1); Assert.assertNotSame(a, b); Assert.assertNotSame(b, a); - a = deleted(cfm, "a", "a", 1, 1); + a = deleted(cfm, "val", 1, 1); Assert.assertNotSame(a, b); Assert.assertNotSame(b, a); } @@ -76,18 +76,18 @@ public class CellTest public void testExpiringCellReconile() { // equal - Assert.assertEquals(0, testExpiring("a", "a", 1, 1, null, null, null, null)); + Assert.assertEquals(0, testExpiring("val", "a", 1, 1, null, null, null, null)); // newer timestamp - Assert.assertEquals(-1, testExpiring("a", "a", 2, 1, null, null, 1L, null)); - Assert.assertEquals(-1, testExpiring("a", "a", 2, 1, null, "b", 1L, 2)); + Assert.assertEquals(-1, testExpiring("val", "a", 2, 1, null, null, 1L, null)); + Assert.assertEquals(-1, testExpiring("val", "a", 2, 1, null, "val", 1L, 2)); - Assert.assertEquals(-1, testExpiring("a", "a", 1, 2, null, null, null, 1)); - Assert.assertEquals(1, testExpiring("a", "a", 1, 2, null, "b", null, 1)); + Assert.assertEquals(-1, testExpiring("val", "a", 1, 2, null, null, null, 1)); + Assert.assertEquals(1, testExpiring("val", "a", 1, 2, null, "val", null, 1)); // newer value - Assert.assertEquals(-1, testExpiring("a", "b", 2, 1, null, "a", null, null)); - Assert.assertEquals(-1, testExpiring("a", "b", 2, 1, null, "a", null, 2)); + Assert.assertEquals(-1, testExpiring("val", "b", 2, 1, null, "a", null, null)); + Assert.assertEquals(-1, testExpiring("val", "b", 2, 1, null, "a", null, 2)); } private int testExpiring(String n1, String v1, long t1, int et1, String n2, String v2, Long t2, Integer et2) @@ -100,8 +100,8 @@ public class CellTest t2 = t1; if (et2 == null) et2 = et1; - Cell c1 = buildCell(cfm, n1, v1, t1, et1); - Cell c2 = buildCell(cfm, n2, v2, t2, et2); + Cell c1 = expiring(cfm, n1, v1, t1, et1); + Cell c2 = expiring(cfm, n2, v2, t2, et2); int now = FBUtilities.nowInSeconds(); if (Cells.reconcile(c1, c2, now) == c1) @@ -109,56 +109,21 @@ public class CellTest return Cells.reconcile(c2, c1, now) == c2 ? 1 : 0; } - private Cell buildCell(CFMetaData cfm, String columnName, String value, long timestamp, int ttl) + private Cell regular(CFMetaData cfm, String columnName, String value, long timestamp) { ColumnDefinition cdef = cfm.getColumnDefinition(ByteBufferUtil.bytes(columnName)); - LivenessInfo info = SimpleLivenessInfo.forUpdate(timestamp, ttl, FBUtilities.nowInSeconds(), cfm); - return new TestCell(cdef, ByteBufferUtil.bytes(value), info); + return BufferCell.live(cfm, cdef, timestamp, ByteBufferUtil.bytes(value)); } - private Cell deleted(CFMetaData cfm, String columnName, String value, int localDeletionTime, long timestamp) + private Cell expiring(CFMetaData cfm, String columnName, String value, long timestamp, int localExpirationTime) { ColumnDefinition cdef = cfm.getColumnDefinition(ByteBufferUtil.bytes(columnName)); - LivenessInfo info = SimpleLivenessInfo.forDeletion(timestamp, localDeletionTime); - return new TestCell(cdef, ByteBufferUtil.bytes(value), info); + return new BufferCell(cdef, timestamp, 1, localExpirationTime, ByteBufferUtil.bytes(value), null); } - public static class TestCell extends AbstractCell + private Cell deleted(CFMetaData cfm, String columnName, int localDeletionTime, long timestamp) { - private final ColumnDefinition column; - private final ByteBuffer value; - private final LivenessInfo info; - - public TestCell(ColumnDefinition column, ByteBuffer value, LivenessInfo info) - { - this.column = column; - this.value = value; - this.info = info.takeAlias(); - } - - public ColumnDefinition column() - { - return column; - } - - public boolean isCounterCell() - { - return false; - } - - public ByteBuffer value() - { - return value; - } - - public LivenessInfo livenessInfo() - { - return info; - } - - public CellPath path() - { - return null; - } + ColumnDefinition cdef = cfm.getColumnDefinition(ByteBufferUtil.bytes(columnName)); + return BufferCell.tombstone(cdef, timestamp, localDeletionTime); } }
