-
Notifications
You must be signed in to change notification settings - Fork 1.9k
[wip]feat(backend): postgres integration #12379
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
Hi @kaikaila. Thanks for your PR. I'm waiting for a kubeflow member to verify that this patch is reasonable to test. If it is, they should reply with Once the patch is verified, the new status will be reflected by the I understand the commands that are listed here. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. |
|
🚫 This command cannot be processed. Only organization members or owners can use the commands. |
cd1d08b to
85498ed
Compare
|
Currently, both MySQL and PGX setups use the DB superuser for all KFP operations, which is why client_manager.go contains a “create database if not exist” step here. From a security standpoint, would it be preferable to:
If the team agrees, I can propose a follow-up PR to refactor accordingly. |
|
I'm fine with this, I don't think it's great that KFP tries to create a database (or a bucket frankly) fyi @mprahl / @droctothorpe |
|
Thanks, @HumairAK — totally agree on the security point. |
09fd370 to
1e0caa8
Compare
|
yes that is fine |
4d33821 to
e6c943c
Compare
Question about the PostgreSQL test workflow organizationCurrent situationThe V2 integration tests for PostgreSQL logically belong in a "PostgreSQL counterpart" to legacy-v2-api-integration-tests.yml Question: What's the recommended workflow organization for PostgreSQL tests?Should I:
Would love guidance on the long-term vision for test workflow organization, especially from @nsingla |
6c3ca2a to
6ae921f
Compare
Hi @nsingla, Thanks for the context. I'd like to clarify the reasoning behind the current structure of Integration Tests: You mentioned we should avoid adding more workload to the existing Does this approach sound reasonable to you as an interim solution? |
5181644 to
1594f9c
Compare
34559fb to
c7fdd08
Compare
Signed-off-by: kaikaila <[email protected]>
Signed-off-by: kaikaila <[email protected]>
…iveExperiment - Extract repeated subquery SQL into resourceReferenceSubquery variable - Unify code style: consistently use SetMap() throughout - Add detailed comments explaining PostgreSQL $N placeholder handling - Simplify error messages optimization according to sanchesoon's suggestion Signed-off-by: kaikaila <[email protected]>
c7fdd08 to
8531316
Compare
1. dialect.go: fmt.Sprintf for sql string 2. merge review diff from Humair *_store.go: replace sql string concatenating with fmt.Sprintf reuse escapeSQLString from dialect.go replace == with erros.Is() replace t.Errorf with require or assert; replace t.Fatalf with require.FailNow in integration test hardcode expectations rename QuoteFunction QualifyIdentifier in storage package unit tests for qualifyIdentifier parametized timeout as a constant make target dev-kind-cluster with DB parameter revert dev-kind-cluster bridge to 172.17.0.1 for linux cleaning redundant postgres config in configmap add database parameter to api-server-test standalone only add CI job for postgres with argo 3.6.7 database ”" to “mysql” agents.md and readme.md add unit test for placeholder numbering update api-server-test to include postgres document for kind-cluster-agnostic test(integration): use consistent naming for test files to ensure database-agnostic sorting fix(test): handle binary files in pipeline spec replacement and use first yaml file for smoke tests fix branch path update compile golden files fix: Add error handling and retry logic when listing runs and recurring runs during cleanup. fix: Use ReferenceKey ID for namespace filter when querying pipelines by namespace. refactor: move table prefix dot appending logic from model methods to list options. differentiate report_name test: Remove UUID generation from experiment names in integration tests. change 127.0.0.1 to localhost feat: Use shared `test-and-report` action for running v2 API tests in the Postgres workflow. skip upgrade tests refactor: extract `default-allow-same-namespace` NetworkPolicy into dedicated files for `dev-kind` and `dev-kind-postgresql` environments. refactor: remove quoteIdentifier from list.Options update dev-kind to be OS-aware Signed-off-by: kaikaila <[email protected]>
backend/Makefile: update k8s 1.34.0 api-server-test-Postgres: k8s back to 1.30.2, trigger ci in my repo Signed-off-by: kaikaila <[email protected]>
8531316 to
fe697f3
Compare
…environment variables from CI workflow. Signed-off-by: kaikaila <[email protected]>
fe697f3 to
4946472
Compare
Signed-off-by: kaikaila <[email protected]>
6c48105 to
eb946bd
Compare
Summary
This PR adds full PostgreSQL (pgx driver) support to Kubeflow Pipelines backend, enabling users to choose between MySQL and PostgreSQL as the metadata database. The implementation introduces a clean dialect abstraction layer and includes a major query optimization that benefits both database backends.
Key achievements
✅ Complete PostgreSQL integration for API Server and Cache Server, addressing #7512, #9813
✅ All CI tests passing (MySQL + PostgreSQL).
✅ Significant performance improvement for ListRuns queries. This PR is expected to address the root causes behind #10778, #10230, #9780, #9701
✅ Zero breaking changes - backward compatible with existing MySQL deployments
What Changed
Problem
SQL syntax was tightly coupled to MySQL.
Solution
Introduced a DBDialect interface that encapsulates database-specific behavior
Identifier quoting (MySQL backticks vs PostgreSQL double quotes)
Placeholder styles (? vs $1, $2, ...)
Aggregation functions (GROUP_CONCAT vs string_agg)
Concatenation syntax (CONCAT() vs ||)
Files
backend/src/apiserver/common/sql/dialect/dialect.gobackend/src/apiserver/storage/sql_dialect_util.gobackend/src/apiserver/storage/list_filters.goAll storage layer code now uses
This ensures queries work correctly across MySQL, PostgreSQL, and SQLite (for tests).
The original ListRuns query called
addMetricsResourceReferencesAndTaskswhich performed a 3-layer LEFT JOIN with GROUP BY on all columns, includingLONGTEXTfields likePipelineSpecManifestWorkflowSpecManifestetc. This caused slow response times for large datasets.Layers 1-3: LEFT JOIN only on PrimaryKey
UUID+ aggregated columns (refs, tasks, metrics)Final layer: INNER JOIN back to run_details to fetch
LONGTEXTcolumnsEliminates GROUP BY on LONGTEXT columns entirely. Expected substantial performance improvements for deployments with large pipeline specifications, though formal load testing has not yet been conducted.
manifests/kustomize/env/platform-agnostic-postgresql/manifests/kustomize/env/dev-kind-postgresql/manifests/kustomize/third-party/postgresql/Configuration is symmetric to existing MySQL manifests for consistency.
Created CI-specific Kustomize overlays to ensure tests use locally built images from the Kind registry instead of pulling official images from ghcr.io:
.github/resources/manifests/standalone/postgresql/kfp-cache-serverimage override to.github/resources/manifests/standalone/base/kustomization.yamlapi-server-test-Postgres.ymlintegration-tests-v1-postgres.ymlPostgreSQL tests cover the core cache enabled/disabled matrix.
Testing
Unit Tests
23 test files modified/added
New test coverage: dialect_test.go, list_filters_test.go, sql_dialect_util_test.go
All existing tests updated to use dialect abstraction
Integration Tests
✅ V1 API integration tests (PostgreSQL)
✅ V2 API integration tests (PostgreSQL, cache enabled/disabled)
✅ Existing MySQL tests remain green
Migration Guide
kubectl apply -k manifests/kustomize/env/platform-agnostic-postgresqlNo action required. This PR is fully backward compatible.
make -C backend dev-kind-cluster-pgThis PR continues from #12063.