Migrate to 6.2
This page describes the best strategy to upgrade to 6.2. Read the Release notes to get familiar with major changes for this release. This guide refers to changes in migration order. The Release notes refers to the changes based on their importance or significance. For this migration, an automated OpenRewrite migration recipe is provided. Run it at the specified step of the migration process.Packaging changes
All the artifacts are available on JFrog Artifactory. There are two client-facing entrypoints: Read the download page to see how to configure those entry points. The channelmvn includes mvn-prod and also includes pre-release (alpha, beta, milestone, release candidate) and continuous builds.
Visibility of Maven artifacts depends on the access rights of the account.
Some artifacts, such as continuous build, may not be accessible if the required permissions are not granted.
Atoti is not distributed on artifacts.activeviam.com.
Preparatory work
- Upgrade to the latest 6.1
- Check for use of
avinternal/internal/private_in imports and replace them. Do not hesitate to fill a support ticket to seek for an alternative - Fix Spring deprecations, follow Spring guide
- Try building the project with JDK 25. Some dependencies may require an upgrade for the build to succeed — for example, Lombok must be upgraded to a JDK 25-compatible version (1.18.40+).
- Check for use of removed features
Upgrade
- Run the automated OpenRewrite migration recipe
- Update the poms to the new Java version, Spring Boot version and Atoti version
- Atoti Server 6.2 moves to Spring Boot 4, which brings Jackson 3 (
com.fasterxml.jackson.*→tools.jackson.*). Migrate your Jackson usage with OpenRewrite’sUpgradeJackson_2_3recipe. - If you overrode the
admin-ui.versionMaven property to pin the Atoti Admin UI version, this property is removed: all Atoti UI artifacts (atoti-ui,atoti-ui-initial-content,atoti-admin-ui) are now versioned by the singleatoti-ui.versionproperty - Logging configuration
- If JUL is used for logging, add a dependency to
org.slf4j:slf4j-jdk14 - If a different logging framework is used, remove the dependency to
org.slf4j:jul-to-slf4j
- If JUL is used for logging, add a dependency to
- Compile and test
Post-upgrade
As part of the migration, the name of some loggers and JVM property may have changed. Warnings will be logged at runtime when using the legacy names in order to allow to identify the ones to migrate. Monitor the logs for these warnings.Manual changes
The following changes are not handled by the automated recipe and must be applied manually.-
IActivePivotContentServiceConfigis deprecated. If you implement this interface, the@Beanannotation is not inherited from the interface foractivePivotContentService(). Add@Beanexplicitly to your implementing method, or migrate to declaringIActivePivotContentServiceas a standalone@Bean. -
Several methods of the Datastore transaction API (package
com.activeviam.database.datastore.api.transaction) no longer declarethrows DatastoreTransactionException, because they could never actually throw it. The affected methods are:ITransactionalWriter#remove(String, Object...)ITransactionalWriter#removeAll(String, Collection)IOpenedTransaction#updateWhere(ISelection, ICondition, IUpdateWhereProcedure)IOpenedTransaction#rollback()ITransactionManager#rollbackTransaction()ITransactionManager#stop()
DatastoreTransactionExceptionis a checked exception, atryblock wrapping only calls to these methods with acatch (DatastoreTransactionException e)clause will no longer compile. Remove the now-deadcatchclause, or the entiretryif it was the only catch. In a multi-catch such ascatch (DatastoreTransactionException | SomeOtherException e), remove only theDatastoreTransactionExceptionalternative. Methods that still throw it, such ascommitTransaction(),startTransaction(...)andremoveWhere(...), are unaffected, so acatchthat also wraps one of those stays as-is. -
The
String-based distributing level APIs have been removed. Replace usages as follows, converting each formerStringlevel name to aLevelIdentifier(constructed with dimension name, hierarchy name, and level name):IApplicationDescriptionBuilderWithId#withDistributingFields(String...)→withDistributingLevels(LevelIdentifier...)QueryClusterDefinition.DistributedApplicationDefinition(String, List<String>)→QueryClusterDefinition.DistributedApplicationDefinition(String, List<LevelIdentifier>)
-
IDistributedApplicationDefinition#getDistributingFields()has been removed. UsegetDistributingLevels()instead, which returns aList<LevelIdentifier>.
com.activeviam.database.api.schema.DataTablehas been removed. This change is not handled by the automated migration recipe — replace constructor calls manually with the description API matching your stack:- Datastore tables:
new DataTable(name, keyFieldNames, fields)becomesStoreDescription.simpleBuilder().name(name).keyFieldNames(keyFieldNames).fields(fields).build(). Thefieldslist should now containIFieldDescriptioninstances (fromcom.activeviam.database.datastore.api.description) instead ofIDataTableField. Replacenew DataTableField(...)withFieldDescription.builder()…build()from the same package. - DirectQuery tables:
new DataTable(name, keyFieldNames, fields)becomesTableDescription.builder().externalTable(...).withSameLocalName().fields(fields).keyFieldNames(keyFieldNames).build(), supplying the appropriateExternalTable. Thefieldslist should now containAFieldDescriptioninstances (fromcom.activeviam.directquery.api.schema) instead ofIDataTableField. Replacenew DataTableField(...)withFieldDescription.builder()…build()from the same package.
- Datastore tables:
IActivePivotBranchPermissionsManagerConfighas been deprecated and no longer carries@Configurationor@Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and exposeIBranchPermissionsManageras a@Beanfrom a@Configurationclass directly.IActivePivotConfighas been deprecated and no longer carries@Configurationor@Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and exposeIActivePivotManageras a@Beanfrom a@Configurationclass directly.
Automated OpenRewrite Migration Recipe
The automated OpenRewrite migration recipe handles the following API changes from 6.1.20 to 6.2.0. Run it during the Upgrade step. The recipe is published to JFrog as the artifactcom.activeviam.migration:6_1-to-6_2:<version>.
How to run
From your project root, preview the changes first:dryRun with run
Running a subset of the migration
The aggregator recipecom.activeviam.migration.v6_1_to_6_2 runs everything. Each migration is split into three phases so you can adopt it gradually. Swap
-Drewrite.activeRecipes= for one of the phase recipes instead of the aggregator:
| Phase | Recipe name | When to run |
|---|---|---|
| Before | com.activeviam.migration.v6_1_to_6_2_before | On the 6.1 code base, before upgrading. The old code still compiles. |
| During | com.activeviam.migration.v6_1_to_6_2_during | Together with the upgrade to 6.2. The old code cannot accommodate these changes. |
| After | com.activeviam.migration.v6_1_to_6_2_after | Once the project runs on 6.2, to clean up deprecated API usages. |
Change of behavior
- The query-service monitoring previously provided by the APM module is now built into Atoti Server: query counters are always recorded, and exceptions thrown during query processing are always logged. The single
name=QueriesService,type=MonitoringMBean previously registered by the APM module is replaced by two MBeans:name=QueriesServiceStatistics,type=Monitoring(query counters) andname=QueriesServiceLogging,type=Monitoring(runtime logging toggles). The per-query report logs (query/result description, completion time, optional memory statistics) are now disabled by default. If you relied on the APM module to produce these logs, enable them with theactiveviam.queries.service.logging=trueapplication property (and optionallyactiveviam.queries.service.detailed-loggingandactiveviam.queries.service.log-memory-stats), or at runtime through theQueriesServiceLoggingMBean. These logs are now emitted on theatoti.server.query.servicelogger.
Removed features
No longer supported
SnowflakeDialectSettings#SnowflakeDialectSettingsBuilder#arrayAggWrapperFunctionName(String)has been removed. The built-in SQL function from Snowflake is now faster.DatabricksDialectSettings#DatabricksDialectSettingsBuilder#xxxNativeArrayUdafName(String)have been removed. Databricks has deprecated the use of Spark UDAFs. Review your database schema to use emulated vectors (multi-row or multi-column) instead.- The concealed measures feature has been removed from the distributed data cluster definition. The
withConcealedMeasures(...)builder methods,IDataClusterDefinition#getConcealedMeasures/setConcealedMeasures, and the now-redundantwithAllMeasures()builder step no longer exist. Remove any call towithAllMeasures()from data cluster definitions; the builder now goes straight from the hierarchy concealment step to branch concealment. Concealing hierarchies and branches remains available.
With alternatives
IApplicationDescriptionBuilderWithId#withoutDistributingFields()has been renamed towithoutDistributingLevels().QueryClusterDefinition.DistributedApplicationDefinitionV2has been renamed toQueryClusterDefinition.DistributedApplicationDefinition.IJdbcSourcehas been removed. Replace all usages with the concreteJdbcSourceclass.- Deprecated method
IQueryExecution#shouldBypassNonJitProvidershas been removed. UseIQueryExecution#skipNonJitProvidersinstead. - Deprecated method
IMultiVersionDistributedActivePivot#unloadMembersFromDataNodehas been removed, along with theIMessengerDefinition#UNLOAD_MEMBERS_MESSAGE_TIMEOUTproperty and thedistribution.unload_members_from_data_node.*metrics. UseIMultiVersionDataActivePivot#maskMembersinstead. ClickhousePropertieshas been deprecated. UseClickhousePropertiesV2instead, as the ClickHouse connector has been upgraded to use a new client.- The Maven modules
com.activeviam.activepivot:activepivot-implandcom.activeviam.activepivot:activepivot-intfhave been merged intocom.activeviam.activepivot:core, use it directly. - The empty Maven module
com.activeviam.activepivot:activepivot-copperhas been removed. Importcom.activeviam.activepivot:coreand optionallycom.activeviam.activepivot:activepivot-dist-implinstead. - The empty Maven module
com.activeviam.activepivot:activepivot-exthas been removed. Importcom.activeviam.activepivot:coreand optionallycom.activeviam.activepivot:activepivot-dist-implinstead. - The empty Maven module
com.activeviam.springboot:atoti-runtime-starter, kept as an alias since it was renamed in 6.1, has been removed. Usecom.activeviam.springboot:atoti-server-application-starterinstead. - Memory sampling (activated via the property “activeviam.mmap.tracking”, and triggered via JMX operations) has been removed. You should now rely on a JFR instead of JMX operations, as those include dedicated JFR events for memory operations. The associated properties “activeviam.mmap.sampling.depth”, “activeviam.mmap.sampling.start” and “activeviam.mmap.sampling.percent” have been removed.
MDXQueryis now immutable and the constructors should be used.- The
activeviam.jwt.*application properties, deprecated since 6.1, have been removed. Use theatoti.jwt.*equivalents instead.
| Previous name | New name |
|---|---|
activeviam.jwt.expiration | atoti.jwt.expiration |
activeviam.jwt.key.private | atoti.jwt.key.private |
activeviam.jwt.key.public | atoti.jwt.key.public |
activeviam.jwt.claim_key.authorities | atoti.jwt.claim_key.authorities |
activeviam.jwt.claim_key.principal | atoti.jwt.claim_key.principal |
activeviam.jwt.enabled | atoti.jwt.enabled |
activeviam.jwt.check_user_details | atoti.jwt.check_user_details |
-
The deprecated ActiveViam Property
activeviam.contentService.nameGenerator.defaultSizehas been removed, useactiveviam.contentService.nameGenerator.sizeinstead. See the Properties page for its definition. -
Deprecated method
StartBuilding.Builder#withEpochManager(IEpochManager)has been removed. UseStartBuilding.Builder#withEpochPolicy(IEpochManagementPolicy)instead, passing the epoch policy directly rather than wrapping it in anEpochManager. -
Deprecated method
PersistedBuilder#lockOptions(boolean)has been removed. UsePersistedBuilder#databaseLocks(LockOptions)instead.lockOptions(true)becomesdatabaseLocks(LockOptions.defaultOptions())andlockOptions(false)needs no call. -
The deprecated duplicate types under
io.atoti.runtime.api.measuresandio.atoti.server.common.api.pluginshave been removed. Use the identically named types undercom.activeviam.atoti.application.api.measuresandcom.activeviam.atoti.server.common.api.plugins. The automated recipe rewrites these package references. -
The deprecated 4-argument constructor of
ActivePivotTransactionCommittedEventhas been removed. Use the 6-argument constructor, passing-1, -1for the start and commit timings when they are unknown. -
The deprecated
IGenericAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEYconstant has been removed. UseIMultiSourceAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEYinstead, which is the canonical home for the multi-source sum-product key. The automated recipe rewrites these references. -
The deprecated
integerandinteger[]parser type keys (including sized and delimited variants such asinteger[10]andinteger[][:]) are no longer recognized. Replace them with the canonicalintandint[](and their sized and delimited variants).
API syntax changes
CsvParserConfigurationconstructors are replaced by a new builder:new CsvParserConfiguration()→CsvParserConfiguration.builder().withColumnCount(0).build()new CsvParserConfiguration(int)→CsvParserConfiguration.builder().withColumnCount(n).build()new CsvParserConfiguration(List<String>)→CsvParserConfiguration.builder().withColumnNames(names).build()new CsvParserConfiguration(Map<Integer, String>)→CsvParserConfiguration.builder().withColumnNamesMapping(map).build()- Full constructors (7-param and 8-param) are migrated using the builder.
- Setter calls (e.g.
config.setSeparator(';')) are replaced by the corresponding builder methods (e.g..separator(';')). createCharsetmethod has been removed
CsvSourceFactory.create()static methods are replaced byICsvSource.builder():CsvSourceFactory.create()→ICsvSource.builder().build()CsvSourceFactory.create(name)→ICsvSource.builder().name(name).build()CsvSourceFactory.create(closeCallback)→ICsvSource.builder().closeCallback(closeCallback).build()CsvSourceFactory.create(name, closeCallback)→ICsvSource.builder().name(name).closeCallback(closeCallback).build()
- The
ICsvParserConfigurationinterface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concreteCsvParserConfigurationclass. - The
IFileParserConfigurationinterface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concreteCsvParserConfigurationclass. - The concrete
FileParserConfigurationclass has been removed; replace all usages (return types, variable declarations, and parameter types) with the concreteCsvParserConfigurationclass. CsvSourceConfigurationandCsvSourceConfigurationBuilderconstructors are replaced by the builder:new CsvSourceConfiguration(int, int, boolean, IComparator)→CsvSourceConfiguration.builder().parserThreads(t).bufferSize(b).synchronousMode(s).fileComparator(c).build()new CsvSourceConfigurationBuilder()→CsvSourceConfiguration.builder()CsvSourceConfigurationBuilder.DEFAULT_PARSER_THREADSis deprecated; useCsvSourceConfiguration.getDefaultParserThreads()instead.
- The
ICsvSourceConfigurationinterface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concreteCsvSourceConfigurationclass. SnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(SFSession, String)is replaced bySnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(String, String). Inline the former call usingSFSession#getPropertyKey().IParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, Configuration)is replaced byIParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, ParquetConfiguration). Wrap the formerConfigurationargument usingnew HadoopParquetConfiguration(configuration).- The three
IParquetParser#parseoverloads that take a Hadooporg.apache.hadoop.fs.Pathhave been removed:parse(org.apache.hadoop.fs.Path, IStoreToParquetMapping, IStoreToParquetMapping...)→parse(java.nio.file.Path, IStoreToParquetMapping, IStoreToParquetMapping...)parse(org.apache.hadoop.fs.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)→parse(java.nio.file.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(org.apache.hadoop.fs.Path, Configuration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)→parse(java.nio.file.Path, ParquetConfiguration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...). Wrap the former HadoopConfigurationargument withnew HadoopParquetConfiguration(configuration).
- The
factoryparameter type in fourIParquetParser#parseoverloads changed fromFunction<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>toICloudEntityChannelFactory<EntityT>. The affected overloads are:parse(ICloudDirectory<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(ICloudDirectory<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(ICloudEntityPath<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(ICloudEntityPath<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
IAgentno longer extendsIExtendedPluginValue. Implementations ofIAgentshould now also explicitly implementIExtendedPluginValueif needed.- The three Logback conversion-rule converters have been moved out of the
apmmodule into dedicated logging artifacts. Update the fully-qualified class names referenced in yourlogback.xml/logback-spring.xml<conversionRule>declarations:com.activeviam.apm.api.logging.LogInstanceConverter→com.activeviam.tech.logging.logback.api.LogInstanceConverter(artifactcom.activeviam.tech:logging-logback)com.activeviam.apm.api.logging.LogThreadConverter→com.activeviam.tech.logging.logback.api.LogThreadConverter(artifactcom.activeviam.tech:logging-logback)com.activeviam.apm.api.logging.LogUserConverter→com.activeviam.tech.logging.logback.spring.api.LogUserConverter(artifactcom.activeviam.tech:logging-logback-spring)
- The
IMultiVersionDataActivePivotinterface has been moved from packagecom.activeviam.activepivot.dist.impl.api.cubetocom.activeviam.activepivot.dist.datanode.impl.api.cube. NoTransactionExceptionhas been moved in the public API, from packagecom.activeviam.database.datastore.internaltocom.activeviam.database.datastore.api.transaction.GetAggregatesQueryconstructors are replaced byGetAggregatesQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call.build().DrillthroughQueryconstructors are replaced byDrillthroughQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call.build().