Skip to content

AEM — Offline Compaction [LINUX]

SYNOPSIS

AEM Offline TAR Compaction script, using a custom logback configuration file with custom encoder for better logging.

For Windows

If you wish to execute on windows environment use the THIS script

Guide

#!/bin/bash


##############    AEM Offline TAR Compaction  ####################################
# 																				 #
# ███████╗██╗  ██╗██╗   ██╗██████╗ ███████╗██╗   ██╗ ██████╗ ██████╗ ███████╗    #   
# ██╔════╝██║ ██╔╝╚██╗ ██╔╝██╔══██╗██╔════╝██║   ██║██╔═══██╗██╔══██╗██╔════╝    # 
# ███████╗█████╔╝  ╚████╔╝ ██║  ██║█████╗  ██║   ██║██║   ██║██████╔╝███████╗    # 
# ╚════██║██╔═██╗   ╚██╔╝  ██║  ██║██╔══╝  ╚██╗ ██╔╝██║   ██║██╔═══╝ ╚════██║    #
# ███████║██║  ██╗   ██║   ██████╔╝███████╗ ╚████╔╝ ╚██████╔╝██║     ███████║    #
# ╚══════╝╚═╝  ╚═╝   ╚═╝   ╚═════╝ ╚══════╝  ╚═══╝   ╚═════╝ ╚═╝     ╚══════╝    #
#																				 #
#																				 #
# SCRIPT: AEM Offline TAR Compaction											 #
# AUTHOR: Shashi Yebbare														 #
# DATE:   FEB, 09, 2019														  	 #
# REV:    1.3.P 																 #
#         (For Alpha, Beta, Dev, Test and Production)		      				 #
#																				 #
# PLATFORM: AIX, HP-UX, Linux, Solaris								 			 #
#																				 #
# PURPOSE: 	To perform offline AEM compaction on Segmentstore			 		 #
#          	and reduce the size of the AEM repository, Script 		 			 #
#   		uses a custom log-back XML configuration to log         			 #
#			additional compaction information. 									 #
# 																				 # 
# REVISED LIST:																	 #
#        DATE: FEB, 17 2019													 	 #
#        BY: Shashi Yebbare														 #
#        MODIFICATION: Added custom log back XML configuration 					 #
#																				 #
#																				 #
# set -n   # Uncomment to check your syntax, without execution.					 #
#          # NOTE: Do not forget to put the comment back in or					 #
#          #       the shell script will not execute!							 #
#																				 #
##################################################################################









# ####################### BEGIN -- Parameter declaration ##########################

Date=$(date +%m-%d-%Y) # Get Current Date
Time=$(date +%T) # Get Current Time date +"%T"
Type="Author"
Port="4502"
Base="/opt/aem/${Type}/crx-quickstart"
Segmentstore="${Base}/repository/segmentstore"
OAK_JAR="/opt/aem/${Type}/support/oak-run.jar"
SUPPORTDIR="/opt/aem/${Type}/support"
CRXLOGS="${Base}/logs"
LOGFILE="TarComapction_${Date}_${Time}.log"
COUNT=0
DUMPSPATH="${SUPPORTDIR}/compactiondumps"
COMPACTARGS="-Dtar.memoryMapped=true  -Doak.compaction.eagerFlush=true -Dcompaction-progress-log=5000000 -Dcompress-interval=150000000 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DUMPSPATH}"
LOGBACKCONF="${SUPPORTDIR}/logback-compaction.xml"
SDMEMORY="8g"

# ####################### END -- Parameter declaration ############################



# ############# ############# #############
# ##       TIME TO RUN THE SCRIPT        ##
# ##                                     ##
# ## You shouldn't need to edit anything ##
# ## beneath this line                   ##
# ##                                     ##
# ############# ############# #############

# BEGIN -- Function checks the storagae size of segmentstore
function SDRepositorySize {
	echo ">>>> Repository Size: "
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	du -h $Segmentstore  | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
} # END -- Function checks the storagae size of segmentstore

# BEGIN -- Function to bring AEM instance offline
function SDStopAEM {
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	echo ">>>> Stopping AEM ${Type} Instance"  | tee -a "$CRXLOGS/$LOGFILE"
	Command="bash $Base/bin/stop"
	eval $Command | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	echo "Waiting 10 seconds" | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	sleep 10s
	PID=$(cat $Base/conf/cq.pid 2>/dev/null)
	if [ "$PID" ]; then
	   echo " " | tee -a "$CRXLOGS/$LOGFILE"
	   echo "AEM PID $PID" | tee -a "$CRXLOGS/$LOGFILE"
	   echo " " | tee -a "$CRXLOGS/$LOGFILE"
	   if ps -p $PID > /dev/null 2>&1; then
		  eval $Command | tee -a "$CRXLOGS/$LOGFILE"
		  sleep 30s
		  while ps -p $PID > /dev/null 2>&1 && (($COUNT < $MAXCOUNT)); do
			 sleep 10s
			 let COUNT=COUNT+1
		  done
	   else
		  echo "AEM was already stopped" | tee -a "$CRXLOGS/$LOGFILE"
		  echo " " | tee -a "$CRXLOGS/$LOGFILE"
	   fi
	else
		  echo "cq.pid was not found" | tee -a "$CRXLOGS/$LOGFILE"
		  echo "AEM ${Type} is already stopped" | tee -a "$CRXLOGS/$LOGFILE"
	fi
	if ps -p $PID > /dev/null 2>&1; then
	    echo "The AEM application is still running after maxcount" | tee -a "$CRXLOGS/$LOGFILE"
	    WAIT_SECONDS=600
		echo "Waiting additional $WAIT_SECONDS for kill process to complete" | tee -a "$CRXLOGS/$LOGFILE"
		count=0

		while kill $PID > /dev/null
		do
			sleep 1
			((count++))

			if ! ps -p $PID > /dev/null ; then
				break
			fi

			if [ $count -gt $WAIT_SECONDS ]; then
				kill -9 $PID
				break
			fi
		done
		echo "Process has been killed after $count seconds" | tee -a "$CRXLOGS/$LOGFILE"
		echo " " | tee -a "$CRXLOGS/$LOGFILE"
	fi
	echo "AEM ${Type} Successfully stopped" | tee -a "$CRXLOGS/$LOGFILE"
} # END -- Function to bring AEM instance offline

# BEGIN -- Offline Tar Comapction
function SDOfflineCompaction {
	echo ">>>> Starting Offline Tar Compaction Process" | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	
	echo ">>>> Verifying Checkpoints"  | tee -a "$CRXLOGS/$LOGFILE"
	Command="java -server -Xmx${SDMEMORY} ${COMPACTARGS} -Dlogback.configurationFile=${LOGBACKCONF} -jar ${OAK_JAR} checkpoints $Segmentstore"
	eval $Command  | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	
	echo ">>>> Removing UnReferenced Checpoints"  | tee -a "$CRXLOGS/$LOGFILE"
	Command="java -server -Xmx${SDMEMORY} ${COMPACTARGS} -Dlogback.configurationFile=${LOGBACKCONF} -jar ${OAK_JAR} checkpoints $Segmentstore rm-unreferenced"
	eval $Command | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	
	echo ">>>> Compacting Segmentstore" | tee -a "$CRXLOGS/$LOGFILE"
	Command="java -server -Xmx${SDMEMORY} ${COMPACTARGS} -Dlogback.configurationFile=${LOGBACKCONF} -jar ${OAK_JAR} compact $Segmentstore"
	eval $Command | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	
	echo "Waiting 10 seconds"  | tee -a "$CRXLOGS/$LOGFILE"
	echo " " | tee -a "$CRXLOGS/$LOGFILE"
	sleep 10
	echo ">>>> Compaction Process Successfully Completed" | tee -a "$CRXLOGS/$LOGFILE"
} # END -- Offline Tar Comapction

# BEGIN -- Start AEM Instance
function SDStartAEM {
	echo "Starting AEM ${Type} Instance"  | tee -a "$CRXLOGS/$LOGFILE"
	Command="cd $Base/bin && ./start"
	eval $Command | tee -a "$CRXLOGS/$LOGFILE"
	sleep 10
	#Get the process id from AEM
	PID=$(cat $Base/conf/cq.pid 2>/dev/null)
	ps -p $PID
} # END -- Start AEM Instance


# ############################## Actual Script Execution ##############################
# Executing the function accordingly to get repository size before compaction 		  #	
# and execute comapction and check size of the repository after comapction 			  #
#######################################################################################


echo " "
echo "
##############    AEM Offline TAR Compaction  ####################################
# 																				 #
# ███████╗██╗  ██╗██╗   ██╗██████╗ ███████╗██╗   ██╗ ██████╗ ██████╗ ███████╗    #   
# ██╔════╝██║ ██╔╝╚██╗ ██╔╝██╔══██╗██╔════╝██║   ██║██╔═══██╗██╔══██╗██╔════╝    # 
# ███████╗█████╔╝  ╚████╔╝ ██║  ██║█████╗  ██║   ██║██║   ██║██████╔╝███████╗    # 
# ╚════██║██╔═██╗   ╚██╔╝  ██║  ██║██╔══╝  ╚██╗ ██╔╝██║   ██║██╔═══╝ ╚════██║    #
# ███████║██║  ██╗   ██║   ██████╔╝███████╗ ╚████╔╝ ╚██████╔╝██║     ███████║    #
# ╚══════╝╚═╝  ╚═╝   ╚═╝   ╚═════╝ ╚══════╝  ╚═══╝   ╚═════╝ ╚═╝     ╚══════╝    #
#																				 #
#																				 #
# SCRIPT: AEM Offline TAR Compaction											 #
# AUTHOR: Shashi Yebbare														 #
# DATE:   FEB, 09, 2019														  	 #
# REV:    1.3.P 																 #
#         (For Alpha, Beta, Dev, Test and Production)		      				 #
#																				 #
# PLATFORM: AIX, HP-UX, Linux, Solaris								 			 #
#																				 #
# PURPOSE: 	To perform offline AEM compaction on Segmentstore			 		 #
#          	and reduce the size of the AEM repository, Script 		 			 #
#   		uses a custom log-back XML configuration to log         			 #
#			additional compaction information. 									 #
# 																				 # 
# REVISED LIST:																	 #
#        DATE: FEB, 17 2019													 	 #
#        BY: Shashi Yebbare														 #
#        MODIFICATION: Added custom log back XML configuration 					 #
#																				 #
#																				 #
# set -n   # Uncomment to check your syntax, without execution.					 #
#          # NOTE: Do not forget to put the comment back in or					 #
#          #       the shell script will not execute!							 #
#																				 #
##################################################################################

" | tee -a "$CRXLOGS/$LOGFILE"

Date=$(date +%m-%d-%Y) # Get Current Date
OutTime=$(date +%r) # Get Current Time
echo " " | tee -a "$CRXLOGS/$LOGFILE"
echo "Compaction Script -- Start Time: $Date @ $OutTime" | tee -a "$CRXLOGS/$LOGFILE"

echo " " | tee -a "$CRXLOGS/$LOGFILE"
SDStopAEM;
echo " " | tee -a "$CRXLOGS/$LOGFILE"
echo ">>>> Checking Repository size BEFORE Compaction" | tee -a "$CRXLOGS/$LOGFILE"
SDRepositorySize;
echo " " | tee -a "$CRXLOGS/$LOGFILE"
SDOfflineCompaction;
echo " " | tee -a "$CRXLOGS/$LOGFILE"
echo ">>>> Checking Repository size AFTER Compaction" | tee -a "$CRXLOGS/$LOGFILE"
SDRepositorySize;
echo " " | tee -a "$CRXLOGS/$LOGFILE"
SDStartAEM;

# Concluding the Compaction Process
Date=$(date +%m-%d-%Y) # Get Current Date
OutTime=$(date +%r) # Get Current Time
echo " " | tee -a "$CRXLOGS/$LOGFILE"
echo "Compaction Script -- End Time: $Date @ $OutTime" | tee -a "$CRXLOGS/$LOGFILE"

LOGBACK File

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
##############    AEM Offline TAR Compaction  ####################################
#                                          #
# ███████╗██╗  ██╗██╗   ██╗██████╗ ███████╗██╗   ██╗ ██████╗ ██████╗ ███████╗    #   
# ██╔════╝██║ ██╔╝╚██╗ ██╔╝██╔══██╗██╔════╝██║   ██║██╔═══██╗██╔══██╗██╔════╝    # 
# ███████╗█████╔╝  ╚████╔╝ ██║  ██║█████╗  ██║   ██║██║   ██║██████╔╝███████╗    # 
# ╚════██║██╔═██╗   ╚██╔╝  ██║  ██║██╔══╝  ╚██╗ ██╔╝██║   ██║██╔═══╝ ╚════██║    #
# ███████║██║  ██╗   ██║   ██████╔╝███████╗ ╚████╔╝ ╚██████╔╝██║     ███████║    #
# ╚══════╝╚═╝  ╚═╝   ╚═╝   ╚═════╝ ╚══════╝  ╚═══╝   ╚═════╝ ╚═╝     ╚══════╝    #
#                                                                                #
#                                                                                #
# SCRIPT: AEM Offline TAR Compaction - logback-compaction configuration          #
# AUTHOR: Shashi Yebbare                                                         #
# DATE:   FEB, 09, 2019                                                          #
# REV:    1.3.P                                                                  #
#         (For Alpha, Beta, Dev, Test and Production)                            #
#                                                                                #
# PLATFORM: AIX, HP-UX, Linux, Solaris                                           #
#                                                                                #
# PURPOSE:  Script to custom log additional compaction information.              #
#                                                                                # 
# REVISED LIST:                                                                  #
#        DATE: FEB, 17 2019                                                      #
#        BY: Shashi Yebbare                                                      #
#        MODIFICATION: Added custom encoder pattern                              #
#                                                                                #
#                                                                                #
# set -n   # Uncomment to check your syntax, without execution.                  #
#          # NOTE: Do not forget to put the comment back in or                   #
#          #       the shell script will not execute!                            #
#                                                                                #
##################################################################################
 -->
<configuration debug="true">
  <appender name="STDERR" class="ch.qos.logback.core.FileAppender">
    <file>"/Users/shashi/Sites/author/support/SD_Compaction.log"</file>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <logger name="org.apache.jackrabbit.oak.plugins.segment.Compactor" level="DEBUG"/>
  <root level="warn">
    <appender-ref ref="STDERR" />
  </root>
</configuration>

Shashi View All

A passionate devops and automation engineer

Leave a comment