#!/bin/sh

# Copyright  2004 Sun Microsystems, Inc. All rights reserved. 
# 
# Sun Microsystems, Inc. has intellectual property rights relating to
# technology embodied in the product that is described in this document.
# In particular, and without limitation, these intellectual property rights
# may include one or more of the U.S. patents listed at
# http://www.sun.com/patents and one or more additional patents or pending
# patent applications in the U.S. and in other countries.
# 
# U.S. Government Rights - Commercial software. Government users are subject
# to the Sun Microsystems, Inc. standard license agreement and applicable
# provisions of the FAR and its supplements.
# 
# Use is subject to license terms. 
# 
# This distribution may include materials developed by third parties. Sun,
# Sun Microsystems, the Sun logo, Java and Sun[tm] ONE are trademarks or
# registered trademarks of Sun Microsystems, Inc. in the U.S. and other
# countries. 
# 
# Copyright  2004 Sun Microsystems, Inc. Tous droits rservs. Sun
# Microsystems, Inc. dtient les droits de proprit intellectuels relatifs
#  la technologie incorpore dans le produit qui est dcrit dans ce document.
# En particulier, et ce sans limitation, ces droits de proprit
# intellectuelle peuvent inclure un ou plus des brevets amricains lists
#  l'adresse http://www.sun.com/patents et un ou les brevets supplmentaires
# ou les applications de brevet en attente aux Etats - Unis et dans les
# autres pays.
# 
# L'utilisation est soumise aux termes du contrat de licence.
# 
# Cette distribution peut comprendre des composants dvelopps par des
# tierces parties.
# 
# Sun, Sun Microsystems, le logo Sun, Java et Sun[tm] ONE sont des marques
# de fabrique ou des marques dposes de Sun Microsystems, Inc. aux
# Etats-Unis et dans d'autres pays.

#############################################################################
tuneMagnus() {
    tune_file="$CONTAINER_INSTANCE_DIR/config/magnus.conf"

    $ECHO $LINE_SEP
    $ECHO "Tuning $tune_file..."
    $ECHO
    $ECHO "File                 : $tune_file"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   RqThrottle"
    $ECHO "Current Value        : RqThrottle=`getMagnusEntry $tune_file 'RqThrottle'"
    $ECHO "Recommended Value    : RqThrottle=$numRQThrottle"
    $ECHO
    $ECHO "2.   RqThrottleMin"
    $ECHO "Current Value        : RqThrottleMin=`getMagnusEntry $tune_file 'RqThrottleMin'"
    $ECHO "Recommended Value    : RqThrottleMin=$AMTUNE_NUM_WS_RQTHROTTLE_MIN"
    $ECHO
    $ECHO "3.   ThreadIncrement"
    $ECHO "Current Value        : ThreadIncrement=`getMagnusEntry $tune_file 'ThreadIncrement'"
    $ECHO "Recommended Value    : ThreadIncrement=$AMTUNE_NUM_WS_THREAD_INCREMENT"
    $ECHO
    $ECHO "4.   ConnQueueSize"
    $ECHO "Current Value        : ConnQueueSize=`getMagnusEntry $tune_file 'ConnQueueSize'"
    $ECHO "Recommended Value    : ConnQueueSize=$AMTUNE_NUM_TCP_CONN_SIZE"
    $ECHO
    $ECHO "5.   ListenQ"
    $ECHO "Current Value        : ListenQ=`getMagnusEntry $tune_file 'ListenQ'"
    $ECHO "Recommended Value    : ListenQ=$AMTUNE_NUM_TCP_CONN_SIZE"
    $ECHO
    $ECHO

    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi

    check_file_for_write $tune_file
    if [ $? = 100 ]; then
        return
    fi

    delete_line $tune_file "RqThrottle"
    delete_line $tune_file "RqThrottleMin"
    delete_line $tune_file "ThreadIncrement"
    delete_line $tune_file "ConnQueueSize"
    delete_line $tune_file "ListenQ"
    delete_line $tune_file "# Start: Identity Server Tuning"
    delete_line $tune_file "# End: Identity Server Tuning"

    add_to_end $tune_file "# Start: Identity Server Tuning : `date`"
    add_to_end $tune_file "RqThrottle $numRQThrottle"
    add_to_end $tune_file "RqThrottleMin $AMTUNE_NUM_WS_RQTHROTTLE_MIN"
    add_to_end $tune_file "ThreadIncrement $AMTUNE_NUM_WS_THREAD_INCREMENT"
    add_to_end $tune_file "ConnQueueSize $AMTUNE_NUM_TCP_CONN_SIZE"
    add_to_end $tune_file "ListenQ $AMTUNE_NUM_TCP_CONN_SIZE"
    add_to_end $tune_file "# End: Identity Server Tuning"
}

tuneServerXML() {
    tune_file="$CONTAINER_INSTANCE_DIR/config/server.xml"

    $ECHO $LINE_SEP
    $ECHO "Tuning $tune_file..."
    $ECHO
    $ECHO "File                 : $tune_file"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   Acceptor Threads"
    $ECHO "Current Value        : acceptorthreads=`get_token_in_line $tune_file 'acceptorthreads' 'acceptorthreads'"
    $ECHO "Recommended Value    : acceptorthreads=$acceptorThreads"
    $ECHO
    $ECHO "2.   nativelibrarypathprefix"
    $ECHO "Current Value        : nativelibrarypathprefix=`get_token_in_line $tune_file 'nativelibrarypathprefix' 'nativelibrarypathprefix'"
    $ECHO "Recommended Value    : Append /usr/lib/lwp to nativelibrarypathprefix (if Solaris 8)"
    $ECHO
    $ECHO "3.   Max and Min Heap Size"
    $ECHO "Current Value        : Min Heap: `getServerXMLJVMOptionEntry $tune_file '-Xms'` Max Heap: `getServerXMLJVMOptionEntry $tune_file '-Xmx'`"
    $ECHO "Recommended Value    : -Xms${maxHeapSize}M -Xmx${maxHeapSize}M"
    $ECHO
    $ECHO "4.   LogGC Output"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-Xloggc'`"
    $ECHO "Recommended Value    : -Xloggc:$CONTAINER_INSTANCE_DIR/logs/gc.log"
    $ECHO
    $ECHO "5.   JVM in Server mode"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-server'`"
    $ECHO "Recommended Value    : -server"
    $ECHO
    $ECHO "6.   Stack Size"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-Xss'`"
    $ECHO "Recommended Value    : -Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB}k"
    $ECHO
    $ECHO "7.   New Size"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:NewSize'`"
    $ECHO "Recommended Value    : -XX:NewSize=${maxNewSize}M"
    $ECHO
    $ECHO "8.   Max New Size"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:MaxNewSize'`"
    $ECHO "Recommended Value    : -XX:MaxNewSize=${maxNewSize}M"
    $ECHO
    $ECHO "9.   Perm Size"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:PermSize'`"
    $ECHO "Recommended Value    : -XX:PermSize=${maxPermSize}M (if the calculated value is >= ${AMTUNE_MIN_PERM_SIZE_WS61}M )"
    $ECHO
    $ECHO "10.  Max Perm Size"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:MaxPermSize'`"
    $ECHO "Recommended Value    : -XX:MaxPermSize=${maxPermSize}M (if the calculated value is >= ${AMTUNE_MIN_PERM_SIZE_WS61}M )"
    $ECHO
    $ECHO "11.  Disable Explicit GC"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+DisableExplicitGC'`"
    $ECHO "Recommended Value    : -XX:+DisableExplicitGC"
    $ECHO
    $ECHO "12.  Use Parallel GC"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+UseParNewGC'`"
    $ECHO "Recommended Value    : -XX:+UseParNewGC"
    $ECHO
    $ECHO "13.  CMSPermGenSweepingEnabled"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+CMSPermGenSweepingEnabled'`"
    $ECHO "Recommended Value    : -XX:+CMSPermGenSweepingEnabled"
    $ECHO
    $ECHO "14.  CMS Class Unloading"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+CMSClassUnloadingEnabled'`"
    $ECHO "Recommended Value    : -XX:+CMSClassUnloadingEnabled"
    $ECHO
    $ECHO "15.  CMS Full GCs before Compact"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+UseCMSCompactAtFullCollection'`"
    $ECHO "Recommended Value    : -XX:+UseCMSCompactAtFullCollection"
    $ECHO
    $ECHO "16.  CMS Full GCs before Compact"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:CMSFullGCsBeforeCompaction'`"
    $ECHO "Recommended Value    : -XX:CMSFullGCsBeforeCompaction=0"
    $ECHO
    $ECHO "17.  Soft Reference Cleanup"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:SoftRefLRUPolicyMSPerMB'`"
    $ECHO "Recommended Value    : -XX:SoftRefLRUPolicyMSPerMB=0"
    $ECHO
    $ECHO "18.  Print Class Histogram"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+PrintClassHistogram'`"
    $ECHO "Recommended Value    : -XX:+PrintClassHistogram"
    $ECHO
    $ECHO "19.  Print GC Details"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+PrintGCDetails'`"
    $ECHO "Recommended Value    : -XX:+PrintGCDetails"
    $ECHO
    $ECHO "20.  Print GC Time Stamps"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+PrintGCTimeStamps'`"
    $ECHO "Recommended Value    : -XX:+PrintGCTimeStamps"
    $ECHO
    $ECHO "21.  OverrideDefaultLibthread (if Solaris 8)"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+OverrideDefaultLibthread'`"
    $ECHO "Recommended Value    : -XX:+OverrideDefaultLibthread" 
    $ECHO
    $ECHO "22.  Enable Concurrent Mark Sweep GC"
    $ECHO "Current Value        : `getServerXMLJVMOptionEntry $tune_file '-XX:+UseConcMarkSweepGC'`"
    $ECHO "Recommended Value    : -XX:+UseConcMarkSweepGC" 
    $ECHO
    $ECHO
 
    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi

    check_file_for_write $tune_file
    if [ $? = 100 ]; then
        return
    fi

    substitute_token_in_line $tune_file "acceptorthreads" "acceptorthreads" "$acceptorThreads" 0 ":"

    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
        $ECHO  "Solaris 8 specific changes"
        substitute_token_in_line $tune_file "nativelibrarypathprefix" "nativelibrarypathprefix" "/usr/lib/lwp" 2 ":"
    fi

    delete_line $tune_file "Start: Performance Related JVM Options for IS"
    delete_line $tune_file "<JVMOPTIONS>-Xms"
    delete_line $tune_file "<JVMOPTIONS>-Xmx"
    delete_line $tune_file "<JVMOPTIONS>-Xloggc"
    delete_line $tune_file "<JVMOPTIONS>-Xrs"
    delete_line $tune_file "<JVMOPTIONS>-server"
    delete_line $tune_file "<JVMOPTIONS>-Xss"
    delete_line $tune_file "<JVMOPTIONS>-XX:NewSize"
    delete_line $tune_file "<JVMOPTIONS>-XX:MaxNewSize"
    delete_line $tune_file "<JVMOPTIONS>-XX:PermSize"
    delete_line $tune_file "<JVMOPTIONS>-XX:MaxPermSize"
    delete_line $tune_file "<JVMOPTIONS>-XX:CMSFullGCsBeforeCompaction"
    delete_line $tune_file "<JVMOPTIONS>-XX:+DisableExplicitGC"
    delete_line $tune_file "<JVMOPTIONS>-XX:+UseParNewGC"
    delete_line $tune_file "<JVMOPTIONS>-XX:+UseConcMarkSweepGC"
    delete_line $tune_file "<JVMOPTIONS>-XX:+CMSPermGenSweepingEnabled"
    delete_line $tune_file "<JVMOPTIONS>-XX:+CMSClassUnloadingEnabled"
    delete_line $tune_file "<JVMOPTIONS>-XX:+UseCMSCompactAtFullCollection"
    delete_line $tune_file "<JVMOPTIONS>-XX:SoftRefLRUPolicyMSPerMB"
    delete_line $tune_file "<JVMOPTIONS>-XX:+PrintClassHistogram"
    delete_line $tune_file "<JVMOPTIONS>-XX:+PrintGCDetails"
    delete_line $tune_file "<JVMOPTIONS>-XX:+PrintGCTimeStamps"
    delete_line $tune_file "<JVMOPTIONS>-XX:+OverrideDefaultLibthread"
    delete_line $tune_file "End: Performance Related JVM Options for IS"

    insert_line $tune_file "java.util.logging.manager" "<!-- Start: Performance Related JVM Options for IS -->"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-Xms${maxHeapSize}M -Xmx${maxHeapSize}M</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-Xloggc:$CONTAINER_INSTANCE_DIR/logs/gc.log</JVMOPTIONS>"
    #insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-Xrs</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-server</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB}k</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:NewSize=${maxNewSize}M</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:MaxNewSize=${maxNewSize}M</JVMOPTIONS>"

    if [ $maxPermSize -ge $AMTUNE_MIN_PERM_SIZE_WS61 ]; then
        insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:PermSize=${maxPermSize}M</JVMOPTIONS>"
        insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:MaxPermSize=${maxPermSize}M</JVMOPTIONS>"
    fi

    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+DisableExplicitGC</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+UseParNewGC</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+UseConcMarkSweepGC</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+CMSPermGenSweepingEnabled</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+CMSClassUnloadingEnabled</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+UseCMSCompactAtFullCollection</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:CMSFullGCsBeforeCompaction=0</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:SoftRefLRUPolicyMSPerMB=0</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+PrintClassHistogram</JVMOPTIONS>"
    #insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+PrintGCDetails</JVMOPTIONS>"
    insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+PrintGCTimeStamps</JVMOPTIONS>"

    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
        $ECHO  "Solaris 8 specific changes"
        insert_line $tune_file "java.util.logging.manager" "    <JVMOPTIONS>-XX:+OverrideDefaultLibthread</JVMOPTIONS>"
    fi


    insert_line $tune_file "java.util.logging.manager" "<!-- End: Performance Related JVM Options for IS -->"

}

#############################################################################
# Start of main program
#############################################################################
SCRIPT_LOCATION=`/usr/bin/dirname $0`

# import the environment
if [ -f $SCRIPT_LOCATION/amtune-env ]; then
    if [ ! "$INIT_STATUS" = "INIT_COMPLETE" ]; then
        . $SCRIPT_LOCATION/amtune-env
    fi
fi

$ECHO "IS - Web Server Tuning Script"                   1>>$DEBUG_FILE 2>&1

tuneMagnus                                              1>>$DEBUG_FILE 2>&1
tuneServerXML                                           1>>$DEBUG_FILE 2>&1

$ECHO $PARA_SEP                                         1>>$DEBUG_FILE 2>&1
