#
# 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 the application.
# ~~~~~

# Secret key
# ~~~~~
# The secret key is used to secure cryptographics functions.
#
# This must be changed for production, but we recommend not changing it in this file.
#
# See http://www.playframework.com/documentation/latest/ApplicationSecret for more details.
application.secret="/`==g^yr2DNnZGK_L^rguLZeR`60uLOVgY@OhyTv:maatl:Tl>9or/d1xME3b/Pi"

# The application languages
# ~~~~~
application.langs="en"

# Global object class
# ~~~~~
# Define the Global object class for this application.
# Default to Global in the root package.
# application.global=Global

# Router
# ~~~~~
# Define the Router object to use for this application.
# This router will be looked up first when the application is starting up,
# so make sure this is the entry point.
# Furthermore, it's assumed your route file is named properly.
# So for an application router like `my.application.Router`,
# you may need to define a router file `conf/my.application.routes`.
# Default to Routes in the root package (and conf/routes)
# application.router=my.application.Routes

# Database configuration
# ~~~~~
# You can declare as many datasources as you want.
# By convention, the default datasource is named `default`
#
# db.default.driver=org.h2.Driver
# db.default.url="jdbc:h2:mem:play"
# db.default.user=sa
# db.default.password=""

# Evolutions
# ~~~~~
# You can disable evolutions if needed
# evolutionplugin=disabled

# Logger
# ~~~~~
# You can also configure logback (http://logback.qos.ch/),
# by providing an application-logger.xml file in the conf directory.

# Root logger:
logger.root=ERROR

# Logger used by the framework:
logger.play=INFO

# Logger provided to your application:
logger.application=DEBUG

# APP PHASE
phase=dev
host=localhost

# DB
s2graph.models.table.name="models-dev"
hbase.zookeeper.quorum=${host}

# Query server
is.query.server=true
is.write.server=true
query.hard.limit=100000

# Local Cache
cache.ttl.seconds=60
cache.max.size=100000

# HBASE
#hbase.client.operation.timeout=1000
#async.hbase.client.flush.interval=100
hbase.table.compression.algorithm="gz"

# Asynchbase
hbase.client.retries.number=100
hbase.rpcs.buffered_flush_interval=100
hbase.rpc.timeout=0
#hbase.nsre.high_watermark=1000000
#hbase.timer.tick=5
#hbase.timer.ticks_per_wheel=5

# Kafka
kafka.metadata.broker.list=${host}
kafka.producer.pool.size=0

# HTTP
parsers.text.maxLength=512K
parsers.json.maxLength=512K
trustxforwarded=false

# Local Queue Actor
local.queue.actor.max.queue.size=100000
local.queue.actor.rate.limit=1000000

# local retry number
max.retry.number=100
max.back.off=50
delete.all.fetch.size=10000
hbase.fail.prob=-1.0

# max allowd edges for deleteAll is multiply of above two configuration.

# set global obejct package, TODO: remove global
#application.global=com.kakao.s2graph.rest.Global

akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
}


# Future cache.
future.cache.max.size=100000
future.cache.expire.after.write=10000
future.cache.expire.after.access=5000


# Counter
redis.instances = [${host}]

