[RELEASE] ScyllaDB 2026.1.14

The ScyllaDB team is pleased to announce the release of ScyllaDB 2026.1.14, a production-ready patch release for ScyllaDB 2026.1 Long Term Support (LTS) Release.

More information on ScyllaDB Version Support Policy is available here.

Related Links

Bug Fixes

The following issues are fixed in this release.

Compaction

  • A tablet migration could remain in the cleanup stage indefinitely when a table-wide major compaction was running on the leaving replica, which delayed decommission until it timed out with nothing logged. Compaction groups now close their gate before compactions are stopped and re-check it between views, so a stopping group no longer picks up a fresh major-compaction task after its running ones are aborted.
    scylladb#31105

  • During a paged read of a partition that spans multiple pages, the per-page compaction statistics could miscount, causing the dead-partition count in page-statistics trace output to be reported as an incorrectly large number. This only affected the accuracy of trace statistics, not query results. Partitions continued from a previous page are now counted correctly, so page statistics are accurate.
    scylladb#31240

CQL

  • Tracing a statement that bound a null element inside a collection (for example a list or set) could crash the node. A null collection element is now rendered as null in trace output, matching the JSON output behavior, so tracing such statements is safe.
    scylladb#31663

  • A SELECT that combined a tuple range restriction on clustering columns with filtering could return wrong results when those clustering columns were declared with DESC (descending) order. Without a secondary index the query returned no rows; with a secondary index it could return exactly the rows that should have been excluded. Such queries now return the correct rows regardless of the clustering order.
    scylladb#31759

  • With a prepared ALTER TABLE, CREATE MATERIALIZED VIEW, or ALTER MATERIALIZED VIEW statement, if the first execution failed, later executions of the same prepared statement skipped part of the table-property validation, allowing invalid options (such as an invalid compaction strategy) to be accepted. Property validation now runs on every execution, so invalid options are consistently rejected.
    scylladb#31458

Materialized Views (MV)

  • After a node restart, the view builder could resume building an unfinished materialized view without first flushing its base table, on the assumption that the flush had already happened. When that assumption did not hold, some view updates could be missed, leaving the view out of sync with its base table. The base table is now always flushed when the view builder resumes building an existing view, so no updates are lost.
    scylladb#31565

  • An SStable waiting to be registered for view building while its tablet was migrating away could be missed by cleanup, after which the attempt to move it to its new location retried indefinitely and could stall the migration. Such SStables are now cleaned up correctly, so the migration is no longer blocked.
    scylladb#31670

Networking

  • An RPC stream connection could still be sent on after it had started closing, which could disrupt the connection. Such a connection is no longer used for sending once its close has begun.
    scylladb#31468

Raft

  • A coordinator that lost leadership mid-operation could still complete a TRUNCATE or SNAPSHOT, in rare cases using state belonging to a different, later operation. This could let a replica execute a request that had already been finalized elsewhere, risking data loss. Such operations are now safely aborted when the coordinator is no longer valid, preventing this.
    scylladb#31244

Repair

  • A user-requested repair over a token range that spanned several vnode ranges with different replica sets was only repaired against the replicas of the range’s last part, so replicas owning earlier parts of the range were left out. The repair was still recorded as complete in system.repair_history, which could allow repair-based tombstone garbage collection (tombstone_gc = {'mode': 'repair'}) to proceed on nodes that had not actually been repaired, risking data resurrection. Repair now splits the requested range along replica-set boundaries and records history only for sub-ranges that were fully repaired, so tombstone GC is gated on accurate information.
    scylladb#31525

  • A long-running user-requested repair on a vnode keyspace could block a concurrent topology operation (such as a decommission) until the node running the repair was restarted. Topology operations now abort such repairs so they can proceed; the aborted repair can simply be re-run afterwards.
    scylladb#31147

  • A non-numeric value for the ranges_parallelism repair option was silently treated as 0, which caused the repair to hang forever. Invalid and out-of-range values (below 1) are now rejected immediately with a clear “bad parameter” error instead of hanging.
    scylladb#31677

Security

  • When using LDAPRoleManager, ATTACH SERVICE LEVEL could report success even though the attachment was not actually applied, so the service level had no effect and could not be found afterward. Service level attachments under LDAPRoleManager are now stored and retrieved correctly.
    scylladb#31524

Stability

  • A rare internal race in the task-management code could, in unlucky timing, cause a node to use memory that had already been freed, potentially crashing the node. The affected object is now kept alive for the duration of the operation, preventing this.
    scylladb#31353

  • During a backup, stopping the worker that deletes SStables while a deletion notification was still in flight could crash the node. Backups now wait for such notifications to finish before the worker is stopped, so this no longer happens.
    scylladb#31715

  • Reading system.clients could, for some combinations of connected clients, produce undefined ordering results because the rows were not sorted consistently. Rows are now sorted deterministically by (port, client_type), matching the table’s clustering key.
    scylladb#28844

Storage

  • A change to the object_storage_endpoints configuration became visible through the REST API slightly before it actually took effect, so a CREATE KEYSPACE issued in that brief window could see the new endpoint as available before it was fully registered. The configuration change now takes effect before it is reported as applied, closing this window.
    scylladb#31442

  • If an object storage endpoint was configured without a resolvable AWS region (no aws_region and no AWS_DEFAULT_REGION), the node could silently disable all of its object storage endpoints instead of only the misconfigured one. Each endpoint is now parsed independently: a misconfigured endpoint is rejected with a clear error naming the missing setting, while all valid endpoints keep working.
    scylladb#31526

  • Scylla Manager’s native backup could fail with no_such_column_family if the source table or keyspace was dropped between taking the snapshot and uploading it, or while the upload was still in progress, even though the backup only reads the snapshot’s on-disk files, which survive the drop. A backup already in progress now completes successfully even if the source table or keyspace is dropped mid-upload.
    scylladb#31416

  • An SStable’s Statistics.db component could be rewritten after the SStable had already been removed by a concurrent operation (for example a compaction triggered by ALTER TABLE, or a tablet handed off mid-repair), leaving behind a lone Statistics.db file. This could prevent the node from restarting, reporting that no TOC was found for the SStable. The rewrite is now skipped once the SStable has been removed, so the leftover file and failed restart no longer occur.
    scylladb#31701

  • A backup to an S3 endpoint that was throttling requests (for example under load-shedding) could exhaust its retries and fail the whole multipart upload, surfacing as a confusing “Failed to parse ETag list” error rather than indicating that the endpoint was overloaded. Backups now detect sustained throttling and briefly pause instead of adding more load, and use a longer retry backoff for throttling responses, making backups against a busy endpoint more resilient.
    scylladb#31760

  • Under commitlog pressure, particularly with large writes, a timed-out internal segment allocation could leave a commitlog segment permanently unreleasable, and repeated occurrences could eventually deadlock the commitlog. Such segments are now returned to the pool instead of being stranded, preventing the deadlock.
    scylladb#31620

Tablets

  • A storage group entering split mode created two compaction groups, each told it spanned the whole tablet range rather than only its own half, which misled partitioned_sstable_set’s classification and let sstables from a splitting group accumulate quadratically in its interval map — up to tens of millions of entries for a single compaction group in the field. Split-ready compaction groups are now given their actual post-split token ranges, matching how the tablet map itself derives and routes them.
    scylladb#31161

  • Completing a tablet split could hit an internal error when a node restarted between the topology entries that record the resize decision and the one that commits the new tablet count: on restart, the node’s replication-map update missed the case where the tablet count stayed the same but the split decision had newly appeared, so storage groups were never put into split mode and writes kept landing in the main compaction group ahead of the split’s completion. An additional branch now puts existing storage groups into split mode in that case.
    scylladb#31267

  • Migration streaming waited for a migrating tablet’s compaction group to finish splitting before advancing, serializing on the same per-shard split-compaction queue as every other pending split and holding a streaming slot for as long as that wait took. This wait is no longer necessary, since split-on-attach, split mode allocation, and the split monitor already keep incoming and in-progress writes routed to the correct split-ready groups independently.
    scylladb#31116

  • Altering a keyspace to use rack_list replication when the target rack had no available nodes (for example, all stopped and excluded) caused the RF change request to livelock, repeatedly pausing and resuming without making progress. The request now checks that every target rack has at least one available node before proceeding, and fails with an error returned to the client if not.
    scylladb#29461

  • A table that grew large enough to need many more tablets could be left with too few, because tablet count was only ever increased up to double the current count at a time. In particular, once several tables shared a shard’s tablet budget, an oversized table could stay pinned at its current tablet count instead of splitting further. Tablet count now scales to the table’s actual size-based need, so large tables split as expected.
    scylladb#31657

  • Running compaction while a tablet merge was in progress could fail with an “Unable to remove input SSTable” error and abort. This case is now handled correctly, so compaction and tablet merges can run concurrently without aborting.
    scylladb#31595