diff --git a/.gitignore b/.gitignore index 47aab836c..fe90b3b19 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ /.idea /*.iml /.bundle/ +.project +.settings/ diff --git a/_posts/release/2026-08-24-accumulo-4.0.0-alpha1.md b/_posts/release/2026-08-24-accumulo-4.0.0-alpha1.md new file mode 100644 index 000000000..b62473d7e --- /dev/null +++ b/_posts/release/2026-08-24-accumulo-4.0.0-alpha1.md @@ -0,0 +1,250 @@ +--- +title: Apache Accumulo 4.0.0 Alpha 1 +sortableversion: '04.00.00' +draft: true +--- +## About + +Apache Accumulo 4.0.0 is a non-LTM major version release that contains +a large number of internal changes that allow a lot of flexibility in +the way that Accumulo is deployed with a small number of API changes. +A high level overview of some of the changes are described in [this][blog] +blog post. + +## Notable Changes + +* Accumulo 4.0.0 requires Java 21 for compilation and Java 17 for runtime. + +* Bulk Import V1 has been removed. Users will need to migrate to Bulk Import V2. + +* Tablet merges no longer require a chop compaction on the participating files. To facilitate + this the file entry in the tablet metadata now includes the range for the tablet data in + the file. + +* FaTE locks include tablet ranges where possible to allow for concurrent FaTE operations + on non-overlapping tablet ranges. + +* The CompactionCoordinator process no longer exists, its functionality was moved into the Manager. + +* Non-system tablets will be optionally hosted by default. Operations requiring a tablet to be + hosted (live ingest and immediate consistency scans) will instruct the Manager to temporarily + assign the Tablet. Users can change the default hosting semantics for Tablets when creating + the table, using the TableOperations API, or the appropriate command in the Shell. Tablets + that are temporarily assigned are unloaded according to the logic in the OnDemandTabletUnloader + plugin being used, specified by the property 'tserver.ondemand.tablet.unloader'. The default + implementation will unload tablets that have not been used in 10 minutes, which can be changed + by the property 'tserver.ondemand.tablet.unloader.interval'. + +* Considering TabletServers optionally host Tablets, all Tablet management functions (e.g. merge, + split, compaction initiation, bulk import, etc.) have been moved into the Manager. TabletServers no longer + perform major compactions making Compactor processes mandatory (ScanServers remain an optional + feature). + +* Tablets in a table can now be automatically merged. There is a manager property to control the + interval at which tablets are checked and a table property to control the threshold for an + automatic merge. Tablet mergeability can be specified at table creation time or using + `TableOperations.putSplits`. The upgrade process sets the tablet mergeability to never for + all existing tablets to preserve any user created split points. Tablet mergeability can be + set when adding new splits and will be set to always when the split is created by the system + based on user settings. See [merging][merge] for more information. + +* Split and Merge operations, which are now just metadata operations, can be much faster for tablets + that are not hosted. For tablets that are hosted in a TabletServer, they are temporarily unloaded + before the operation executes. + +* Multiple active Manager processes are supported. One active Manager is considered the "primary" + Manager and the others are considered "assistant" Managers. Clients will connect to the primary + Manager for Thrift operations requiring the Manager. If the primary Manager process dies then one + of the assistant Managers will become the Primary. The assistant Managers participate in + processing FaTE transactions, but not tablet management or coordinating major compactions. + +* New table property `table.compaction.minor.age` will cause a minor compaction to be + initiated when the oldest key-value in a Tablets' in-memory-map exceeds the value. This could + be useful when using Scan Servers in conjunction with the Tablet Metadata expiration property. + +* The HostRegexTableLoadBalancer has been deprecated. Similar functionality can be achieved using + the TableLoadBalancer and setting the property `table.custom.assignment.group` on a table + that references a set of Tablet Servers using the same resource group name. + +* The Monitor has been re-worked to mostly use the metrics emitted by the various server processes. + While the Monitor server does make some RPC calls, metrics will need to be enabled using the + property `general.micrometer.enabled` on all server processes for the Monitor to work properly. + Endpoints for retrieving the underlying data from the Monitor server in XML or JSON format have + been removed. Users are encouraged to set up their own metric collection system for gathering + and visualizing metric data. + +* Log recovery work may now be performed in Compactor, Scan Server, and Tablet Server processes. + +* User FaTE transactions are now stored in a table in the system namespace. System FaTE transactions + remain stored in ZooKeeper. + +* Scan Server file references have been moved out of the metadata table and into their own table + in the system namespace. + +* A Resource Group configuration layer has been added that allows the user to override system-level + properties for resource group processes. + +* Table configuration properties are now only allowed in the Namespace and Table configuration layers. + +* The command line utilities have been updated. Run `accumulo --help` to see the changes. A bash + completion script can be generated using the command `accumulo conf create-autocomplete-script`. + +* The number of threads used to process FaTE transactions can be configured by FaTE transaction type + for both user and system FaTE transactions. + + +## API Changes (from 2.1.6) + +
+ Click to see API changes + +### Additions + +|Change|Object| +|------|------| +|Abstract method was added.|method long org.apache.accumulo.core.client.admin.ActiveCompaction::getPausedCount()| +|Abstract method was added.|method org.apache.accumulo.core.client.admin.servers.ServerId org.apache.accumulo.core.client.admin.ActiveCompaction::getServerId()| +|Abstract method was added.|method org.apache.accumulo.core.client.admin.servers.ServerId org.apache.accumulo.core.client.admin.ActiveScan::getServerId()| +|Method was added to an interface.|method boolean org.apache.accumulo.core.iterators.IteratorEnvironment::isRunningLowOnMemory()| +|Method was added to an interface.|method java.lang.String org.apache.accumulo.core.client.admin.TableOperations::getNamespace(java.lang.String)| +|Method was added to an interface.|method java.time.Duration org.apache.accumulo.core.client.admin.InstanceOperations::getManagerTime() throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was added to an interface.|method java.util.List org.apache.accumulo.core.client.admin.InstanceOperations::getActiveCompactions(java.util.Collection) throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was added to an interface.|method java.util.List org.apache.accumulo.core.client.admin.InstanceOperations::getActiveScans(java.util.Collection) throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was added to an interface.|method java.util.Map org.apache.accumulo.core.client.admin.InstanceOperations::getSystemProperties() throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was added to an interface.|method java.util.Set org.apache.accumulo.core.client.admin.compaction.CompactionConfigurer.InputParameters::getSelectedFiles()| +|Method was added to an interface.|method java.util.Set org.apache.accumulo.core.client.admin.InstanceOperations::getServers(org.apache.accumulo.core.client.admin.servers.ServerId.Type)| +|Method was added to an interface.|method java.util.Set org.apache.accumulo.core.client.admin.InstanceOperations::getServers(org.apache.accumulo.core.client.admin.servers.ServerId.Type, java.util.function.Predicate, java.util.function.BiPredicate)| +|Method was added to an interface.|method org.apache.accumulo.core.client.admin.ResourceGroupOperations org.apache.accumulo.core.client.AccumuloClient::resourceGroupOperations()| +|Method was added to an interface.|method org.apache.accumulo.core.client.admin.servers.ServerId org.apache.accumulo.core.client.admin.InstanceOperations::getServer(org.apache.accumulo.core.client.admin.servers.ServerId.Type, org.apache.accumulo.core.data.ResourceGroupId, java.lang.String, int)| +|Method was added to an interface.|method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFile.InputArguments.FencedPath[])| +|Method was added to an interface.|method org.apache.accumulo.core.data.KeyBuilder.Build org.apache.accumulo.core.data.KeyBuilder.ColumnVisibilityStep::visibility(org.apache.accumulo.core.data.ByteSequence)| +|Method was added to an interface.|method org.apache.accumulo.core.data.KeyBuilder.ColumnFamilyStep org.apache.accumulo.core.data.KeyBuilder.RowStep::row(org.apache.accumulo.core.data.ByteSequence)| +|Method was added to an interface.|method org.apache.accumulo.core.data.KeyBuilder.ColumnQualifierStep org.apache.accumulo.core.data.KeyBuilder.ColumnFamilyStep::family(org.apache.accumulo.core.data.ByteSequence)| +|Method was added to an interface.|method org.apache.accumulo.core.data.KeyBuilder.ColumnVisibilityStep org.apache.accumulo.core.data.KeyBuilder.ColumnQualifierStep::qualifier(org.apache.accumulo.core.data.ByteSequence)| +|Method was added to an interface.|method org.apache.accumulo.core.data.Mutation.TimestampOptions org.apache.accumulo.core.data.Mutation.FamilyOptions::keyColumns(org.apache.accumulo.core.data.Key)| +|Method was added to an interface.|method org.apache.accumulo.core.data.RowRange org.apache.accumulo.core.client.admin.compaction.CompactableFile::getRange()| +|Method was added to an interface.|method org.apache.accumulo.core.data.TabletId org.apache.accumulo.core.client.admin.compaction.CompactionSelector.SelectionParameters::getTabletId()| +|Method was added to an interface.|method org.apache.hadoop.io.Text org.apache.accumulo.core.client.admin.TableOperations::getMaxRow(java.lang.String, org.apache.accumulo.core.security.Authorizations, org.apache.accumulo.core.data.RowRange) throws org.apache.accumulo.core.client.TableNotFoundException, org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was added to an interface.|method void org.apache.accumulo.core.client.admin.InstanceOperations::ping(org.apache.accumulo.core.client.admin.servers.ServerId) throws org.apache.accumulo.core.client.AccumuloException| +|Method was added to an interface.|method void org.apache.accumulo.core.client.admin.TableOperations::putSplits(java.lang.String, java.util.SortedMap) throws org.apache.accumulo.core.client.TableNotFoundException, org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| + + +### Removals + +|Change|Object| +|------|------| +|Class was removed.|class org.apache.accumulo.core.client.admin.CompactionStrategyConfig| +|Class was removed.|class org.apache.accumulo.core.client.ClientConfiguration| +|Class was removed.|class org.apache.accumulo.core.client.Connector| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AbstractInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AccumuloFileOutputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AccumuloInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AccumuloMultiTableInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AccumuloOutputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.AccumuloRowInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapred.InputFormatBase| +|Class was removed.|class org.apache.accumulo.core.client.mapred.RangeInputSplit| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AbstractInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AccumuloFileOutputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AccumuloMultiTableInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AccumuloOutputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.AccumuloRowInputFormat| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.InputFormatBase| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.InputTableConfig| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.lib.partition.KeyRangePartitioner| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.lib.partition.RangePartitioner| +|Class was removed.|class org.apache.accumulo.core.client.mapreduce.RangeInputSplit| +|Class was removed.|class org.apache.accumulo.core.client.replication.PeerExistsException| +|Class was removed.|class org.apache.accumulo.core.client.replication.PeerNotFoundException| +|Class was removed.|class org.apache.accumulo.core.client.ZooKeeperInstance| +|Class was removed.|class org.apache.accumulo.minicluster.MiniAccumuloInstance| +|Class was removed.|interface org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionHost| +|Class was removed.|interface org.apache.accumulo.core.client.admin.ReplicationOperations| +|Class was removed.|interface org.apache.accumulo.core.client.Instance| +|Method was removed.|method boolean org.apache.accumulo.core.client.sample.AbstractHashSampler::isValidOption(java.lang.String)| +|Method was removed.|method int org.apache.accumulo.minicluster.MiniAccumuloConfig::getNumTservers()| +|Method was removed.|method java.lang.String org.apache.accumulo.core.client.admin.InstanceOperations::getInstanceID()| +|Method was removed.|method java.util.Collection org.apache.accumulo.core.client.admin.TableOperations::getSplits(java.lang.String, int) throws org.apache.accumulo.core.client.TableNotFoundException| +|Method was removed.|method java.util.Collection org.apache.accumulo.core.client.admin.TableOperations::getSplits(java.lang.String) throws org.apache.accumulo.core.client.TableNotFoundException| +|Method was removed.|method java.util.Set org.apache.accumulo.core.data.Mutation::getReplicationSources()| +|Method was removed.|method org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionHost org.apache.accumulo.core.client.admin.ActiveCompaction::getHost()| +|Method was removed.|method org.apache.accumulo.core.client.admin.CompactionConfig org.apache.accumulo.core.client.admin.CompactionConfig::setCompactionStrategy(org.apache.accumulo.core.client.admin.CompactionStrategyConfig)| +|Method was removed.|method org.apache.accumulo.core.client.admin.CompactionStrategyConfig org.apache.accumulo.core.client.admin.CompactionConfig::getCompactionStrategy()| +|Method was removed.|method org.apache.accumulo.core.client.admin.NewTableConfiguration org.apache.accumulo.core.client.admin.NewTableConfiguration::withoutDefaultIterators()| +|Method was removed.|method org.apache.accumulo.core.client.admin.ReplicationOperations org.apache.accumulo.core.client.AccumuloClient::replicationOperations()| +|Method was removed.|method org.apache.accumulo.core.client.ClientConfiguration org.apache.accumulo.minicluster.MiniAccumuloCluster::getClientConfig()| +|Method was removed.|method org.apache.accumulo.core.client.Connector org.apache.accumulo.minicluster.MiniAccumuloCluster::getConnector(java.lang.String, java.lang.String) throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was removed.|method org.apache.accumulo.core.conf.AccumuloConfiguration org.apache.accumulo.core.iterators.IteratorEnvironment::getConfig()| +|Method was removed.|method org.apache.accumulo.core.iterators.SortedKeyValueIterator org.apache.accumulo.core.iterators.IteratorEnvironment::reserveMapFileReader(java.lang.String) throws java.io.IOException| +|Method was removed.|method org.apache.accumulo.core.spi.common.ServiceEnvironment org.apache.accumulo.core.iterators.IteratorEnvironment::getServiceEnv()| +|Method was removed.|method org.apache.accumulo.minicluster.MiniAccumuloConfig org.apache.accumulo.minicluster.MiniAccumuloConfig::setNumScanServers(int)| +|Method was removed.|method org.apache.accumulo.minicluster.MiniAccumuloConfig org.apache.accumulo.minicluster.MiniAccumuloConfig::setNumTservers(int)| +|Method was removed.|method org.apache.hadoop.io.Text org.apache.accumulo.core.data.TabletId::getTableId()| +|Method was removed.|method void org.apache.accumulo.core.client.admin.TableOperations::create(java.lang.String, boolean, org.apache.accumulo.core.client.admin.TimeType) throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException, org.apache.accumulo.core.client.TableExistsException| +|Method was removed.|method void org.apache.accumulo.core.client.admin.TableOperations::create(java.lang.String, boolean) throws org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException, org.apache.accumulo.core.client.TableExistsException| +|Method was removed.|method void org.apache.accumulo.core.client.admin.TableOperations::importDirectory(java.lang.String, java.lang.String, java.lang.String, boolean) throws org.apache.accumulo.core.client.TableNotFoundException, java.io.IOException, org.apache.accumulo.core.client.AccumuloException, org.apache.accumulo.core.client.AccumuloSecurityException| +|Method was removed.|method void org.apache.accumulo.core.client.MutationsRejectedException::(org.apache.accumulo.core.client.Instance, java.util.List, java.util.Map>, java.util.Collection, int, java.lang.Throwable)| +|Method was removed.|method void org.apache.accumulo.core.client.NamespaceNotEmptyException::(org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException)| +|Method was removed.|method void org.apache.accumulo.core.client.TableOfflineException::(org.apache.accumulo.core.client.Instance, java.lang.String)| +|Method was removed.|method void org.apache.accumulo.core.data.ConditionalMutation::setReplicationSources(java.util.Set)| +|Method was removed.|method void org.apache.accumulo.core.data.Mutation::addReplicationSource(java.lang.String)| +|Method was removed.|method void org.apache.accumulo.core.data.Mutation::setReplicationSources(java.util.Set)| +|Method was removed.|method void org.apache.accumulo.core.iterators.IteratorEnvironment::registerSideChannel(org.apache.accumulo.core.iterators.SortedKeyValueIterator)| + +### Other + +|Change|Old|New| +|------|---|---| +|Method newly throws checked exceptions: java.lang.ReflectiveOperationException.|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(java.lang.String, java.lang.Class) throws java.lang.Exception|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(java.lang.String, java.lang.Class) throws java.lang.ReflectiveOperationException| +|Method newly throws checked exceptions: java.lang.ReflectiveOperationException.|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(org.apache.accumulo.core.data.TableId, java.lang.String, java.lang.Class) throws java.lang.Exception|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(org.apache.accumulo.core.data.TableId, java.lang.String, java.lang.Class) throws java.lang.ReflectiveOperationException| +|Method no longer throws checked exceptions: java.lang.Exception.|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(java.lang.String, java.lang.Class) throws java.lang.Exception|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(java.lang.String, java.lang.Class) throws java.lang.ReflectiveOperationException| +|Method no longer throws checked exceptions: java.lang.Exception.|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(org.apache.accumulo.core.data.TableId, java.lang.String, java.lang.Class) throws java.lang.Exception|method T org.apache.accumulo.core.client.PluginEnvironment::instantiate(org.apache.accumulo.core.data.TableId, java.lang.String, java.lang.Class) throws java.lang.ReflectiveOperationException| +|Method no longer throws checked exceptions: org.apache.accumulo.core.client.TableNotFoundException.|method org.apache.hadoop.io.Text org.apache.accumulo.core.client.admin.FindMax::findMax(org.apache.accumulo.core.client.Scanner, org.apache.hadoop.io.Text, boolean, org.apache.hadoop.io.Text, boolean) throws org.apache.accumulo.core.client.TableNotFoundException|method org.apache.hadoop.io.Text org.apache.accumulo.core.client.admin.FindMax::findMax(org.apache.accumulo.core.client.Scanner, org.apache.accumulo.core.data.RowRange)| +|Method only differs in the vararg type from some of its overloads: [method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(java.lang.String[]), method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFile.InputArguments.FencedPath[])].|method org.apache.accumulo.core.client.rfile.RFile.ScannerOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])|method org.apache.accumulo.core.client.rfile.RFile.ScannerOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])| +|Method only differs in the vararg type from some of its overloads: [method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(java.lang.String[]), method org.apache.accumulo.core.client.rfile.RFile.ScannerOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])].|none|method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFile.InputArguments.FencedPath[])| +|Method only differs in the vararg type from some of its overloads: [method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFile.InputArguments.FencedPath[]), method org.apache.accumulo.core.client.rfile.RFile.ScannerOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])].|method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(java.lang.String[])|method org.apache.accumulo.core.client.rfile.RFile.ScannerFSOptions org.apache.accumulo.core.client.rfile.RFile.InputArguments::from(java.lang.String[])| +|Method only differs in the vararg type from some of its overloads: [method org.apache.accumulo.core.client.rfile.RFile.SummaryFSOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(java.lang.String[])].|method org.apache.accumulo.core.client.rfile.RFile.SummaryOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])|method org.apache.accumulo.core.client.rfile.RFile.SummaryOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])| +|Method only differs in the vararg type from some of its overloads: [method org.apache.accumulo.core.client.rfile.RFile.SummaryOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(org.apache.accumulo.core.client.rfile.RFileSource[])].|method org.apache.accumulo.core.client.rfile.RFile.SummaryFSOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(java.lang.String[])|method org.apache.accumulo.core.client.rfile.RFile.SummaryFSOptions org.apache.accumulo.core.client.rfile.RFile.SummaryInputArguments::from(java.lang.String[])| +|Method only differs in the vararg type from some of its overloads: [method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, byte[][]) throws java.io.IOException].|method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, java.lang.String[]) throws java.io.IOException|method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, java.lang.String[]) throws java.io.IOException| +|Method only differs in the vararg type from some of its overloads: [method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, java.lang.String[]) throws java.io.IOException].|method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, byte[][]) throws java.io.IOException|method void org.apache.accumulo.core.client.rfile.RFileWriter::startNewLocalityGroup(java.lang.String, byte[][]) throws java.io.IOException| +|The enum constant was defined on position 1 but is now on 0. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.MANAGER|field org.apache.accumulo.minicluster.ServerType.MANAGER| +|The enum constant was defined on position 2 but is now on 1. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionType.MAJOR|field org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionType.MAJOR| +|The enum constant was defined on position 2 but is now on 1. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.ZOOKEEPER|field org.apache.accumulo.minicluster.ServerType.ZOOKEEPER| +|The enum constant was defined on position 3 but is now on 2. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionType.FULL|field org.apache.accumulo.core.client.admin.ActiveCompaction.CompactionType.FULL| +|The enum constant was defined on position 3 but is now on 2. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.TABLET_SERVER|field org.apache.accumulo.minicluster.ServerType.TABLET_SERVER| +|The enum constant was defined on position 4 but is now on 3. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.GARBAGE_COLLECTOR|field org.apache.accumulo.minicluster.ServerType.GARBAGE_COLLECTOR| +|The enum constant was defined on position 6 but is now on 4. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.COMPACTOR|field org.apache.accumulo.minicluster.ServerType.COMPACTOR| +|The enum constant was defined on position 8 but is now on 5. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.MONITOR|field org.apache.accumulo.minicluster.ServerType.MONITOR| +|The enum constant was defined on position 9 but is now on 6. The user code can break if it relies on the return value of the "ordinal()" method.|field org.apache.accumulo.minicluster.ServerType.SCAN_SERVER|field org.apache.accumulo.minicluster.ServerType.SCAN_SERVER| +|The number of parameters of the method have changed.|method org.apache.hadoop.io.Text org.apache.accumulo.core.client.admin.FindMax::findMax(org.apache.accumulo.core.client.Scanner, org.apache.hadoop.io.Text, boolean, org.apache.hadoop.io.Text, boolean) throws org.apache.accumulo.core.client.TableNotFoundException|method org.apache.hadoop.io.Text org.apache.accumulo.core.client.admin.FindMax::findMax(org.apache.accumulo.core.client.Scanner, org.apache.accumulo.core.data.RowRange)| +|The number of parameters of the method have changed.|method void org.apache.accumulo.core.client.TableDeletedException::(java.lang.String, java.lang.Exception)|method void org.apache.accumulo.core.client.TableDeletedException::(org.apache.accumulo.core.data.TableId)| +|The number of parameters of the method have changed.|method void org.apache.accumulo.core.security.VisibilityParseException::(java.lang.String, byte[], int)|method void org.apache.accumulo.core.security.VisibilityParseException::(org.apache.accumulo.access.InvalidAccessExpressionException)| +|The return type changed from 'java.lang.String' to 'org.apache.accumulo.core.data.TableId'.|method java.lang.String org.apache.accumulo.core.client.TableDeletedException::getTableId()|method org.apache.accumulo.core.data.TableId org.apache.accumulo.core.client.TableDeletedException::getTableId()| +|The return type changed from 'org.apache.accumulo.core.clientImpl.TabletLocator' to 'org.apache.accumulo.core.clientImpl.ClientTabletCache'.|method org.apache.accumulo.core.clientImpl.TabletLocator org.apache.accumulo.hadoopImpl.mapreduce.lib.InputConfigurator::getTabletLocator(java.lang.Class, org.apache.hadoop.conf.Configuration, org.apache.accumulo.core.data.TableId)|method org.apache.accumulo.core.clientImpl.ClientTabletCache org.apache.accumulo.hadoopImpl.mapreduce.lib.InputConfigurator::getTabletLocator(java.lang.Class, org.apache.hadoop.conf.Configuration, org.apache.accumulo.core.data.TableId)| +|Visibility was reduced from 'public' to 'private'.|class org.apache.accumulo.core.iterators.user.ColumnAgeOffFilter.TTLSet|class org.apache.accumulo.core.iterators.user.ColumnAgeOffFilter.TTLSet| + +
+ +## Upgrading + +View the [Upgrading Accumulo documentation][upgrade] for guidance as +the upgrade procedure has changed. Note that during the upgrade +all user tablets will be set to have on-demand tablet availability. +Users will need to change the tablet availability post-upgrade for +tablets that they want always or never hosted on a tablet server. +The upgrade process also sets the tablet mergeability to never for +all existing tablets to preserve any user created split points. +Tablet mergeability can be set when adding new splits and will be +set to always when the split is created by the system based on user +settings. + +## Useful Links + +* [All tickets related to this release][milestone] + + +[blog]: /blog/2024/10/07/accumulo4-preview.html +[merge]: /docs/4.x/administration/merging +[upgrade]: /docs/4.x/administration/upgrading +[milestone]: https://github.com/apache/accumulo/milestone/20