#!/bin/bash
#==============================================================================
# Copyright and license info is available in the LICENSE file included with
# the Server Deployment Package (SDP), and also available online:
# https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE
#------------------------------------------------------------------------------

export SDP_INSTANCE=${SDP_INSTANCE:-Undefined} 
export SDP_INSTANCE=${1:-$SDP_INSTANCE} 
if [[ $SDP_INSTANCE == Undefined ]]; then 
   echo "Instance parameter not supplied." 
   echo "You must supply the Perforce instance as a parameter to this script." 
   exit 1 
fi 

# shellcheck disable=SC1091
source /p4/common/bin/p4_vars "$SDP_INSTANCE"
# shellcheck disable=SC1091
source /p4/common/bin/backup_functions.sh
LOGFILE="$LOGS/refresh_P4ROOT_from_offline_db.log"

######### Start of Script ##########
check_vars
set_vars
rotate_last_run_logs
log "Start $P4SERVER Refresh P4ROOT from offline_db."
check_uid
check_dirs
check_offline_db_usable
if ! "$P4BIN" info -s > /dev/null 2>&1; then
   die "Error: p4d is not running as expected. Aborting."
fi
ckp_running
"$P4CBIN"/p4login
get_journalnum
get_offline_journal_num
stop_p4d
p4d_truncate_journal
replay_journals_to_offline_db

# On an edge or replica server, we have to replay the active journal as well because
# edges/replicas have been running since the journal was rotated.
if [[ "$SERVERID" != "$P4MASTER_ID" ]]; then
   replay_active_journal_to_offline_db
fi

# If run on a 'standby' replica, artificially set state to match statejcopy, as we have
# just successfully replayed the entire content of the locally pulled journal into the
# offline_db.
if [[ "$STANDBYSERVER" -eq 1 ]]; then
   if [[ -r "$P4ROOT/statejcopy" ]]; then
      log "Setting $P4ROOT/state to $P4ROOT/statejcopy"
      cp -f "$P4ROOT/statejcopy" "$P4ROOT/state"
   else
      log "Warning: Expected $P4ROOT/statejcopy file not found."
   fi
fi

switch_db_files
start_p4d
log "Removing db files from save directory since we know the journal successfully replayed at this point."
# The offline_db directory was the root, so this is where the save directory is now.
rm -f "${OFFLINE_DB}"/save/db.* >> "$LOGFILE" 2>&1
recreate_offline_db_files
get_offline_journal_num
replay_journals_to_offline_db
# shellcheck disable=SC2034
ROOTDIR=$OFFLINE_DB

# If on the master, kick off the standard offline checkpoint.  For servers other than
# the master, skip this.
if [[ "$SERVERID" == "$P4MASTER_ID" ]]; then
   dump_checkpoint
fi
remove_old_checkpoints_and_journals
check_disk_space
remove_old_logs
log "End $P4SERVER Refresh P4ROOT from offline_db."
mail_log_file "$HOSTNAME $P4SERVER Refresh P4ROOT from offline_db log."
set_counter
ckp_complete
