Project

General

Profile

Bug #61472 » kernel_untar.sh

Christopher Hoffman, 05/26/2023 04:44 PM

 
KERNEL_TAR_URL="https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.280.tar.gz"
KERNEL_VERSION=`echo $KERNEL_TAR_URL | cut -d '/' -f8 | sed 's/.tar.gz$//'`
MOUNT=/mnt/test/
MASTER_COPY=$KERNEL_VERSION".tar.gz"
KERNEL_DIRECTORY=$KERNEL_VERSION
MASTER_CHECKSUM_FILE="$MOUNT/kernel_hash"
# Allow only upto 90% full disk space
DISK_SPACE_FULL_THRESHOLD=45
# During make free space, don't delete below 50% usage
FREE_SPACE_THRESHOLD=20
# SIGNALLING THROUGH FILES
PAUSE_FILE="IO_PAUSE"
RUNNING_FILE="IO_RUNNING"

get_disk_usage()
{
usage=`df $MOUNT --output=pcent | sed -n 2p | cut -d "%" -f1`
echo $usage
}


# Auto cleanup of directories in case if we don't enough space
# We will bring down the space usage to 50% and stop deletion
# so that if failover occurs at the point after deletion but before
# beginning directory creation we will still have some data
make_free_space()
{
ls -d "$KERNEL_VERSION"_[0-9]*
if [ $? -eq 0 ]; then
testdir=`ls -d "$KERNEL_VERSION"_[0-9]* | sed -n 1p`
echo "Cleaning up $testdir "
rm -rf $testdir
sync -f $MOUNT
cur_usage=$(get_disk_usage)
if [ $cur_usage -gt $FREE_SPACE_THRESHOLD ]; then
make_free_space
fi
fi
}

# block if there is no diskspace
block_if_no_space_left()
{
usage=$(get_disk_usage)
if [ $usage -gt $DISK_SPACE_FULL_THRESHOLD ]; then
echo "Disk usage greater than "$DISK_SPACE_FULL_THRESHOLD"%, Can't continue IO"
sleep 10
make_free_space
fi
}

# IO status needs to be paused if checksum needs to be calculated
wait_if_pause()
{
while [ -f $PAUSE_FILE ]
do
if [ -f $RUNNING_FILE ]; then
unlink $RUNNING_FILE
sync -f $MOUNT
fi
sleep 10
done
}

# set running state
set_running_state()
{
touch $RUNNING_FILE
sync -f $MOUNT
}

# Run kernal untar
untar_kernal_file()
{
# Sleeping for some random interval of time to reduce stress
echo "Sleeping for $sleep_time"
sleep $sleep_time
tar xvfz $MASTER_COPY | pv -L 1k --timer
if [ $? -ne 0 ];
then
echo "Failed to untar kernel"
exit 1
fi
}

if [ -f "$MOUNT""/""$MASTER_COPY" ]; then
echo "Master copy tar already exists"
else
echo "Downloading kernel tar"
wget $KERNEL_TAR_URL -O $MOUNT/$MASTER_COPY
if [ $? -eq 0 ];
then
echo "Kernel tar ball downloaded successfully"
else
echo "Failed to download kernel"
exit 1
fi
fi

if [ -f "$MOUNT""/""$MASTER_COPY" ]; then
if [ -d "$MOUNT""/""$KERNEL_DIRECTORY"_original ]; then
echo "Reference Kernel dir already exists"
else
# If we have broken linux-<version> dir, lets clean it up
if [ -d "$MOUNT""/""$KERNEL_DIRECTORY" ]; then
rm -rf $MOUNT/$KERNEL_DIRECTORY
fi
cd $MOUNT
tar xfz $MASTER_COPY
if [ $? -ne 0 ];
then
echo "Failed to untar reference kernel"
exit 1
fi
arequal-checksum $MOUNT/$KERNEL_DIRECTORY>$MASTER_CHECKSUM_FILE
echo "Performing mv operation for saving original kernal Directory"
mv $MOUNT/$KERNEL_DIRECTORY $MOUNT/$KERNEL_DIRECTORY"_original"
fi
fi

# From here keep a loop of untaring and renaming the kernel dirs
sleep_time=1
#sleep_time=$(shuf -i 180-500 -n1)
while true
do
sync -f $MOUNT
echo "Sleeping for $sleep_time"
sleep $sleep_time
block_if_no_space_left
# There could be half untared linx dir
# may be due to failover , so we need to cleanup
if [ -d $KERNEL_DIRECTORY ]; then
echo "Performing rm opeation of $KERNEL_DIRECTORY"
rm -rf $KERNEL_DIRECTORY
fi
cd $MOUNT
wait_if_pause
# We are out of pause state
# create a file for IO running
set_running_state
# run io
untar_kernal_file
echo "Performing mv operation of kernal directory to new directiry location"
mv $MOUNT/$KERNEL_DIRECTORY $MOUNT/$KERNEL_DIRECTORY"_`date +%s`"

done
(1-1/7)