<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--

    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.

-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
  <property>
    <name>dfs.datanode.synconclose</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>{{ worker_data_dirs[0] }}/hadoop/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>{% for dir in worker_data_dirs -%}
              {{ dir }}/hadoop/data
              {%- if not loop.last -%} , {%- endif -%}
           {%- endfor %}</value>
  </property>
{% if not hdfs_ha %}
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>{{ groups['namenode'][0] }}:50090</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.https-address</name>
    <value>{{ groups['namenode'][0] }}:50091</value>
  </property>
{% else %}
  <property>
    <name>dfs.nameservices</name>
    <value>{{ nameservice_id }}</value>
  </property>
{% set nn_list = [] %}
{% for item in groups['namenode'] %}{{ nn_list.append('nn' + loop.index|string() ) }}{% endfor %}
  <property>
    <name>dfs.ha.namenodes.{{ nameservice_id }}</name>
    <value>{{ nn_list | join(',') }}</value>
  </property>
{% for nn_host in groups['namenode'] %}{% set nn_id = 'nn' + loop.index|string() %}
  <property>
    <name>dfs.namenode.rpc-address.{{ nameservice_id }}.{{ nn_id }}</name>
    <value>{{ nn_host }}:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.{{ nameservice_id }}.{{ nn_id }}</name>
    <value>{{ nn_host }}:50070</value>
  </property>
  <property>
    <name>dfs.namenode.https-address.{{ nameservice_id }}.{{ nn_id }}</name>
    <value>{{ nn_host }}:50071</value>
  </property>
{% endfor %}
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://{{ journal_quorum }}/{{ nameservice_id }}</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.{{ nameservice_id }}</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(/usr/bin/true)</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>{{ worker_data_dirs[0] }}/hadoop/journal</value>
  </property>
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
{% endif %}
  <property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.domain.socket.path</name>
    <value>/var/lib/hadoop-hdfs/dn_socket</value>
  </property>
</configuration>
