# Copyright 2014 Fluo authors (see AUTHORS)
#
# Licensed 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.

#################
# Fluo properties
#################

# NOTE - All properties that have a default are set with it.  Uncomment
# a property if you want to use a value different than the default. 
# Properties that have no default are uncommented and must be set by
# the user.  Most are unset except for io.fluo.accumulo.classpath which 
# has a suggested value.

# Client properties
# -----------------
# Fluo application name
io.fluo.client.application.name=
# Zookeeper connection string specifying host and chroot where Fluo stores data.
# A chroot directory suffix must be specified but doesn't need to be named
# '/fluo'.  If not specified, a Fluo application cannot be initialized.
# Interpolation (i.e ${io.fluo.client.accumulo.zookeepers}/fluo) can be used
# when setting this to reuse Accumulo's zookeeper connection string.
#io.fluo.client.zookeeper.connect=localhost/fluo
# Zookeeper timeout
#io.fluo.client.zookeeper.timeout=30000
# Accumulo instance to connect to
io.fluo.client.accumulo.instance=
# Accumulo user
io.fluo.client.accumulo.user=
# Accumulo password
io.fluo.client.accumulo.password=
# Accumulo zookeepers
#io.fluo.client.accumulo.zookeepers=localhost
# Client retry timeout (in milliseconds). Set to -1 to retry forever.
#io.fluo.client.retry.timeout.ms=-1

# Admin properties
# ----------------
# Accumulo table to initialize
io.fluo.admin.accumulo.table=${io.fluo.client.application.name}
# HDFS root path. Should match 'fs.defaultFS' property in Hadoop's core-site.xml
io.fluo.admin.hdfs.root=hdfs://localhost:10000
# Fluo uses iterators within Accumulo tablet servers, therefore Accumulo per
# table classpath need to be configured with a comma seperated list of uris
# where Accumulo can find Fluo jars.  These jars should be reachable from
# every tablet server.  For the default jars below, `fluo init` will place them
# in HDFS.  If you add more jars to the classpath below, you will need to
# add them to HDFS.
io.fluo.admin.accumulo.classpath=${io.fluo.admin.hdfs.root}/fluo/lib/fluo-api-1.0.0-beta-1.jar,${io.fluo.admin.hdfs.root}/fluo/lib/fluo-accumulo-1.0.0-beta-1.jar

# Observer properties
# -------------------
# Specifies observers
# io.fluo.observer.0=com.foo.Observer1
# Can optionally have configuration key values
# io.fluo.observer.1=com.foo.Observer2,configKey1=configVal1,configKey2=configVal2

# Transaction properties
# ----------------------
# Amount of time (in milliseconds) clients wait before rolling back transaction
#io.fluo.tx.rollback.time=300000

# Worker properties
# -----------------
# Number of worker yarn instances
#io.fluo.worker.instances=1
# Number of threads in each worker instance
#io.fluo.worker.num.threads=10
# Max memory of Worker yarn containers (in MB)
#io.fluo.worker.max.memory.mb=1024
# Number of worker virtual cores
#io.fluo.worker.num.cores=1

# Loader properties
# -----------------
# Number of threads each loader runs.  Can set to zero for no threads, thread
# adding Loader will execute.  Must also set io.fluo.loader.queue.size to zero
# when setting this to zero.
#io.fluo.loader.num.threads=10
# Queue size of loader
#io.fluo.loader.queue.size=10

# Oracle properties
# -----------------
# Oracle port
#io.fluo.oracle.port=9913
# Number of oracle yarn instances
#io.fluo.oracle.instances=1
# Max memory of Oracle yarn containers (in MB)
#io.fluo.oracle.max.memory.mb=512
# Number of oracle virtual cores
#io.fluo.oracle.num.cores=1

#Metrics
#------------------
#Configures metrics for processes not started by fluo script. Please see the metrics docs for more information.
#io.fluo.metrics.yaml.base64=

# MiniFluo properties
# -------------------
# Path to directory where MiniFluo stores its data
#io.fluo.mini.data.dir=${env:FLUO_HOME}/apps/${io.fluo.client.application.name}/mini
# Indicates if MiniFluo should start a MiniAccumulo cluster
#io.fluo.mini.start.accumulo=true

#Application properties
#---------------
#Properties with a prefix of io.fluo.app are stored in zookeeper at
#initialization time and can easily be retrieved by a Fluo application running
#on any node in the cluster.
#io.fluo.app.config1=val1
