8 hours ago
zuul

v3.6.5

What's Changed

Full Changelog: https://github.com/Netflix/zuul/compare/v3.6.4...v3.6.5

17 hours ago
questdb

9.4.0

QuestDB 9.4.0

QuestDB 9.4.0 introduces a compact, high-performance posting and covering index for SYMBOL columns, a local parquet metadata sidecar that unlocks row-group pruning, parallelised SAMPLE BY FILL with new cross-column FILL(PREV) syntax, three new window functions, and sparkline() / bar() text visualisations. It also delivers meaningful GROUP BY / hash-join speed-ups and fixes a number of correctness issues across the SQL planner, the WAL apply path, and the PGWire protocol.

For any questions or feedback, please join us on Slack or on Discourse.

See also our prettier release notes page.

Highlights

Posting and covering index for SYMBOL columns

A new INDEX TYPE POSTING for SYMBOL columns delivers ~13x smaller index files and 1.3-1.5x faster lookups vs. the BITMAP index, at a ~9% write-amplification cost. An optional INCLUDE (...) list builds a covering sidecar so queries that read only the indexed column plus the included columns skip the column files entirely:

CREATE TABLE trades (
    ts TIMESTAMP,
    sym SYMBOL INDEX TYPE POSTING INCLUDE (price, qty),
    price DOUBLE,
    qty INT
) TIMESTAMP(ts) PARTITION BY DAY;

ALTER TABLE trades
    ALTER COLUMN sym ADD INDEX TYPE POSTING INCLUDE (price, qty);

Supported query shapes that benefit from the covering path include WHERE sym = 'X', WHERE sym IN (...), LATEST ON ts PARTITION BY sym, and SELECT DISTINCT sym. Covering data is ALP-compressed for FLOAT/DOUBLE, FoR bit-packed for integer types, and FSST-compressed for STRING/VARCHAR. Native AVX2 decoding fast paths kick in for common bit-widths.

A few practical notes:

  • ⚠️ Drop the posting index before rolling back to an older QuestDB version. Pre-9.4.0 binaries do not recognise the new index type in column metadata and will refuse to open a table that has a posting index. If you need to downgrade, run ALTER TABLE <t> ALTER COLUMN <sym> DROP INDEX on every posting-indexed column first.
  • High-cardinality SYMBOL columns benefit most — hundreds to thousands of distinct values on wide tables where the win from skipping full column files is largest.
  • The designated timestamp is auto-appended to INCLUDE when you supply an INCLUDE clause, so SHOW CREATE TABLE renders INCLUDE (price, qty) back as INCLUDE (price, qty, ts). Controlled by cairo.posting.index.auto.include.timestamp (default true).
  • Verify the covering path with EXPLAIN — the plan shows CoveringIndex on: sym with: ..., with op: latest for LATEST ON queries and op: distinct for SELECT DISTINCT. SHOW COLUMNS and table_columns() also expose new indexType and indexInclude fields.
  • Async GROUP BY and filter paths through the covering index are currently slower than the regular plan in some workloads. A follow-up release will close this gap. If EXPLAIN shows a query picking the covering path and you see a regression, opt that query out with /*+ no_covering */ (or /*+ no_index */ to disable indexing entirely) until the optimisations land.

See the posting index and covering index documentation for the full feature reference, encoding variants (POSTING DELTA / POSTING EF, both for benchmarking), and storage layout details. by @bluestreak01 in #6861

Local parquet metadata sidecar

Each parquet partition now ships with a compact binary _pm sidecar that stores column descriptors, per-row-group byte ranges, encodings and min/max statistics. The query planner reads pruning information from _pm without ever opening data.parquet, which is a prerequisite for efficient cold-storage scans. A migration (Mig940) generates _pm files for all existing parquet partitions on engine upgrade. by @RaphDal in #6913

Cross-column FILL(PREV) and parallel SAMPLE BY FILL

Imagine a stream of FX quotes where you want one-minute bars of average bid and ask. On quiet minutes you want both prices to show the last known ask — not the last bid for bid_price and the last ask for ask_price, which is what FILL(PREV, PREV) would give you. Before 9.4.0 that meant dropping down to a CTE with last_value(...) IGNORE NULLS OVER (...) and a coalesce per column. Now it is a one-liner:

SELECT timestamp, symbol,
       avg(bid_price) AS bid_price,
       avg(ask_price) AS ask_price
FROM core_price
WHERE symbol = 'EURUSD' AND timestamp IN '$today'
SAMPLE BY 100T FILL(PREV(ask_price), PREV);

FILL(PREV(col_ref)) carries the previous value of another aggregate column by alias. The reference must match the target column's type, cannot be broadcast across aggregates, and is rejected when either side is a SYMBOL. FILL(NULL), FILL(<constant>), and bare FILL(PREV) can be mixed freely in the same per-aggregate fill list.

At the same time, SAMPLE BY FILL(NULL | <constant> | PREV) moves from the sequential cursor path onto QuestDB's parallel GROUP BY path. Read-side wins compound for keyed queries on wide tables and for queries with FROM/TO boundaries — keyed FROM-TO with constant bounds is also now supported natively, removing the previous cookbook workaround.

Other fixes that ride along:

  • Sub-day SAMPLE BY with TIME ZONE and FROM/TO no longer misaligns the fill grid by the timezone offset.
  • ALIGN TO CALENDAR WITH OFFSET combined with FILL no longer falls into an infinite fill loop.
  • SAMPLE BY FILL now works on tables with pre-1970 timestamps.

FILL(LINEAR) and ALIGN TO FIRST OBSERVATION continue to use the cursor path. See the SAMPLE BY FILL options and the Fill from one column cookbook recipe. by @jovfer in #6946

New window functions

  • ntile(n) — distributes rows of an ordered partition into n approximately equal buckets.
  • cume_dist() — cumulative distribution of the current row within its partition.
  • nth_value(expr, n) — the n-th value within the current frame; supports DOUBLE, LONG, and TIMESTAMP arguments. Works with ROWS and RANGE frames.

All three honour PARTITION BY and ORDER BY. by @jovfer in #6925 and #7037

Text visualisations: sparkline() and bar()

Two new functions render numeric data as Unicode glyphs directly in SQL output:

SELECT symbol, sparkline(price) FROM trades SAMPLE BY 1m;
-- ▁▂▄▆█▇▅▃▂▁

SELECT symbol, bar(volume, 0, max(volume) OVER ()) FROM daily_volumes;
-- ▊▋▌▍▎▏

sparkline() is an aggregate that renders a trend line with auto-scaling, clamping and width control. bar() is a scalar that renders a single value as a horizontal bar with eight levels of sub-character precision. Both return VARCHAR and work across all clients. by @javier in #6975

Configurable parquet encodings on export

PARQUET_ENCODING(...) now propagates through projected streaming parquet exports — COPY (SELECT ...) TO ... WITH format parquet and /exp?query=... preserve the configured encoding instead of silently reverting to defaults for pass-through columns. by @RaphDal in #6949

Performance

  • Parallel keyed GROUP BY: batched aggregate dispatch eliminates per-row virtual calls on the reducer, with up to ~4.6x speed-up on single-column count() over fixed-size keys and 1.4-1.8x on multi-aggregate GROUP BY queries. Also fixes a pre-existing data-correctness bug in count(uuid) for UUIDs whose high half equals Long.MIN_VALUE. by @puzpuzpuz in #6959
  • GROUP BY, hash joins and count_distinct: a faster xxh3-derived hash finalizer and denser hash tables shave ~15-25% off many GROUP BY queries and improve worst-case probe behaviour by orders of magnitude on adversarial inputs. ClickBench total time improves by ~1.2% across 43 queries. by @puzpuzpuz in #6997
  • Parallel top-K with SELECT projections: ORDER BY ... LIMIT N now uses the parallel top-K path even when a column projection (duplicate columns, computed columns) sits between the limit and the filtered scan. by @DHRUV6029 in #6993
  • Timestamp equality filters: comparing a TIMESTAMP column against a string bind variable (or any runtime constant) no longer re-parses the value on every row. EXPLAIN plans may show the equality arguments swapped. by @jerrinot in #6986
  • Lateral join decorrelation: shared sub-query computations now execute once instead of being cloned per correlated reference, by introducing a shared-cursor framework that GROUP BY factories also use. by @kafka1991 in #6941

Web Console

  • Create materialized view from the table menu: a new context-menu action on tables and existing materialized views generates a starter CREATE MATERIALIZED VIEW statement and drops it into the editor. From a base table the generator infers REFRESH IMMEDIATE, SAMPLE BY, PARTITION BY and TTL per QuestDB's default rules, and picks sum/last aggregates by column-name pattern. From an existing materialized view it produces a downsample one rung up the SAMPLE BY ladder, re-roots WITH BASE at the source view, rewrites aggregates against the layer-1 aliases, and steps TTL up to match. Disabled on non-WAL tables and tables without a designated timestamp. in questdb/ui#557

  • Context-aware SQL autocompletion: function suggestions now filter by grammar context, so the popup stops dumping the full function list at every identifier position. Examples:

    • SELECT * FROM trades WHERE price = c| previously mixed scalars and aggregates (coalesce, count, count_distinct, corr, covar_*, ...) and now suggests scalars only (coalesce, concat, cos, ceil).
    • SELECT * FROM trades ASOF JOIN m| shrinks from 332 mixed entries to the three actual join targets (materialized_views, memory_metrics, table_writer_metrics).
    • INSERT INTO trades VALUES (n| previously offered nothing; now suggests now, now_ns, nullif, nanos, netmask.

    Statement-start suggestions also include implicit-SELECT targets, and the editor no longer hangs on a trailing comma in the SELECT list. in questdb/ui#556

Bug fixes

SQL planner and execution

  • Fixed window functions nested inside GROUP BY expressions producing wrong results — e.g. avg(x) - avg(x) OVER () combined with GROUP BY. Such shapes are now rejected at compile time with a clear error rather than computing silently incorrect output. by @jovfer in #6943
  • Fixed nested window inside aggregate with explicit GROUP BY (max(avg(x) OVER ()) patterns). by @jovfer in #6955
  • Fixed EMA, VWEMA and KSUM failures when combined with other window functions in the same query. by @jerrinot in #7030
  • Fixed WINDOW JOIN crash when the master side projects a symbol column. by @puzpuzpuz in #7098
  • Fixed wrong results from the JIT filter when UUID bind variables are involved. by @nwoolmer in #7049
  • Fixed BETWEEN evaluation inside sub-expressions (e.g. when it appears as an operand of a larger boolean expression). by @brunocalza in #7044
  • Fixed silent drop of outer-join predicates of the form y.a = y.b (both sides on the slave); fixed NOT rewriting in UNION ALL queries that previously only descended into the left side; isolated parser state to allow concurrent SqlParser instances. by @bluestreak01 in #7027
  • Fixed empty LIMIT inside a DECLARE sub-query. by @jerrinot in #6979
  • Fixed crash on SELECT-CHOOSE with an explicit timestamp clause combined with a column rename. by @bluestreak01 in #6987
  • Fixed ASOF/LT joins losing the timestamp shift when the slave subquery already shifts its timestamp. by @jerrinot in #6981
  • Fixed arg_max / arg_min returning the wrong precision when the timestamp argument is a TIMESTAMP_NS column. by @bluestreak01 in #7078
  • Fixed SAMPLE BY bucket timestamp after a DST-skipped day. by @bluestreak01 in #6988

Storage and WAL

  • Fixed a rare WAL apply live-lock when transactions are committed at a very high rate. by @ideoma in #7064
  • Fixed a race between WAL writer open and the table-drop purge. by @kafka1991 in #7090
  • Fixed a server-main error on a WAL table rename race. by @jerrinot in #7046
  • Fixed incorrect write amplification and dedup counts reported by tables(). by @nwoolmer in #7047
  • Avoided a redundant bitmap-index rollback after a WAL O3 append. by @jerrinot in #6971

Protocols

  • Fixed memory corruption from malformed PGWire messages. by @bluestreak01 in #6983
  • Fixed partial query result when re-binding a suspended portal in PGWire. by @RaphDal in #7066
  • Fixed JSON-escaping of CHAR column values in /exec and /query responses. by @jerrinot in #7106

Changelist

  • feat(core): add compact, high-performance posting index for symbol columns by @bluestreak01 in #6861
  • feat(core): add local parquet metadata sidecar file for optimized query planning by @RaphDal in #6913
  • feat(sql): add cross-column FILL(PREV) and parallelise SAMPLE BY FILL by @jovfer in #6946
  • feat(sql): add ntile, cume_dist, and nth_value window functions by @jovfer in #6925
  • feat(sql): add nth_value support for LONG and TIMESTAMP arguments by @jovfer in #7037
  • feat(sql): add sparkline() and bar() text visualization functions by @javier in #6975
  • feat(sql): add configurable encodings on parquet export by @RaphDal in #6949
  • perf(sql): speed up parallel keyed GROUP BY queries by introducing batch calls by @puzpuzpuz in #6959
  • perf(sql): speed up GROUP BY, hash joins, and count_distinct with a faster hash finalizer by @puzpuzpuz in #6997
  • perf(sql): apply parallel top-K to queries with SELECT projections by @DHRUV6029 in #6993
  • perf(sql): cache operands in timestamp equality filters by @jerrinot in #6986
  • perf(sql): share repeated computations in lateral join decorrelation by @kafka1991 in #6941
  • fix(core): avoid redundant bitmap index rollback after WAL O3 append by @jerrinot in #6971
  • fix(sql): report empty LIMIT in DECLARE subquery by @jerrinot in #6979
  • fix(sql): preserve shifted timestamps for ASOF/LT joins by @jerrinot in #6981
  • fix(sql): fix crash on select-choose with explicit timestamp and column rename by @bluestreak01 in #6987
  • fix(sql): fix SAMPLE BY DST bucket timestamp after a skipped day by @bluestreak01 in #6988
  • fix(pgwire): fix memory corruption from malformed wire messages by @bluestreak01 in #6983
  • fix(sql): fix window functions nested inside GROUP BY expressions producing wrong results by @jovfer in #6943
  • fix(sql): fix nested window inside aggregate with explicit GROUP BY by @jovfer in #6955
  • fix(core): avoid server-main error on WAL table rename race by @jerrinot in #7046
  • fix(sql): between and inside sub-expression by @brunocalza in #7044
  • fix(sql): fix wrong results from JIT filter with UUID bind variables by @nwoolmer in #7049
  • fix(sql): preserve outer-join predicates, fix NOT in UNION, isolate parser state by @bluestreak01 in #7027
  • fix(sql): fix EMA, VWEMA and KSUM failures in combined window queries by @jerrinot in #7030
  • fix(wal): correct write amplification and dedup counts in tables() by @nwoolmer in #7047
  • fix(pgwire): fix partial query result when re-binding a suspended portal by @RaphDal in #7066
  • fix(sql): return correct precision from arg_max/arg_min on TIMESTAMP_NS columns by @bluestreak01 in #7078
  • fix(core): fix rare WAL apply live lock when transactions are committed at a very high rate by @ideoma in #7064
  • fix(core): fix race between WAL writer open and table drop purge by @kafka1991 in #7090
  • fix(sql): WINDOW JOIN crash when master projects a symbol column by @puzpuzpuz in #7098
  • fix(http): JSON-escape CHAR column values in /exec and /query responses by @jerrinot in #7106

Full Changelog: 9.3.5...9.4.0

22 hours ago
MeiliSearch

v1.44.0

Meilisearch v1.44.0 adds remote federated facet search, indexing performance improvements, and other improvements and bugfixes. It also contains a couple of breaking changes, detailed below.

Breaking changes

  • When using the network experimental feature, with sharding enabled (leader is not null in the network configuration), POST /indexes/{indexUid}/facet-search calls now default to a remote federated facet search, fetching and merging results from all shards in the network.
  • The timeout for calling an external REST embedder at search time is now tied to the searchCutOffMs defined in the index, rather than fixed.

🌈 Improvements

Remote facet search

Meilisearch now has the ability to search across all shards of a network during facet search via the existing dedicated facet search route.

  • If you are using the network experimental feature and have a leader defined for your network, remote calls are now the default for calls to POST /indexes/{indexUid}/facet-search
  • The behavior can be controlled explicitly via the new useNetwork parameter of the facet search object.

By @dureuill in https://github.com/meilisearch/meilisearch/pull/6375

Reduce memory usage of the indexing

Reduces allocated memory when computing prefixes and speeds up some operations to avoid unnecessary deserialization.

If you still see high memory usage while the engine is post-processing, we recommend using the --experimental-reduce-indexing-memory-usage option.

By @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6334

Improve GeoJSON indexing performance

This PR upgrades the cellulite library to a version that includes a GeoJSON indexing optimization. With this change, GeoJSON indexing avoids reprocessing documents that were already indexed in dense cells, and only handles newly added documents incrementally as they descend through the recursive cell tree.

By @YoEight in https://github.com/meilisearch/meilisearch/pull/6374

Human-formatted sizes and detailed DB sizes in stats

Adds two new query parameters to GET /indexes/{indexUid}/stats and GET /stats:

  • showInternalDatabaseSizes: boolean, optional, defaults to false. When present, the index stat objects in responses of the stat routes now contain an additional internalDatabaseSizes key, whose value is a dictionary of the internal database names and their current size in the index, like in the stats object of a batch.
  • sizeFormat: human or raw: optional, defaults to raw. When present and set to human, then all database sizes in responses of the stat routes will be returned as a string containing an appropriate unit (MiB, GiB, etc). When missing or set to raw, then the current behavior of expressing the size in bytes as a number is retained.

Note for integrations: The keys in internalDatabaseSizes are subject to change and should not be exposed as a strongly typed object. This is the same as the existing internalDatabaseSizes in batch stats.

Adding showInternalDatabaseSizes to an index stats

// curl -X GET "http://localhost:7700/indexes/movies/stats?showInternalDatabaseSizes=true"
{
  "numberOfDocuments": 31944,
  "rawDocumentDbSize": 20594688,
  "avgDocumentSize": 636,
  "isIndexing": false,
  "internalDatabaseSizes": {
    "wordPairProximityDocids": 100827136,
    "documents": 20594688,
    "wordPositionDocids": 18694144,
    "wordFidDocids": 10715136,
    "wordPrefixPositionDocids": 10256384,
    "wordDocids": 9453568,
    "wordPrefixFidDocids": 4603904,
    "wordPrefixDocids": 3424256,
    "main": 1425408,
    "externalDocumentsIds": 999424,
    "fieldIdWordCountDocids": 245760,
    "exactWordPrefixDocids": 16384,
    "celluliteMetadata": 16384
  },
  "numberOfEmbeddings": 0,
  "numberOfEmbeddedDocuments": 0,
  "fieldDistribution": {
    "genres": 31944,
    "id": 31944,
    "overview": 31944,
    "poster": 31944,
    "release_date": 31944,
    "title": 31944
  }
}

Adding showInternalDatabaseSizes and sizeFormat=human to global stats

// curl -X GET "http://localhost:7700/stats?showInternalDatabaseSizes=true&sizeFormat=human"
{
  "databaseSize": "351.38 MiB",
  "usedDatabaseSize": "350.64 MiB",
  "lastUpdate": "2026-04-16T13:07:02.74243Z",
  "indexes": {
    "comics": {
      "numberOfDocuments": 31944,
      "rawDocumentDbSize": "23.14 MiB",
      "avgDocumentSize": "751 B",
      "isIndexing": false,
      "internalDatabaseSizes": {
        "wordPairProximityDocids": "98.06 MiB",
        "documents": "23.14 MiB",
        "wordPositionDocids": "17.22 MiB",
        "wordFidDocids": "10.36 MiB",
        "wordPrefixPositionDocids": "9.47 MiB",
        "wordDocids": "8.97 MiB",
        "wordPrefixFidDocids": "4.36 MiB",
        "wordPrefixDocids": "3.27 MiB",
        "main": "1.36 MiB",
        "externalDocumentsIds": "944 KiB",
        "fieldIdWordCountDocids": "240 KiB",
        "exactWordPrefixDocids": "16 KiB",
        "celluliteMetadata": "16 KiB"
      },
      "numberOfEmbeddings": 0,
      "numberOfEmbeddedDocuments": 0,
      "fieldDistribution": {
        "genres": 31944,
        "id": 31944,
        "overview": 31944,
        "poster": 31944,
        "release_date": 31944,
        "title": 31944
      }
    },
    "movies": {
      "numberOfDocuments": 31944,
      "rawDocumentDbSize": "19.64 MiB",
      "avgDocumentSize": "636 B",
      "isIndexing": false,
      "internalDatabaseSizes": {
        "wordPairProximityDocids": "96.16 MiB",
        "documents": "19.64 MiB",
        "wordPositionDocids": "17.83 MiB",
        "wordFidDocids": "10.22 MiB",
        "wordPrefixPositionDocids": "9.78 MiB",
        "wordDocids": "9.02 MiB",
        "wordPrefixFidDocids": "4.39 MiB",
        "wordPrefixDocids": "3.27 MiB",
        "main": "1.36 MiB",
        "externalDocumentsIds": "976 KiB",
        "fieldIdWordCountDocids": "240 KiB",
        "exactWordPrefixDocids": "16 KiB",
        "celluliteMetadata": "16 KiB"
      },
      "numberOfEmbeddings": 0,
      "numberOfEmbeddedDocuments": 0,
      "fieldDistribution": {
        "genres": 31944,
        "id": 31944,
        "overview": 31944,
        "poster": 31944,
        "release_date": 31944,
        "title": 31944
      }
    }
  }
}

The call without any parameters is the same as in previous versions.

// curl -X GET "http://localhost:7700/stats"
{
  "databaseSize": 368443392,
  "usedDatabaseSize": 367673344,
  "lastUpdate": "2026-04-16T13:07:02.74243Z",
  "indexes": {
    "comics": {
      "numberOfDocuments": 31944,
      "rawDocumentDbSize": 24264704,
      "avgDocumentSize": 751,
      "isIndexing": false,
      "numberOfEmbeddings": 0,
      "numberOfEmbeddedDocuments": 0,
      "fieldDistribution": {
        "genres": 31944,
        "id": 31944,
        "overview": 31944,
        "poster": 31944,
        "release_date": 31944,
        "title": 31944
      }
    },
    "movies": {
      "numberOfDocuments": 31944,
      "rawDocumentDbSize": 20594688,
      "avgDocumentSize": 636,
      "isIndexing": false,
      "numberOfEmbeddings": 0,
      "numberOfEmbeddedDocuments": 0,
      "fieldDistribution": {
        "genres": 31944,
        "id": 31944,
        "overview": 31944,
        "poster": 31944,
        "release_date": 31944,
        "title": 31944
      }
    }
  }
}

By @dureuill in https://github.com/meilisearch/meilisearch/pull/6338

🦋 Fixes

🔩 Miscellaneous changes

New Contributors

Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.43.1...v1.44.0

23 hours ago
seaweedfs

4.26

What's Changed

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.25...4.26

3 days ago
cas

v7.3.7

⭐ Release Notes

👫 Contributions

Special thanks to the following individuals for their excellent contributions:

  • @mmoayyed
  • @leleuj
4 days ago
seaweedfs

4.25

Note

This is a quick follow up for 4.24. It is safe to upgrade.

  • The erasure coding with multi-disk servers needs to recover automatically from previous failures.
  • The added security checking caused Admin UI not working well. Users with security.toml configured may get into this.

What's Changed

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.24...4.25

4 days ago
redis

8.8-RC1

This is the first Release Candidate of Redis 8.8 in Redis Open Source.

Release Candidates are feature-complete pre-releases. Pre-releases are not suitable for production use.

Headlines:

Redis 8.8 introduces new features and performance improvements.

Operating systems we test Redis 8.8 on

  • Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), 26.04 (Resolute Raccoon)
  • Rocky Linux 8.10, 9.7, 10.1
  • AlmaLinux 8.10, 9.7, 10.1
  • Debian 12.13 (Bookworm), Debian 13.4 (Trixie)
  • Alpine 3.23
  • macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), 26.3 (Tahoe) - for both Intel and ARM

Security fixes (compared to 8.8-M03)

  • (CVE-2026-23479) Use-After-Free in unblock client flow may lead to Remote Code Execution.
  • (CVE-2026-25243) Invalid memory access in RESTORE may lead to Remote Code Execution
  • (CVE-2026-23631) Lua Use-After-Free may lead to remote code execution
  • (CVE-2026-25588) Invalid memory access in RESTORE may lead to Remote Code Execution (Time Series)
  • (CVE-2026-25589) Invalid memory access in RESTORE may lead to Remote Code Execution (Probabilistic)

New Features (compared to 8.8-M03)

  • #15162 New data structure: Array (@antirez)
  • #15045 INCREX: a window counter rate limiter combining INCR,INCRBY,INCRBYFLOAT, bounds, and expiration (@raffertyyu + Redis team)
  • In group sorting new reducer, allowing unwind grouped documents (after GROUPBY) and sort them

Removed Features (compared to 8.8-M03)

  • #15191 Remove GCRA rate limiter

Bug fixes (compared to 8.8-M03)

  • SUBSCRIBE, PSUBSCRIBE, SSUBSCRIBE: crash on OOM (RED-167788)
  • CONFIG SET: some settings allow invalid characters (RED-167787)
  • SCRIPT DEBUG: potential crash on scripts (RED-175507)
  • VADD: crash or buffer overflow on large REDUCE value (RED-170921)
  • VSET: crash on huge allocations (MOD-12678)
  • #15188 cluster-announce-ip rejecting hostnames (regression)
  • #15095 Double free when loading streams with duplicate consumer PEL entries
  • #15124 Issues processing corrupt Streams RDB data
  • #15111 fast_float_strtod rounding mismatch
  • #15190 vecClear reset the logical size without releasing element ownership
  • #15163 MULTI queue memory incorrect memory accounting
  • #15094 Cluster crash when CLIENT KILL unsubscribes SSUBSCRIBE client inside EXEC
  • #15151 Listpack backlength encoding thresholds off-by-one
  • #15115 Under-copy in the Lua debugger
  • #14970 Sentinel config injection via SENTINEL SET
  • #14934 Client output buffer memory tracking not accounting for copy-avoided bulk string references
  • RediSearch/RediSearch#9182 FT.PROFILE HYBRID returns an empty reply (MOD-14778)
  • RediSearch/RediSearch#9079 FT.SPELLCHECK treats PARAMS placeholders as literal terms instead of resolving them (MOD-10596)
  • RediSearch/RediSearch#9047 FT.PROFILE output is inconsistent when a profiled value is missing (MOD-10560)
  • RediSearch/RediSearch#9078 FT.CREATE now rejects schema definitions with invalid option combinations at creation time (MOD-14655)
  • RediSearch/RediSearch#9012 PERSIST and HPERSIST notifications are not reflected in index expiration tracking (MOD-14800)
  • RediSearch/RediSearch#9066 Race condition in FT.HYBRID causes intermittent failures under concurrent hybrid query load (MOD-14732)
  • RediSearch/RediSearch#9163 Crash on FT.SEARCH when topology validation fails (for example, some nodes unreachable) (MOD-14475)
  • RediSearch/RediSearch#9031, RediSearch/RediSearch#9473 Coordinator deadlock under mixed FT.SEARCH and FT.AGGREGATE load (MOD-14268)
  • RediSearch/RediSearch#9028 Memory leak when FT.DROPINDEX runs concurrently with in-flight hybrid queries (MOD-14135)
  • RediSearch/RediSearch#9310, RediSearch/RediSearch#9350 FT.CURSOR READ timeout and ON_TIMEOUT FAIL not enforced on coordinator and shard (MOD-14284, MOD-14998)
  • RediSearch/RediSearch#9425 Cursors not cleaned up after MAXIDLE, causing resource exhaustion (MOD-6430)
  • RediSearch/RediSearch#9234, RediSearch/RediSearch#9404 Coordinator RETURN_STRICT returns wrong data on partial results, including SORTBY pipeline (MOD-13617)
  • RediSearch/RediSearch#9382 MAXPREFIXEXPANSION warnings not propagated to clients in cluster mode (MOD-13804)
  • RediSearch/RediSearch#9218 Search commands fail when no worker thread is available instead of falling back to main thread (MOD-14921)
  • RediSearch/RediSearch#9448 RDB load missing validation of FT.CREATE arguments, allowing corrupt index state on load (MOD-13118)
  • RediSearch/RediSearch#9377 Use-after-move in Indexer_Process causes crash during indexing (MOD-14980)
  • RediSearch/RediSearch#9408 Deadlock between background query and main-thread writer (MOD-15364)
  • RediSearch/RediSearch#9114 FT.PROFILE prints output using wrong iterator type (MOD-14678)
  • RediSearch/RediSearch#9421 Confusing error returned when DEBUG_PARAMS_COUNT is zero (MOD-15118)
  • RediSearch/RediSearch#9045 Stack-smashing error in coordinator code path (MOD-14649)
  • RedisJSON/RedisJSON#1554 Trailing chars are ignored (MOD-7266); Fixes RedisJSON/RedisJSON#976
  • RedisJSON/RedisJSON#1543 Wrong mutation ordering for array commands with recursive paths (MOD-6722)
  • RedisJSON/RedisJSON#1542 JSONPath evaluation issues (MOD-14664); Fixes RedisJSON/RedisJSON#968 (MOD-7264), RedisJSON/RedisJSON#962 (MOD-7272), RedisJSON/RedisJSON#963 (MOD-7270), RedisJSON/RedisJSON#1089 (MOD-7268)
  • RedisTimeSeries/RedisTimeSeries#2003 Potential crash on disconnections and TLS failures (MOD-14850)
  • RedisTimeSeries/RedisTimeSeries#2013 count, countNaN, countAll reducers return NaN when all values are NaN (MOD-14420)

Performance and resource utilization improvements (compared to 8.8-M03)

  • #15049 Hyperloglog: 4 independent accumulators that are merged at the end
  • #15133 Batched prefetch for MGET and MSET
  • #14988 Batched prefetch for HGETALL on hashtable-encoded hashes
  • #15071 Pass size hint to jemalloc for faster deallocation
  • #15096 Reduces allocator and accounting overhead by adding compile-time jemalloc tuning
  • RediSearch/RediSearch#9197 Vector index hot path (HNSW and brute-force) devirtualized, reducing per-query latency (MOD-14916)
  • RediSearch/RediSearch#9262, RediSearch/RediSearch#9476 Inline LSE atomics enabled on AArch64, improving atomic operation throughput on ARM64 (MOD-14916, MOD-15419)
  • RediSearch/RediSearch#9293 Expiration handling overhead reduced when many keys expire simultaneously (MOD-14916)
  • RediSearch/RediSearch#9017 LTO (link-time optimization) enabled for x86_64 release builds (MOD-14700)
  • RediSearch/RediSearch#8765 Shard-level timeout adjusted to coordinator dispatch time for more accurate accounting (MOD-13189)
  • RediSearch/RediSearch#8790, RediSearch/RediSearch#8900, RediSearch/RediSearch#8827, RediSearch/RediSearch#8971, RediSearch/RediSearch#8966, RediSearch/RediSearch#8762, RediSearch/RediSearch#8678, RediSearch/RediSearch#8915, RediSearch/RediSearch#8653, RediSearch/RediSearch#9085, RediSearch/RediSearch#8751, RediSearch/RediSearch#8692, RediSearch/RediSearch#9224 Iterators ported to Rust, reducing FFI overhead
  • RediSearch/RediSearch#9500 numRecords no longer updated for vector fields, removing unnecessary write overhead on ingest (MOD-15487)
  • VecSim SVS thread pool integrated with the worker pool for better thread utilization (MOD-9881)

Configuration parameters

  • #15182 Slowlog entry truncation limits:
    • slowlog-entry-max-argc: maximum number of command arguments kept in a slowlog entry
    • slowlog-entry-max-string-len: maximum length of a command argument in a slowlog entry
  • RediSearch/RediSearch#8876, RediSearch/RediSearch#8960 Default maximum worker threads value updated; MAX_WORKER_THREADS is now a string config (MOD-14486, MOD-14763)

Metrics (compared to 8.8-M03)

  • RediSearch/RediSearch#8210, RediSearch/RediSearch#8231 FT.PROFILE: added queue time tracking (MOD-13602)

CLI tools

  • #15150 Memory leak on malformed legacy help entry in redis-cli
4 days ago
orientdb

3.2.52

This patch release contain an additional fix in query engine "order by" logic with nested properties, and a fix in dates without time.

Changes

Core

  • Truncate asDate timestamps with 24-hour clock, thanks @officialasishkumar
  • Avoid to use index when using order by with nested property issue #10732
  • Dependencies updates

Artifacts

orientdb-community-3.2.52.tar.gz orientdb-community-3.2.52.zip

orientdb-tp3-3.2.52.tar.gz orientdb-tp3-3.2.52.zip

agent-3.2.52.jar

5 days ago
rustfs

1.0.0-beta.3

What's Changed

New Contributors

Full Changelog: https://github.com/rustfs/rustfs/compare/1.0.0-beta.2...1.0.0-beta.3

5 days ago
seaweedfs

4.24

Important note

4.23 is not safe when there are multiple disks configured and erasure coding(EC) is using the worker. The worker added a capability to distribute EC shards to different disks to ensure proper shard distribution. However, the volume server fails to loaded the EC shards, because the EC index could be on a different peer disk.

What's Changed

New Contributors

Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.23...4.24