#!/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
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 26468 | C. Thomas Tyler |
Adjusted refresh_P4ROOT_from_offline_db.sh to work on maser/edge/replicas. Added logic in functions like p4d_truncate_journal() to make them safe to call on any host, master, replica, or edge. When called on any host other than the master, appropriate behavior is expected. Approving to deliver patch. |
||
#1 | 26400 | C. Thomas Tyler |
Added refresh_P4ROOT_from_offline_db.sh. Updated backup_functions.sh to support functionality for db refresh. Upgrade start_p4d() and stop_p4d() to use systemd if available, else use the underlying SysV init scripts. Updated verify_sdp.sh to be called from other scripts (sans its own logging). Added many checks to verify_sdp.sh to support P4ROOT/offline_db swap. Logic in P4ROOT/offline_db swap is more careful about what gets swapped. Added start_p4broker() and stop_p4broker() that behave similarly. More shellcheck compliance. #review-26401 |