#!/bin/sh
#
#/**
# * 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.
# */

# Set JAVA_HOME here to override the environment setting
# JAVA_HOME=

########################################
# default settings for bookkeeper
########################################

# Configuration file of settings used in bookie server
# BOOKIE_CONF=

# Configuration file of settings used in zookeeper server
# BOOKIE_ZK_CONF=

# Extra options to be passed to the jvm
# BOOKIE_EXTRA_OPTS=

# Add extra paths to the bookkeeper classpath
# BOOKIE_EXTRA_CLASSPATH=

# Folder where the Bookie server PID file should be stored
# BOOKIE_PID_DIR=

# Wait time before forcefully kill the Bookie server instance, if the stop is not successful
# BOOKIE_STOP_TIMEOUT=

# Entry formatter class to format entries.
# ENTRY_FORMATTER_CLASS=

# this default config dir should match the 'localBookiesConfigDirectory' config value in the conf file of LocalBookKeeper
# LOCALBOOKIES_CONFIG_DIR=/tmp/localbookies-config

#################################
# BookKeeper Logging Options
#################################

# Log4j configuration file
# BOOKIE_LOG_CONF=

# Logs location
# BOOKIE_LOG_DIR=

# Log file name
# BOOKIE_LOG_FILE="bookkeeper.log"

# Log level & appender
# BOOKIE_ROOT_LOGGER="INFO,CONSOLE"

#################################
# BookKeeper JVM memory options
#################################

# BOOKIE_MAX_HEAP_MEMORY=1g
# BOOKIE_MIN_HEAP_MEMORY=1g
# BOOKIE_MAX_DIRECT_MEMORY=2g
# BOOKIE_MEM_OPTS=

# JVM GC options
# BOOKIE_GC_OPTS=

# JVM GC logging options
# BOOKIE_GC_LOGGING_OPTS=

# JVM performance options
# BOOKIE_PERF_OPTS="-XX:+PerfDisableSharedMem -XX:+AlwaysPreTouch -XX:-UseBiasedLocking"
