#!/usr/bin/env bash

. "`dirname $0`/test-rgw-common.sh"

set -e

function get_metadata_sync_status {
  cid=$1
  realm=$2

  meta_sync_status_json=`$(rgw_admin $cid) --rgw-realm=$realm metadata sync status`

  global_sync_status=$(json_extract sync_status.info.status $meta_sync_status_json)
  num_shards=$(json_extract sync_status.info.num_shards $meta_sync_status_json)

  echo "sync_status: $global_sync_status"

  sync_markers=$(json_extract sync_status.markers $meta_sync_status_json)

  num_shards2=$(python_array_len $sync_markers)

  [ "$global_sync_status" == "sync" ] && $assert $num_shards2 -eq $num_shards

  sync_states=$(project_python_array_field val.state $sync_markers)
  eval secondary_status=$(project_python_array_field val.marker $sync_markers)
}

function get_metadata_log_status {
  cid=$1
  realm=$2

  master_mdlog_status_json=`$(rgw_admin $cid) --rgw-realm=$realm mdlog status`
  master_meta_status=$(json_extract "" $master_mdlog_status_json)

  eval master_status=$(project_python_array_field marker $master_meta_status)
}

function wait_for_meta_sync {
  master_id=$1
  cid=$2
  realm=$3

  get_metadata_log_status $master_id $realm
  echo "master_status=${master_status[*]}"

  while true; do
    get_metadata_sync_status $cid $realm

    echo "secondary_status=${secondary_status[*]}"

    fail=0
    for i in `seq 0 $((num_shards-1))`; do
      if [ "${master_status[$i]}" \> "${secondary_status[$i]}" ]; then
        echo "shard $i not done syncing (${master_status[$i]} > ${secondary_status[$i]})"
        fail=1
        break
      fi
    done

    [ $fail -eq 0 ] && echo "Success" && return || echo "Sync not complete"

    sleep 5
  done
}

