blob: cbc06624957a26b7c6dbdf6edcdaae72c98f1c0b [file] [log] [blame]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Filename:- gpsegsize.sh
# Version:- $Revision$
# Updated:- $Date$
# Status:- Released
# Author:- G Coombe
# Contact:- gcoombe@greenplum.com
# Release date:- Dec 2006
# Release stat:- Released
#******************************************************************************
# Update History
#******************************************************************************
# Ver Date Who Update
#******************************************************************************
# Detailed Description
#******************************************************************************
#******************************************************************************
# Prep Code
WORKDIR=`dirname $0`
# Source required functions file, this required for script to run
# exit if cannot locate this file. Change location of FUNCTIONS variable
# as required.
FUNCTIONS=$WORKDIR/gp_bash_functions.sh
if [ -f $FUNCTIONS ]; then
. $FUNCTIONS
else
echo "[FATAL]:-Cannot source $FUNCTIONS file Script Exits!"
exit 2
fi
#******************************************************************************
# Script Specific Variables
#******************************************************************************
# Log file that will record script actions
CUR_DATE=`$DATE +%Y%m%d`
TIME=`$DATE +%H%M%S`
PROG_NAME=`$BASENAME $0`
# Level of script feedback 0=small 1=verbose
unset VERBOSE
GP_USER=$USER_NAME
EXIT_STATUS=0
#******************************************************************************
# Functions
#******************************************************************************
USAGE () {
$ECHO
$ECHO " `basename $0`"
$ECHO
$ECHO " Script called by gpsizecalc, this should not be run directly"
exit $EXIT_STATUS
}
CHK_CALL () {
FILE_PREFIX=`$ECHO $PARALLEL_STATUS_FILE|$CUT -d"." -f1`
if [ ! -f ${FILE_PREFIX}.$PARENT_PID ];then
$ECHO "[FATAL]:-Not called from from correct parent program"
exit 2
fi
}
SIZE_ERROR_EXIT () {
LOG_MSG "[INFO][$INST_COUNT]:-Start Function $FUNCNAME"
$ECHO "${QE_HOST}|${QE_BASE_DIR}|${QE_PORT}|0" >> $TMPFILE
$ECHO "FAILED:${QE_LINE}" >> $PARALLEL_STATUS_FILE
LOG_MSG "[WARN]:-Failed to process $1 size request"
LOG_MSG "[INFO][$INST_COUNT]:-End Function $FUNCNAME"
exit 1
}
PING_CHK () {
PING_HOST $QE_HOST 1
if [ $RETVAL -ne 0 ];then
SIZE_ERROR_EXIT
fi
}
GET_DATABASE_SIZE () {
LOG_MSG "[INFO][$INST_COUNT]:-Start Function $FUNCNAME"
#Get the database OID
DB_OID=`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH}; env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$DEFAULTDB\" -A -t -c\"select OID from pg_database where datname='$QD_DBNAME'\""`
QE_BASE_DIR=`$BASENAME $QE_DIR`
QE_DB=${QE_DIR}/base/${DB_OID}
$ECHO ${QE_HOST}"|"${QE_BASE_DIR}"|"${QE_PORT}"|"`$TRUSTED_SHELL $QE_HOST "ls -al ${QE_DB}|$GREP -v '^d'|$GREP -vi total 2>/dev/null" |$AWK '{total += \$5} END {print total}'` >> $TMPFILE
RETVAL=$?
if [ $RETVAL -ne 0 ];then SIZE_ERROR_EXIT database;fi
LOG_MSG "[INFO][$INST_COUNT]:-End Function $FUNCNAME"
}
GET_TABLE_SIZE () {
LOG_MSG "[INFO][$INST_COUNT]:-Start Function $FUNCNAME"
#Get the database OID
DB_OID=`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH}; env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$DEFAULTDB\" -A -t -c\"select OID from pg_database where datname='$QD_DBNAME'\""`
#Now get schema OID
SCHEMA_OID=`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH}; env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$QD_DBNAME\" -A -t -c\"select OID from pg_namespace where nspname='${SCHEMA_NAME}'\""`
#Now get the table relfilenode
QE_TABLE_OID=`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH}; env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$QD_DBNAME\" -A -t -c\"select relfilenode from pg_class where relname='${TMP_TABLE_NAME}' and relnamespace=${SCHEMA_OID};\""`
#Can now progress the size request
QE_TABLE=${QE_DIR}/base/${DB_OID}/${QE_TABLE_OID}
QE_BASE_DIR=`$BASENAME $QE_DIR`
$ECHO ${QE_HOST}"|"${QE_BASE_DIR}"|"${QE_PORT}"|"`$TRUSTED_SHELL $QE_HOST "if [ -f $QE_TABLE ];then ls -al ${QE_TABLE};else $ECHO 0 0 0 0 0;fi"|$TAIL -1|$AWK '{print \$5}'` >> $TMPFILE
RETVAL=$?
if [ $RETVAL -ne 0 ];then SIZE_ERROR_EXIT table;fi
$ECHO ${QE_HOST}"|"${QE_BASE_DIR}"|"${QE_PORT}"|"`$TRUSTED_SHELL $QE_HOST "ls -al ${QE_TABLE}.*|$GREP -v '^d'|$GREP -vi total" 2>/dev/null|$AWK '{total += \$5} END {print total}'` >> $TMPFILE
RETVAL=$?
if [ $RETVAL -ne 0 ];then SIZE_ERROR_EXIT table;fi
LOG_MSG "[INFO][$INST_COUNT]:-End Function $FUNCNAME"
}
GET_INDEX_SIZE () {
LOG_MSG "[INFO][$INST_COUNT]:-Start Function $FUNCNAME"
#Get the database OID
DB_OID=`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH}; env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$DEFAULTDB\" -A -t -c\"select OID from pg_database where datname='$QD_DBNAME'\""`
INDEX_ARRAY=(`$TRUSTED_SHELL -n $QE_PRIMARY_HOST "${EXPORT_LIB_PATH};env PGOPTIONS=\"-c gp_session_role=utility\" $PSQL -p $QE_PRIMARY_PORT -d \"$QD_DBNAME\" -A -t -c\"select relfilenode from pg_class where oid in (select indexrelid from pg_index where indrelid in (select oid from pg_class where relname='${TMP_TABLE_NAME}'));\""`)
RETVAL=$?
if [ $RETVAL -ne 0 ] || [ ${#INDEX_ARRAY[@]} -eq 0 ];then
SIZE_ERROR_EXIT index
else
for IDX in ${INDEX_ARRAY[@]}
do
QE_INDEX=${QE_DIR}/base/${DB_OID}/$IDX
QE_BASE_DIR=`$BASENAME $QE_DIR`
$ECHO ${QE_HOST}"|"${QE_BASE_DIR}"|"${QE_PORT}"|"`$TRUSTED_SHELL $QE_HOST "ls -al ${QE_INDEX}"|$TAIL -1|$AWK '{print \$5}'` >> $TMPFILE
$ECHO ${QE_HOST}"|"${QE_BASE_DIR}"|"${QE_PORT}"|"`$TRUSTED_SHELL $QE_HOST "ls -al ${QE_INDEX}.*|$GREP -v '^d'|$GREP -vi total" 2>/dev/null|$AWK '{total += \$5} END {print total}'` >> $TMPFILE
done
fi
LOG_MSG "[INFO][$INST_COUNT]:-End Function $FUNCNAME"
}
#******************************************************************************
# Main Section
#******************************************************************************
trap '$ECHO "KILLED|${QE_LINE}" >> $PARALLEL_STATUS_FILE;ERROR_EXIT "[FATAL]:-[$INST_COUNT]-Recieved INT or TERM signal" 2' INT TERM
while getopts ":v'?'" opt
do
case $opt in
v ) VERSION_INFO ;;
'?' ) USAGE ;;
* ) USAGE
esac
done
#Now process supplied call parameters
PARENT_PID=$1;shift #PID of gpstate process calling this script
CHK_CALL
QE_HOST=$1;shift #Hostname holding database segment
QE_PORT=$1;shift #Segment port
QE_DIR=$1;shift #Segment directory
INST_COUNT=$1;shift #Unique number for this parallel script, starts at 0
LOG_FILE=$1;shift
TABLE_NAME=$1;shift
QD_DBNAME="$1";shift
TYPE=$1;shift
TMPFILE=$1;shift
QD_DBNAME="$1";shift
QE_PRIMARY_HOST=$1;shift # the host name of the primary
QE_PRIMARY_PORT=$1;shift # the port of the primary
QE_PRIMARY_DIR=$1;shift # the dir of the primary
QE_PRIMARY_BASE_DIR=`$BASENAME $QE_PRIMARY_DIR`
LOG_MSG "[INFO][$INST_COUNT]:-Start Main"
SCHEMA_NAME=`$ECHO $TABLE_NAME|$CUT -d"." -f1`
TMP_TABLE_NAME=`$ECHO $TABLE_NAME|$CUT -d"." -f2`
PING_CHK
case $TYPE in
1 ) GET_TABLE_SIZE ;;
2 ) GET_INDEX_SIZE ;;
3 ) GET_DATABASE_SIZE ;;
esac
QE_LINE="${QE_HOST}:${QE_PORT}:${QE_DIR}"
$ECHO "COMPLETED:${QE_LINE}" >> $PARALLEL_STATUS_FILE
LOG_MSG "[INFO][$INST_COUNT]:-End Main"
exit $EXIT_STATUS