#!/bin/bash
# This script requires the offline_db directory to contain a restored copy of the
# most recent checkpoint to play the cut off journal into.
#
# This script is using the following external variables:
#
# SDP_INSTANCE - The instance of Perforce that is being backed up. If not
# set in environment, pass in as argument to script.
#
# P4HOME - Server's home directory.
# P4BIN - Command line client name for the instance being backed up.
# P4DBIN - Server executable name for the instance being backed up.
# P4ROOT - Server's root directory. p4/root, p4_N/root
# P4PORT - TCP/IP port for the server instance being backed up.
# P4JOURNAL - Location of the Journal for the server instance being backed up.
#
#
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 

. /p4/common/bin/p4_vars $SDP_INSTANCE
. /p4/common/bin/backup_functions.sh
LOGFILE=$LOGS/checkpoint.log

######### Start of Script ##########
check_vars
set_vars
get_journalnum
rotate_last_run_logs
log "Start $P4SERVER Checkpoint"
check_uid
check_dirs
check_offline_db_usable
ckp_running
$P4CBIN/p4login
replay_journals_to_offline_db

# Copy broker maintenance config into place before stopping the server.
if [[ -f ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg ]]; then
  cp ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg.normal
  cp ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg.maintenance ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg
fi

stop_p4d
if [[ $EDGESERVER -ne 1 ]]; then
  p4d_truncate_journal
  replay_journals_to_offline_db
fi

# On an edge server, we have to replay the active journal as well because the edge
# server has been running since the journal was rotated.
if [[ $EDGESERVER -eq 1 ]]; then
   replay_active_journal_to_offline_db
fi

switch_db_files
start_p4d

# Copy normal broker config into place after starting the server.
if [[ -f ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg ]]; then
  cp ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg.normal ${P4CCFG}/${P4SERVER}.broker.${P4MASTER_ID}.cfg
fi

echo Removing db files from save directory since we know the journal successfully replayed at this point. >> $LOGFILE
# 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
replay_journals_to_offline_db
get_offline_journal_num
ROOTDIR=$OFFLINE_DB
dump_checkpoint
gzip_mv_journals
remove_old_checkpoints_and_journals
remove_old_logs
log "End $P4SERVER Checkpoint"
set_counter
ckp_complete
