Skip to content

Add Yezzey submodule to gpcontrib#1752

Draft
leborchuk wants to merge 788 commits into
apache:REL_2_STABLEfrom
leborchuk:AddYezzey
Draft

Add Yezzey submodule to gpcontrib#1752
leborchuk wants to merge 788 commits into
apache:REL_2_STABLEfrom
leborchuk:AddYezzey

Conversation

@leborchuk

Copy link
Copy Markdown
Contributor

Yezzey is an open-source extension for Apache Cloudberry and Greenplum 6 that transparently offloads Append-Only (AO/AOCO) table data to S3-compatible object storage. Inspired by Snowflake and AnyBlob, it extends the storage manager (smgr) so reads and writes go to S3 instead of local disk, keeping the user interface unchanged. A companion YProxy service acts as an I/O scheduler, managing connection pooling and request prioritization to prevent S3 throttling. Data is PGP-encrypted during upload. Benchmarks show only 10–43% query slowdown versus local storage, far outperforming PXF, making it ideal for cost-effective cold-data tiering.

The main feature of Yezzey - you don't need to change tables or code; just launch yezzey_define_offload_policy and move the data to S3. In this way, you can unload your cluster using the available disk space.

Currently, it is widely used on Greenplum 6 instances, and the goal is to provide users with the same interface in Cloudberry, so they can seamlessly migrate to Cloudberry.

We placed Yezzey as a submodule, as we believe one day we will replace all outdated solutions like AO/AOCO/Yezzey with PAX. However, that has not happened yet and we still need Yezzey.

Fixes #ISSUE_Number

What does this PR do?

Type of Change

  • Bug fix (non-breaking change)
  • New feature (non-breaking change)
  • Breaking change (fix or feature with breaking changes)
  • Documentation update

Breaking Changes

Test Plan

  • Unit tests added/updated
  • Integration tests added/updated
  • Passed make installcheck
  • Passed make -C src/test installcheck-cbdb-parallel

Impact

Performance:

User-facing changes:

Dependencies:

Checklist

Additional Context

CI Skip Instructions


Xiaoran Wang and others added 30 commits February 27, 2026 17:31
Rewrite the diskquota worker scheduler. Each DB entry manages the
running time by itself to make the scheduler more simple.
I have tested the performance, nearly the same as before.

Add a UDF db_status to help debug or monitor the diskquota, related
SQL is in test_util.sql. I didn't put it into diskquota--2.1.sql, because I
don't want users to use it now. I didn't use any shared lock when getting
that status info, so they may be not consistent.

Co-authored-by: Xing Guo <higuoxing+github@gmail.com>
Co-authored-by: Zhang Hao <hzhang2@vmware.com>
So all PRs can trigger build.
…pache#241)

Previously, users will see the information of tables in db2 when accessing db1 and executing select diskquota.show_relation_cache(). Meanwhile, if db1's bgworker can see the table in db2, the performance will be influenced, because the table size in db2 will be calculated although it is not useful for db1 diskquota.

This PR has added a judgment to prevent this situation.
When diskquota is in dynamic mode, it may take a long time to start a worker for a database (because the worker is busy), so some tests will fail after pg_sleep.

Add the diskquota_test extension to resolve the issue. In it, there is a UDF diskquota_test.wait(SQL test), which we can run by passing any SQL whose select result is true or false to it, it runs the SQL and waits for the selection result to be true at most 10 seconds. diskquota_test.db_status will return all the databases which are monitored by diskquota and their status and epoch. diskquota_test.cur_db_status() and diskquota_test.db_status() are just wrappers of it, which are more useful in the tests.

In the regress tests, replace the sleep with diskquota_test.wait or diskquota.wait_for_worker_new_epoch().

What's more, I have extracted the monitored_dbid_cache related data and functions into the monitored_db.c file.
Disable the regress test test_init_table_size_table, there is a bug making it fail, I will fix it in another pr.
Co-authored-by: Xiaoran Wang <wxiaoran@vmware.com>
* Change the max value of diskquota.max_workers to 20

If we set the diskquota.max_workers max value to be
max_worker_processes, when max_worker_processes is less than 10 and we
set diskquota.max_workers value more than max_worker_processes, the
cluster will crash.

Set the max value to be 20, when the max_worker_processes is less than the
diskquota.max_workers, diskquota can work, only some parts of the
databases can not be monitored as diskquota can not start bgworkers for
them.

* Modify diskquota worker schedule test

Test when diskquota.max_workers more than available bgworker.

Co-authored-by: Zhang Hao <hzhang2@vmware.com>
Co-authored-by: Zhang Hao <hzhang2@vmware.com>
…e#266)

Change the default vaule of `diskquota.max_active_tables` from 1M
to 300K, the memory usage relevant it is reduced from 300MB to 90MB.
Refactor the structure of TableSizeEntry to reduce memory usage.

Previously, the size of each table in each segment should be maintained in TableSizeEntry, which wastes lots of memory. In this PR, we refactor the TableSizeEntry to:

struct TableSizeEntry
{
	Oid    reloid;
	int    segid;
	Oid    tablespaceoid;
	Oid    namespaceoid;
	Oid    owneroid;
	uint32 flag;
	int64 totalsize[SEGMENT_SIZE_ARRAY_LENGTH];
};
In this way, we can maintain multiple sizes in one TableSizeEntry and efficiently save memory usage.

For 50 segments: reduced by 65%.
For 100 segments: reduced by 82.5%.
For 101 segments: reduced by 65.3%.
For 1000 segments: reduced by 82.5%.
There is a bug: removing TableSizeEntry from table_size_map by oid.
Actually, the hash map key is TableKeyEntry. Fix it.
The apache#264 caused some segment ratio tests fail. The entry's relevant
fields need to be set at the end of the iteration. Otherwise, only the
first seg will pass the condition check.
Use diskquota.max_table_segments to define the max number of table segments in
the cluster. The value equal (segment_number + 1) * max_table_number.

Since hashmap in the shared memory can take over others' memory space
even when it exceeds the limit, a counter is added to count how many tables
have been added to the table_size_map, to prevent too many entries to be
created.

Co-authored-by: Xiaoran Wang <wxiaoran@vmware.com>
Co-authored-by: Chen Mulong <chenmulong@gmail.com>
Avoid dispatching reject map to segments when it is not changed
…pache#279)

This commit fixed two bugs:
- Previously, refresh_rejectmap() cleared all entries in rejectmap, including other databases' entries, which causes hardlimit can not to work correctly.
- soft-limit rejectmap entries should not be added into disk_quota_reject_map on segments, otherwise, these entries may remain in segments and trigger the soft-limit incorrectly.

Co-authored-by: Chen Mulong <chenmulong@gmail.com>
When a database's diskquota bgworker is killed and the db is dropped,
diskquota scheduler can not work properly. The cause is: if the scheduler
failed to start a bgworker for a database, it will try it again and
again forever.

A different status code is returned when failing to start bg worker. And if it is
failed due to the dropped database (or another other reasons causes
db name cannot be retrieved from db id), just skip this bgwoker for now
For other failure reasons, limit the times of starting a bgworker for a database
to 3 times. If the limit is reached, skip it and pick the next one.
- Drop the table space before rm directory.
- '-f' to alway force rm.
- '-- start-ignore' doesn't seem to be working with retcode since retcode
  will add '-- start/stop-ignore' pair automatically to ignore the
  output, and the nested start/stop ignore doesn't seem to be handled
  well by the ancient perl script. Refer to
  'src/test/isolation2/sql_isolation_testcase.py'.

Seen flaky tests as below:

root@96831b9f-9150-4424-63a7-abe8f18c144e:/tmp# cat /home/gpadmin/diskquota_artifacts/tests/isolation2/regression.diffs
--- \/tmp\/build\/4eceba44\/bin_diskquota\/tests\/isolation2\/expected\/test_fast_quota_view\.out	2022-12-12 13:20:56.729354016 +0000
+++ \/tmp\/build\/4eceba44\/bin_diskquota\/tests\/isolation2\/results\/test_fast_quota_view\.out	2022-12-12 13:20:56.733354401 +0000
@@ -175,9 +175,11 @@
 (exited with code 0)
 !\retcode rm -r /tmp/spc2;
 GP_IGNORE:-- start_ignore
+GP_IGNORE:rm: cannot remove '/tmp/spc2/6/GPDB_6_301908232/16384/16413': No such file or directory
+GP_IGNORE:rm: cannot remove '/tmp/spc2/5/GPDB_6_301908232/16384/16413': No such file or directory
 GP_IGNORE:
 GP_IGNORE:-- end_ignore
-(exited with code 0)
+(exited with code 1)
 -- end_ignore
 DROP TABLESPACE IF EXISTS spc1;
 DROP
Currently, isolation2/test_rejectmap.sql is flaky if we run isolation2
test multiple times. That's because we set the GUC
'diskquota.hard_limit' to 'on' in test_postmaster_restart.sql and forget
to set it to 'off'. In the next following runs, the hard limit is
enabled and the QD will continuously dispatch reject map to segment
servers. However, test_rejectmap.sql requires the hard limit being
disabled because we're dispatching rejectmap by UDF manually or the
dispatched rejectmap will be cleared by QD.

This patch adds a new injection point to prevent QD from dispatching
rejectmap to make test_rejectmap.sql stateless. This patch also set
'diskquota.hard_limit' to 'off' when test_postmaster_restart.sql
finishes.
* Fix diskquota on gpdb7

- Fix some compile issues, especially relstorage has been removed
on gpdb7. Using relam to get the relation's storage type.

- Modify diskquota hash function flag.

- Fix diskquota_relation_open(). NoLock is disabled on gpdb7.

- Add tests schedule and expected results for gpdb7.

- Update some test expectations on gpdb7 due to AO/CO issue: As
something changes about AO/CO table, the size of them is changed.

- Disable some tests on gpdb7.

- Disable upgrade tests.

- Upgrade to diskquota 2.2. Add attribute relam to type
relation_cache_detail and add a param to function relation_size_local.

- Add setup.sql and setup.out for isolation2 test.

- Fix bug: gpstart timeout for gpdb7. We used to set
`Gp_role = GP_ROLE_DISPATCH` in disk_quota_launcher_main(), even
though postmaster boots in utility mode. This seems to be nothing 
in gpdb6, but it will cause a dead loop when booting gpdb7. In fact,
there is nothing to do in utility mode for the diskquota launcher. In 
this commit, if `Gp_role != GP_ROLE_DISPATCH`,
disk_quota_launcher_main() will simply exit.

- Add gpdb7 pipeline support. Build gpdb7 by rocky8, and test the 
same build with rocky8 and rhel8. 'res_test_images' has been changed
to list to support this.

- Add gpdb version into the task name. 'passwd' is unnecessary and '
doesn't exist in the rocky8 build image.

- Use `cmake -DENABLE_UPGRADE_TEST=OFF` to disable the upgrade test.

- TODO: Add upgrade test to CI pipeline. Fix activate standby error on the
CI pipeline. Fix tests for gpdb7.


Co-authored-by: Xiaoran Wang <wxiaoran@vmware.com>
Co-authored-by: Xing Guo <higuoxing@gmail.com>
Co-authored-by: Hao Zhang <hzhang2@vmware.com>
…#287)

Usage:

```
cmake -DDISKQUOTA_FAULT_INJECTOR=ON/OFF [default: OFF]
```

Co-authored-by: Hao Zhang <hzhang2@vmware.com>
If fault injector is disabled, isolation2 will be disabled.
This reverts commit e3e73d2.

Revert "Add an option to control whether compile with fault injector. (apache#287)"

This reverts commit ae4ab48.

Co-authored-by: Hao Zhang <hzhang2@vmware.com>
- Switch GPDB binary to release-candidate for release build.
- Remove test_task from the release pipeline.

Co-authored-by: Xing Guo <higuoxing@gmail.com>
yjhjstz and others added 6 commits May 13, 2026 12:57
In Cloudberry's MPP architecture, segment stats are delivered
asynchronously to the coordinator. The seq_scan counter can be
registered before seq_tup_read arrives from segments, causing
wait_for_stats() to exit prematurely and the subsequent assertion
to fail intermittently in the pax-ic-good-opt-off CI job.

Add an explicit wait condition (updated6) for seq_tup_read reaching
the expected value, and update the comment to reflect Cloudberry's
segment-level async stats delivery rather than parallel workers.
Add libicu-devel package to Rocky Linux 8, 9, and 10 Dockerfiles
to provide ICU (International Components for Unicode) library
support required for PostgreSQL 16 kernel compilation.

This dependency is already present in Ubuntu 22.04 and Ubuntu 24.04
development images, ensuring consistency across all supported build
platforms for PostgreSQL 16 compilation requirements.
The command `gppkg --clean` fails with the following error: "'SyncPackages' object has no attribute 'ret'".

This occurs because `operations` was being passed positionally during the OperationWorkerPool initialization, which incorrectly bound it to the `should_stop` argument instead of `items` in the base WorkerPool class.

The solution is to  pass `operations` as a keyword argument..
…pache#1727)

* Fix: FDW OPTIONS encoding accepts symbolic names (issue apache#1726)

Both the FDW catalog reader (src/backend/access/external/external.c)
and the gp_exttable_fdw option validator
(gpcontrib/gp_exttable_fdw/option.c) parsed the "encoding" OPTIONS value
with atoi(). atoi("UTF8") returns 0 (PG_SQL_ASCII) and PG_VALID_ENCODING(0)
is true, so symbolic names like 'UTF8', 'utf-8', 'GBK' silently fell through
validation and were stored as SQL_ASCII at read time. By contrast, the
legacy CREATE EXTERNAL TABLE ... ENCODING ... path resolves names via
pg_char_to_encoding() and persists a numeric form into OPTIONS — only the
FDW OPTIONS entry point bypassed that translation.

Add a small shared helper parse_fdw_encoding_option(const char *) in
src/backend/access/external/external.c (declared in
src/include/access/external.h):

  - first try pg_char_to_encoding(name) — same logic as the legacy path;
  - otherwise try a strict numeric form via strtol() with end-of-string
    and PG_VALID_ENCODING() checks (atoi is intentionally avoided, since
    atoi("UTF8")==0 is the bug being fixed);
  - otherwise ereport(ERROR).

Both the validator and GetExtFromForeignTableOptions() call this helper.
On-disk values in pg_foreign_table.ftoptions are stored verbatim as the
user wrote them; correctness is established at read time. This avoids a
ProcessUtility_hook approach, which is unworkable here because the
extension's _PG_init runs lazily on the first dlopen, after the current
statement's hook check has already passed.

Affected scope: gp_exttable_fdw (used by gp_exttable_server). The
standalone pxf_fdw is unaffected — its validator already routes encoding
through ProcessCopyOptions, which is name-aware.

Behavior change on upgrade: existing rows whose ftoptions literally contain
encoding=<name> have, until now, been silently interpreted as SQL_ASCII.
After this fix they are interpreted as the named encoding. This will be
called out in the release notes; a detection query is provided in the PR
description for operators who wish to pin specific tables to numeric form
before upgrade.

Tests added in gpcontrib/gp_exttable_fdw/{input,output}/gp_exttable_fdw.source
cover encoding '6' / 'UTF8' / 'utf-8' / 'GBK' / 'bogus' and an
ALTER FOREIGN TABLE ... OPTIONS (SET encoding 'UTF8') path. The pre-existing
encoding '-1' error case has its expected error message updated to match
the new helper's wording.

* test: pad expected output headers to match psql separator widths

The new tests added in the previous commit had column header lines
without the trailing-space padding that psql's aligned output emits
to match the separator. The pre-existing ext_special_uri header
(' a | b') was also unintentionally stripped of its trailing space
during the same edit.

Pure whitespace fix. No behavior change.

* test: drop trailing blank line in gp_exttable_fdw expected output

pg_regress diffs the expected and actual .out files strictly, including
the final newline count. The new encoding test block ended with a
stray empty line (";\n\n") while psql produces ";\n", causing a 1-line
diff at end-of-file. Pure whitespace fix.

* test: reject mixed numeric+letters in FDW encoding option

Add a regression case for `encoding '6abc'`. atoi("6abc") would have
silently returned 6 (= UTF8), which is the class of bug that motivated
moving the FDW encoding option parser off atoi() and onto a strict
strtol() form in parse_fdw_encoding_option(). Without this test, the
strictness of the numeric path was not directly exercised — only the
"unknown name" path ('bogus') was.

Pure test addition; no code change. Lands the third of the reviewer's
suggestions on issue apache#1726 (the first two — strict strtol parsing and a
single shared helper between the validator and the read path — were
already in place in the original fix commit).

* ci: retrigger to clear flaky alter_distribution_policy

---------

Co-authored-by: chenqiang <chenqiang@hashdata.cn>
Yezzey is an open-source extension for Apache Cloudberry and
Greenplum 6 that transparently offloads Append-Only (AO/AOCO)
table data to S3-compatible object storage. Inspired by Snowflake
and AnyBlob, it extends the storage manager (smgr) so reads and
writes go to S3 instead of local disk, keeping the user interface
unchanged. A companion YProxy service acts as an I/O scheduler,
managing connection pooling and request prioritization to prevent
S3 throttling. Data is PGP-encrypted during upload. Benchmarks
show only 10–43% query slowdown versus local storage, far
outperforming PXF, making it ideal for cost-effective cold-data
tiering.

The main feature of Yezzey - you don't need to change tables or code;
just launch yezzey_define_offload_policy and move the data to S3.
In this way, you can unload your cluster using the available disk space.

Currently, it is widely used on Greenplum 6 instances, and the goal is
to provide users with the same interface in Cloudberry, so they can
seamlessly migrate to Cloudberry.

We placed Yezzey as a submodule, as we believe one day we will replace
all outdated solutions like AO/AOCO/Yezzey with PAX. However, that has
not happened yet and we still need Yezzey.
@leborchuk

Copy link
Copy Markdown
Contributor Author

It's the part of our roadmap, we discussed it #868

See the item Support Compute/Storage decouple by introducing Yezzey

yjhjstz added 2 commits May 18, 2026 08:34
ClearAOCSFileSegInfo/ClearFileSegInfo (called from
ao_vacuum_rel_recycle_dead_segments) updates pg_aoseg rows via
simple_heap_update, which assigns the current CommandId to the new tuple.
AppendOptimizedTruncateToEOF then opens a catalog snapshot via
GetCatalogSnapshot, which also uses GetCurrentCommandId.  Because both
operations share the same CommandId, the just-zeroed rows are invisible
to the snapshot (cid >= snapshot->curcid), while the old rows with their
original non-zero EOF values remain visible.  TruncateAOSegmentFile then
sees a 0-byte physical file but a non-zero logical EOF and raises:

  "file size smaller than logical eof"

Advancing the command counter before AppendOptimizedTruncateToEOF
ensures the zeroed rows are visible to its catalog snapshot (their cid
is now strictly less than the new curcid).

Fixes: apache#1746
ReleaseSysCache(htup) was called before NameStr(staForm->stxname) was
read, returning a pointer into the already-released tuple buffer.
Copy the name with pstrdup() first, then release the cache entry.
@leborchuk leborchuk marked this pull request as ready for review May 19, 2026 07:29
Copilot AI review requested due to automatic review settings May 19, 2026 07:29
@tuhaihe

tuhaihe commented May 19, 2026

Copy link
Copy Markdown
Member

We also need to add the yezzey license info to the licenses dir and LICENSE, like other submodules. FYI.

  • pom.xml.

@tuhaihe

tuhaihe commented May 19, 2026

Copy link
Copy Markdown
Member

For managing the new submodule, we can introduce it in the same way discussed here: #1084 (review)

This comment was marked as off-topic.

@leborchuk

Copy link
Copy Markdown
Contributor Author

We also need to add the yezzey license info to the licenses dir and LICENSE, like other submodules. FYI.

  • pom.xml.

fixed

@leborchuk

Copy link
Copy Markdown
Contributor Author

For managing the new submodule, we can introduce it in the same way discussed here: #1084 (review)

Yes, I did as was described. The issue is that there is no stored tag information and the tag is an ephemeral entity shown only in the git submodule output. See

xifos@xifos-dev-jammy:~/git/cloudberry-leborchuk$ git submodule status
 0da57b85cf23e48d0e515f58c65a25425dbde012 contrib/pax_storage/src/cpp/contrib/googlebench (v1.9.2-3-g0da57b8)
 52204f78f94d7512df1f0f3bea1d47437a2c3a58 contrib/pax_storage/src/cpp/contrib/googletest (release-1.8.0-3536-g52204f78)
 3a58301067bbc03da89ae5a51b3e05b7da719d38 contrib/pax_storage/src/cpp/contrib/tabulate (v1.3-51-g3a58301)
 61c03f62b370b685b7994830b570a88d05ba15ab dependency/yyjson (0.10.0-20-g61c03f6)
 a09ea700d32bab83325aff9ff34d0582e50e3997 gpcontrib/gpcloud/test/googletest (release-1.8.0-2358-ga09ea700)
 0d88f66a5fd0dba82681eef5929529cb153cb325 gpcontrib/yezzey (1.8.8)

Here yezzey linked with 1.8.8 tag but the link info is still commit hash. If I delete tag git submodule just shows commit hash without tag info

@reshke

reshke commented May 20, 2026

Copy link
Copy Markdown
Contributor

Lgtm

Comment thread configure Outdated
@tuhaihe

tuhaihe commented May 21, 2026

Copy link
Copy Markdown
Member

For managing the new submodule, we can introduce it in the same way discussed here: #1084 (review)

Yes, I did as was described. The issue is that there is no stored tag information and the tag is an ephemeral entity shown only in the git submodule output. See

xifos@xifos-dev-jammy:~/git/cloudberry-leborchuk$ git submodule status
 0da57b85cf23e48d0e515f58c65a25425dbde012 contrib/pax_storage/src/cpp/contrib/googlebench (v1.9.2-3-g0da57b8)
 52204f78f94d7512df1f0f3bea1d47437a2c3a58 contrib/pax_storage/src/cpp/contrib/googletest (release-1.8.0-3536-g52204f78)
 3a58301067bbc03da89ae5a51b3e05b7da719d38 contrib/pax_storage/src/cpp/contrib/tabulate (v1.3-51-g3a58301)
 61c03f62b370b685b7994830b570a88d05ba15ab dependency/yyjson (0.10.0-20-g61c03f6)
 a09ea700d32bab83325aff9ff34d0582e50e3997 gpcontrib/gpcloud/test/googletest (release-1.8.0-2358-ga09ea700)
 0d88f66a5fd0dba82681eef5929529cb153cb325 gpcontrib/yezzey (1.8.8)

Here yezzey linked with 1.8.8 tag but the link info is still commit hash. If I delete tag git submodule just shows commit hash without tag info

Hi, you're right. It looks good now. Here is my cmd list:

cd cloudberry/
git submodule add https://github.com/open-gpdb/yezzey.git gpcontrib/yezzey
git submodule status
cd gpcontrib/yezzey/
git fetch --tags
git tag --list
git checkout tags/1.8.8
cd ..
git add gpcontrib/yezzey/
git commit -m "Add yezzey to v1.8.8. xxxxx"

Never mind. We can add the version number info in the commit history when upgrading it next time.

aviralgarg05 and others added 3 commits May 21, 2026 13:57
This PR fixes the recovery flow when the internal WAL replication slot does not already exist on the source segment.

Before this change, both gpsegrecovery and gpconfigurenewsegment would start pg_basebackup first and only retry with slot creation after the backup failed. In practice, that meant a full base backup could run for a long time and then fail at the end because the slot was missing.

This change fixes that at the root:

adds a shared helper to check whether the replication slot already exists
creates the slot up front when needed, before pg_basebackup starts
removes the fallback second pg_basebackup attempt from both recovery paths
updates unit tests to cover the new behavior and the new failure mode

---------

Co-authored-by: Leonid <63977577+leborchuk@users.noreply.github.com>
Comment thread configure.ac
fi

#
# yezzey

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, does yezzey need some extra dependencies for building? If so, we also need to add the pre-check for them when running configure --with-yezzey.

Comment thread gpcontrib/Makefile Outdated
services:
# Define the MinIO service container
minio:
image: lazybit/minio # Use a specific MinIO image tag

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to specify a tag for this image?

Comment thread .github/workflows/yezzey-ci.yaml Outdated
name: Build and Test Yezzey Cloudberry
runs-on: ubuntu-latest
container:
image: apache/incubator-cloudberry:cbdb-build-ubuntu22.04-latest

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add the Rocky 8/9 docker image to the test matrix?

leborchuk and others added 2 commits May 26, 2026 00:57
Co-authored-by: Dianjin Wang <wangdianjin@gmail.com>
Co-authored-by: Dianjin Wang <wangdianjin@gmail.com>
@leborchuk leborchuk marked this pull request as draft May 25, 2026 22:14
@leborchuk leborchuk changed the base branch from main to REL_2_STABLE June 17, 2026 11:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.