Search in sources :

Example 1 with OutgoingStream

use of org.apache.cassandra.streaming.OutgoingStream in project cassandra by apache.

the class LegacySSTableTest method streamLegacyTable.

private void streamLegacyTable(String tablePattern, String legacyVersion) throws Exception {
    String table = String.format(tablePattern, legacyVersion);
    SSTableReader sstable = SSTableReader.open(getDescriptor(legacyVersion, table));
    IPartitioner p = sstable.getPartitioner();
    List<Range<Token>> ranges = new ArrayList<>();
    ranges.add(new Range<>(p.getMinimumToken(), p.getToken(ByteBufferUtil.bytes("100"))));
    ranges.add(new Range<>(p.getToken(ByteBufferUtil.bytes("100")), p.getMinimumToken()));
    List<OutgoingStream> streams = Lists.newArrayList(new CassandraOutgoingFile(StreamOperation.OTHER, sstable.ref(), sstable.getPositionsForRanges(ranges), ranges, sstable.estimatedKeysForRanges(ranges)));
    new StreamPlan(StreamOperation.OTHER).transferStreams(FBUtilities.getBroadcastAddressAndPort(), streams).execute().get();
}
Also used : OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) CassandraOutgoingFile(org.apache.cassandra.db.streaming.CassandraOutgoingFile) StreamPlan(org.apache.cassandra.streaming.StreamPlan) SSTableReader(org.apache.cassandra.io.sstable.format.SSTableReader) ArrayList(java.util.ArrayList) Range(org.apache.cassandra.dht.Range) IPartitioner(org.apache.cassandra.dht.IPartitioner)

Example 2 with OutgoingStream

use of org.apache.cassandra.streaming.OutgoingStream in project cassandra by apache.

the class CassandraStreamManager method createOutgoingStreams.

@Override
public Collection<OutgoingStream> createOutgoingStreams(StreamSession session, RangesAtEndpoint replicas, UUID pendingRepair, PreviewKind previewKind) {
    Refs<SSTableReader> refs = new Refs<>();
    try {
        final List<Range<PartitionPosition>> keyRanges = new ArrayList<>(replicas.size());
        for (Replica replica : replicas) keyRanges.add(Range.makeRowRange(replica.range()));
        refs.addAll(cfs.selectAndReference(view -> {
            Set<SSTableReader> sstables = Sets.newHashSet();
            SSTableIntervalTree intervalTree = SSTableIntervalTree.build(view.select(SSTableSet.CANONICAL));
            Predicate<SSTableReader> predicate;
            if (previewKind.isPreview()) {
                predicate = previewKind.predicate();
            } else if (pendingRepair == ActiveRepairService.NO_PENDING_REPAIR) {
                predicate = Predicates.alwaysTrue();
            } else {
                predicate = s -> s.isPendingRepair() && s.getSSTableMetadata().pendingRepair.equals(pendingRepair);
            }
            for (Range<PartitionPosition> keyRange : keyRanges) {
                // still actually selecting what we wanted.
                for (SSTableReader sstable : Iterables.filter(View.sstablesInBounds(keyRange.left, keyRange.right, intervalTree), predicate)) {
                    sstables.add(sstable);
                }
            }
            if (logger.isDebugEnabled())
                logger.debug("ViewFilter for {}/{} sstables", sstables.size(), Iterables.size(view.select(SSTableSet.CANONICAL)));
            return sstables;
        }).refs);
        List<Range<Token>> normalizedFullRanges = Range.normalize(replicas.onlyFull().ranges());
        List<Range<Token>> normalizedAllRanges = Range.normalize(replicas.ranges());
        // Create outgoing file streams for ranges possibly skipping repaired ranges in sstables
        List<OutgoingStream> streams = new ArrayList<>(refs.size());
        for (SSTableReader sstable : refs) {
            List<Range<Token>> ranges = sstable.isRepaired() ? normalizedFullRanges : normalizedAllRanges;
            List<SSTableReader.PartitionPositionBounds> sections = sstable.getPositionsForRanges(ranges);
            Ref<SSTableReader> ref = refs.get(sstable);
            if (sections.isEmpty()) {
                ref.release();
                continue;
            }
            streams.add(new CassandraOutgoingFile(session.getStreamOperation(), ref, sections, ranges, sstable.estimatedKeysForRanges(ranges)));
        }
        return streams;
    } catch (Throwable t) {
        refs.release();
        throw t;
    }
}
Also used : OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) Iterables(com.google.common.collect.Iterables) SSTableSet(org.apache.cassandra.db.lifecycle.SSTableSet) LoggerFactory(org.slf4j.LoggerFactory) Range(org.apache.cassandra.dht.Range) SSTableReader(org.apache.cassandra.io.sstable.format.SSTableReader) StreamMessageHeader(org.apache.cassandra.streaming.messages.StreamMessageHeader) ArrayList(java.util.ArrayList) Token(org.apache.cassandra.dht.Token) ActiveRepairService(org.apache.cassandra.service.ActiveRepairService) StreamSession(org.apache.cassandra.streaming.StreamSession) Predicates(com.google.common.base.Predicates) IncomingStream(org.apache.cassandra.streaming.IncomingStream) Refs(org.apache.cassandra.utils.concurrent.Refs) Ref(org.apache.cassandra.utils.concurrent.Ref) Logger(org.slf4j.Logger) StreamReceiver(org.apache.cassandra.streaming.StreamReceiver) Collection(java.util.Collection) Set(java.util.Set) UUID(java.util.UUID) SSTableIntervalTree(org.apache.cassandra.db.lifecycle.SSTableIntervalTree) Sets(com.google.common.collect.Sets) RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) Replica(org.apache.cassandra.locator.Replica) TableStreamManager(org.apache.cassandra.streaming.TableStreamManager) PreviewKind(org.apache.cassandra.streaming.PreviewKind) List(java.util.List) PartitionPosition(org.apache.cassandra.db.PartitionPosition) Predicate(com.google.common.base.Predicate) ColumnFamilyStore(org.apache.cassandra.db.ColumnFamilyStore) View(org.apache.cassandra.db.lifecycle.View) Refs(org.apache.cassandra.utils.concurrent.Refs) ArrayList(java.util.ArrayList) Range(org.apache.cassandra.dht.Range) Replica(org.apache.cassandra.locator.Replica) OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) SSTableReader(org.apache.cassandra.io.sstable.format.SSTableReader) PartitionPosition(org.apache.cassandra.db.PartitionPosition) SSTableIntervalTree(org.apache.cassandra.db.lifecycle.SSTableIntervalTree)

Example 3 with OutgoingStream

use of org.apache.cassandra.streaming.OutgoingStream in project cassandra by apache.

the class CassandraStreamManagerTest method sstablesFromStreams.

private static Set<SSTableReader> sstablesFromStreams(Collection<OutgoingStream> streams) {
    Set<SSTableReader> sstables = new HashSet<>();
    for (OutgoingStream stream : streams) {
        Ref<SSTableReader> ref = CassandraOutgoingFile.fromStream(stream).getRef();
        sstables.add(ref.get());
        ref.release();
    }
    return sstables;
}
Also used : OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) SSTableReader(org.apache.cassandra.io.sstable.format.SSTableReader) HashSet(java.util.HashSet)

Example 4 with OutgoingStream

use of org.apache.cassandra.streaming.OutgoingStream in project cassandra by apache.

the class CassandraStreamManagerTest method selectReaders.

private Set<SSTableReader> selectReaders(UUID pendingRepair) {
    IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
    Collection<Range<Token>> ranges = Lists.newArrayList(new Range<Token>(partitioner.getMinimumToken(), partitioner.getMinimumToken()));
    Collection<OutgoingStream> streams = cfs.getStreamManager().createOutgoingStreams(session(pendingRepair), RangesAtEndpoint.toDummyList(ranges), pendingRepair, PreviewKind.NONE);
    return sstablesFromStreams(streams);
}
Also used : OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) Token(org.apache.cassandra.dht.Token) Range(org.apache.cassandra.dht.Range) IPartitioner(org.apache.cassandra.dht.IPartitioner)

Example 5 with OutgoingStream

use of org.apache.cassandra.streaming.OutgoingStream in project cassandra by apache.

the class EntireSSTableStreamConcurrentComponentMutationTest method testStreamWithConcurrentComponentMutation.

private void testStreamWithConcurrentComponentMutation(Callable<?> runBeforeStreaming, Callable<?> runConcurrentWithStreaming) throws Throwable {
    ByteBuf serializedFile = Unpooled.buffer(8192);
    InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
    StreamSession session = setupStreamingSessionForTest();
    Collection<OutgoingStream> outgoingStreams = store.getStreamManager().createOutgoingStreams(session, rangesAtEndpoint, NO_PENDING_REPAIR, PreviewKind.NONE);
    CassandraOutgoingFile outgoingFile = (CassandraOutgoingFile) Iterables.getOnlyElement(outgoingStreams);
    Future<?> streaming = executeAsync(() -> {
        runBeforeStreaming.call();
        try (AsyncStreamingOutputPlus out = new AsyncStreamingOutputPlus(createMockNettyChannel(serializedFile))) {
            outgoingFile.write(session, out, MessagingService.current_version);
            assertTrue(sstable.descriptor.getTemporaryFiles().isEmpty());
        }
        return null;
    });
    Future<?> concurrentMutations = executeAsync(runConcurrentWithStreaming);
    streaming.get(3, TimeUnit.MINUTES);
    concurrentMutations.get(3, TimeUnit.MINUTES);
    session.prepareReceiving(new StreamSummary(sstable.metadata().id, 1, 5104));
    StreamMessageHeader messageHeader = new StreamMessageHeader(sstable.metadata().id, peer, session.planId(), false, 0, 0, 0, null);
    try (DataInputBuffer in = new DataInputBuffer(serializedFile.nioBuffer(), false)) {
        CassandraStreamHeader header = CassandraStreamHeader.serializer.deserialize(in, MessagingService.current_version);
        CassandraEntireSSTableStreamReader reader = new CassandraEntireSSTableStreamReader(messageHeader, header, session);
        SSTableReader streamedSSTable = Iterables.getOnlyElement(reader.read(in).finished());
        SSTableUtils.assertContentEquals(sstable, streamedSSTable);
    }
}
Also used : InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) AsyncStreamingOutputPlus(org.apache.cassandra.net.AsyncStreamingOutputPlus) ByteBuf(io.netty.buffer.ByteBuf) OutgoingStream(org.apache.cassandra.streaming.OutgoingStream) SSTableReader(org.apache.cassandra.io.sstable.format.SSTableReader) DataInputBuffer(org.apache.cassandra.io.util.DataInputBuffer) StreamSession(org.apache.cassandra.streaming.StreamSession) StreamSummary(org.apache.cassandra.streaming.StreamSummary) StreamMessageHeader(org.apache.cassandra.streaming.messages.StreamMessageHeader)

Aggregations

OutgoingStream (org.apache.cassandra.streaming.OutgoingStream)5 SSTableReader (org.apache.cassandra.io.sstable.format.SSTableReader)4 Range (org.apache.cassandra.dht.Range)3 ArrayList (java.util.ArrayList)2 IPartitioner (org.apache.cassandra.dht.IPartitioner)2 Token (org.apache.cassandra.dht.Token)2 StreamSession (org.apache.cassandra.streaming.StreamSession)2 StreamMessageHeader (org.apache.cassandra.streaming.messages.StreamMessageHeader)2 Predicate (com.google.common.base.Predicate)1 Predicates (com.google.common.base.Predicates)1 Iterables (com.google.common.collect.Iterables)1 Sets (com.google.common.collect.Sets)1 ByteBuf (io.netty.buffer.ByteBuf)1 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Set (java.util.Set)1 UUID (java.util.UUID)1 ColumnFamilyStore (org.apache.cassandra.db.ColumnFamilyStore)1 PartitionPosition (org.apache.cassandra.db.PartitionPosition)1