Problem Statement
The maintenance starter export endpoints do not include Experiments or their Variants, and the import path does not restore them. As a result, a starter generated for backup or migration silently loses all A/B testing experiment data.
Affected endpoints:
GET /api/v1/maintenance/_downloadStarterWithAssets
GET /api/v1/maintenance/_downloadStarter
Root cause: ExportStarterUtil only exports (a) Hibernate-mapped entities plus a small hardcoded list (getTableSet()), and (b) a few hand-coded non-Hibernate "special" tables — Counter, Image, Portlet, Workflows, Rules (getAdditionalDataAsJSON()). The experiment table is persisted via DotConnect (not Hibernate) and is in neither list, so it is never written to the starter. The same applies to the variant table, which holds the experiment-variant rows (dotexperiment-<id>-variant-<n>) that the already-exported variant content (contentlet_version_info / multi_tree) references — without those rows, restored experiments resolve to orphaned variants.
Impact / scope:
- Affects starter-based backup and instance-to-instance migration.
- Particularly serious on MSSQL or any environment where the
pg_dump binary is unavailable, because the JSON starter is then the only backup path. (The separate pg_dump path — _pgDumpAvailable / _downloadDb — already includes experiment/variant since they are not in its --exclude-table-data deny-list, so that path is not affected.)
Steps to Reproduce
- On a dotCMS instance, create an A/B testing Experiment on a page (this writes a row to the
experiment table and dotexperiment-… rows to the variant table).
- Call
GET /api/v1/maintenance/_downloadStarterWithAssets (or _downloadStarter) as an admin.
- Unzip the downloaded starter and inspect the JSON entries.
Expected: The ZIP contains the experiment data (e.g. Experiment.json) and the variant rows (e.g. Variant.json), and importing the starter into a clean instance restores the experiment and its variants.
Actual: No experiment or variant data is present in the ZIP. After importing such a starter, the experiment and its variants do not exist on the target instance.
Acceptance Criteria
dotCMS Version
Latest from main branch.
Links
NA
Problem Statement
The maintenance starter export endpoints do not include Experiments or their Variants, and the import path does not restore them. As a result, a starter generated for backup or migration silently loses all A/B testing experiment data.
Affected endpoints:
GET /api/v1/maintenance/_downloadStarterWithAssetsGET /api/v1/maintenance/_downloadStarterRoot cause:
ExportStarterUtilonly exports (a) Hibernate-mapped entities plus a small hardcoded list (getTableSet()), and (b) a few hand-coded non-Hibernate "special" tables — Counter, Image, Portlet, Workflows, Rules (getAdditionalDataAsJSON()). Theexperimenttable is persisted viaDotConnect(not Hibernate) and is in neither list, so it is never written to the starter. The same applies to thevarianttable, which holds the experiment-variant rows (dotexperiment-<id>-variant-<n>) that the already-exported variant content (contentlet_version_info/multi_tree) references — without those rows, restored experiments resolve to orphaned variants.Impact / scope:
pg_dumpbinary is unavailable, because the JSON starter is then the only backup path. (The separatepg_dumppath —_pgDumpAvailable/_downloadDb— already includesexperiment/variantsince they are not in its--exclude-table-datadeny-list, so that path is not affected.)Steps to Reproduce
experimenttable anddotexperiment-…rows to thevarianttable).GET /api/v1/maintenance/_downloadStarterWithAssets(or_downloadStarter) as an admin.Expected: The ZIP contains the experiment data (e.g.
Experiment.json) and the variant rows (e.g.Variant.json), and importing the starter into a clean instance restores the experiment and its variants.Actual: No experiment or variant data is present in the ZIP. After importing such a starter, the experiment and its variants do not exist on the target instance.
Acceptance Criteria
GET /api/v1/maintenance/_downloadStarterand_downloadStarterWithAssetsboth include theexperimenttable data in the generated starter.varianttable data (all rows, including archived andDEFAULT).ImportStarterUtil, preserving the experimentidand JSONB fields (traffic_proportion,scheduling,goals,running_ids).DEFAULTvariant and not failing on archived experiment variants.page_idreferences a contentlet identifier).DotConnect.addJSONParam).pg_dumppath (_downloadDb) remains unchanged.dotCMS Version
Latest from
mainbranch.Links
NA