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

export hdfs_user=$1
shift
export conf_dir=$1
shift
export mark_dir=$1
shift
export name_dirs=$*

export EXIT_CODE=0
export command="namenode -format"
export list_of_non_empty_dirs=""

mark_file=/var/run/hadoop/hdfs/namenode-formatted
if [[ -f ${mark_file} ]] ; then
  rm -f ${mark_file}
  mkdir -p ${mark_dir}
fi

if [[ ! -d $mark_dir ]] ; then
  for dir in `echo $name_dirs | tr ',' ' '` ; do
    echo "NameNode Dirname = $dir"
    cmd="ls $dir | wc -l  | grep -q ^0$"
    eval $cmd
    if [[ $? -ne 0 ]] ; then
      (( EXIT_CODE = $EXIT_CODE + 1 ))
      list_of_non_empty_dirs="$list_of_non_empty_dirs $dir"
    fi
  done

  if [[ $EXIT_CODE == 0 ]] ; then
    su - ${hdfs_user} -c "yes Y | hadoop --config ${conf_dir} ${command}"
  else
    echo "ERROR: Namenode directory(s) is non empty. Will not format the namenode. List of non-empty namenode dirs ${list_of_non_empty_dirs}"
  fi
else
  echo "${mark_dir} exists. Namenode DFS already formatted"
fi

exit $EXIT_CODE

