#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This is the main configuration file for Apache Accumulo. Available configuration properties can be
# found in the Accumulo documentation on the Accumulo project website (https://accumulo.apache.org/)
# Link for Accumulo 2.0: https://accumulo.apache.org/docs/2.0/administration/properties

## Time to wait on I/O for simple, short RPC calls
general.rpc.timeout=240s

## A secret unique to a given instance that servers must know to communicate
instance.secret=muchos

## Sets location in HDFS where Accumulo will store data
instance.volumes={{ hdfs_root }}/accumulo

## Sets location of Zookeepers
instance.zookeeper.host={{ zookeeper_connect }}

## The durability used to write the write-ahead log
table.durability=flush

## Enables C++ in-memory data store that limits Java GC pauses
tserver.memory.maps.native.enabled=true

## Minimum number of threads to use to handle incoming requests
tserver.server.threads.minimum=64

## The maximum size for each write-ahead log
tserver.walog.max.size=512M

{% if cluster_type == 'azure' and use_adlsg2 %}
general.volume.chooser=org.apache.accumulo.server.fs.PreferredVolumeChooser
general.custom.volume.preferred.default={{ instance_volumes_preferred }}
general.custom.volume.preferred.logger={{ hdfs_root }}/accumulo
{% endif %}

{% if num_tservers > 1 %}
tserver.port.search = true
replication.receipt.service.port = 0
{% endif %}
