{"record":{"id":"25c39f66b6810a34","repo":"apache/cassandra","slug":"stream-s-cannot-receive-files-for-preview-sess","errorCode":null,"errorMessage":"[Stream #%s] Cannot receive files for preview session","messagePattern":"\\[Stream #(.+?)\\] Cannot receive files for preview session","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/streaming/StreamSession.java","lineNumber":1087,"sourceCode":"\n        // schedule timeout for receiving ACK\n        StreamTransferTask task = transfers.get(message.header.tableId);\n        if (task != null)\n        {\n            task.scheduleTimeout(message.header.sequenceNumber, DatabaseDescriptor.getStreamTransferTaskTimeout().toMilliseconds(), TimeUnit.MILLISECONDS);\n        }\n    }\n\n    /**\n     * Call back after receiving a stream.\n     *\n     * @param message received stream\n     */\n    public void receive(IncomingStreamMessage message)\n    {\n        if (isPreview())\n        {\n            throw new RuntimeException(String.format(\"[Stream #%s] Cannot receive files for preview session\", planId()));\n        }\n\n        long headerSize = message.stream.getSize();\n        StreamingMetrics.totalIncomingBytes.inc(headerSize);\n        metrics.incomingBytes.inc(headerSize);\n        // send back file received message\n        sendControlMessage(new ReceivedMessage(message.header.tableId, message.header.sequenceNumber)).syncUninterruptibly();\n        StreamHook.instance.reportIncomingStream(message.header.tableId, message.stream, this, message.header.sequenceNumber);\n        long receivedStartNanos = nanoTime();\n        try\n        {\n            receivers.get(message.header.tableId).received(message.stream);\n        }\n        finally\n        {\n            long latencyNanos = nanoTime() - receivedStartNanos;\n            metrics.incomingProcessTime.update(latencyNanos, TimeUnit.NANOSECONDS);\n            long latencyMs = TimeUnit.NANOSECONDS.toMillis(latencyNanos);","sourceCodeStart":1069,"sourceCodeEnd":1105,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/streaming/StreamSession.java#L1069-L1105","documentation":"Preview streaming sessions validate consistency without transferring files. StreamSession.receive() throws this RuntimeException if an IncomingStreamMessage (file data) arrives for a session marked as preview, since preview sessions must never carry data.","triggerScenarios":"Calling StreamSession.receive(IncomingStreamMessage) on a session where isPreview() is true — the peer streamed file data to a node running a preview (validation-only) session.","commonSituations":"Sender configured a real streaming session while the receiver runs a preview session (mismatched repair parameters, e.g. incremental repair with preview on one side); mixed-version clusters mishandling preview flag propagation.","solutions":["Verify both ends start the session with the same preview/for-preview flag; fix the initiating repair command (repair type mismatch).","Ensure mixed-version clusters all support and agree on preview streaming semantics.","If data transfer is intended, run a normal repair/rebuild instead of a preview session.","Check StreamResultFuture/session creation code for incorrectly set preview parents or request sessions."],"exampleFix":"// before\nsession.receive(incomingStreamMessage); // preview session -> throws\n// after\nif (!session.isPreview()) {\n    session.receive(incomingStreamMessage);\n} else {\n    logger.warn(\"Rejecting file data for preview session {}\", session.planId());\n}","handlingStrategy":"validation","validationCode":"if (session.isPreview()) { /* refuse to send IncomingStreamMessage */ }","typeGuard":null,"tryCatchPattern":"try { session.receive(msg); } catch (RuntimeException e) { if (e.getMessage().contains(\"preview session\")) { logger.warn(\"Data for preview session, aborting\"); session.closeSession(State.Type.FAILED); } else { throw e; } }","preventionTips":["Ensure preview/for-preview flags propagate identically to all endpoints.","Run a normal repair when data transfer is expected.","Keep node versions consistent for preview semantics."],"tags":["streaming","preview","repair","protocol-violation"],"backgroundTag":"unsupported-operation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}