diff options
Diffstat (limited to 'extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh')
| -rwxr-xr-x | extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh b/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh new file mode 100755 index 00000000000..ca17a903549 --- /dev/null +++ b/extras/hook-scripts/add-brick/post/disabled-quota-root-xattr-heal.sh @@ -0,0 +1,145 @@ +#!/bin/sh + +##--------------------------------------------------------------------------- +## This script updates the 'limit-set' xattr on the newly added node. Please +## refer hook-scripts/add-brick/pre/S28Quota-root-xattr-heal.sh for the complete +## description. +## Do the following only if limit configured on root. +## 1. Do an auxiliary mount. +## 2. Get 'limit-set' xattr on root +## 3. Set xattrs with the same value on the root. +## 4. Disable itself +##--------------------------------------------------------------------------- + +QUOTA_LIMIT_XATTR="trusted.glusterfs.quota.limit-set" +QUOTA_OBJECT_LIMIT_XATTR="trusted.glusterfs.quota.limit-objects" +MOUNT_DIR=$(mktemp -d -t "${0##*/}.XXXXXX"); +OPTSPEC="volname:,version:,gd-workdir:,volume-op:" +PROGNAME="Quota-xattr-heal-add-brick" +VOL_NAME= +VERSION= +VOLUME_OP= +GLUSTERD_WORKDIR= +ENABLED_NAME_PREFIX="S28" +ENABLED_NAME="Quota-root-xattr-heal.sh" + +THIS_SCRIPT=$(echo "${0}" | awk -F'/' '{print $NF}') + +cleanup_mountpoint () +{ + + if umount -f "${MOUNT_DIR}"; then + return $? + fi + + if rmdir "${MOUNT_DIR}"; then + return $? + fi +} + +disable_and_exit () +{ + if [ -e "${ENABLED_STATE}" ] + then + unlink "${ENABLED_STATE}"; + exit $? + fi + + exit 0 +} + +get_and_set_xattr () +{ + XATTR=$1 + + VALUE=$(getfattr -n "${XATTR}" -e hex --absolute-names "${MOUNT_DIR}" 2>&1) + RET=$? + if [ 0 -eq ${RET} ]; then + VALUE=$(echo "${VALUE}" | grep "${XATTR}" | awk -F'=' '{print $NF}') + setfattr -n "${XATTR}" -v "${VALUE}" "${MOUNT_DIR}"; + RET=$? + else + if echo "${VALUE}" | grep -iq "No such attribute" ; then + RET=0 + fi + fi + + return ${RET}; +} + +##------------------------------------------ +## Parse the arguments +##------------------------------------------ +ARGS=$(getopt -o '' -l ${OPTSPEC} -n ${PROGNAME} -- "$@") +eval set -- "$ARGS" + +while true; +do + case $1 in + --volname) + shift + VOL_NAME=$1 + ;; + --version) + shift + VERSION=$1 + ;; + --gd-workdir) + shift + GLUSTERD_WORKDIR=$1 + ;; + --volume-op) + shift + VOLUME_OP=$1 + ;; + *) + shift + break + ;; + esac + shift +done +##---------------------------------------- + +# Avoid long lines +ENABLED_STATE_1="${GLUSTERD_WORKDIR}/hooks/${VERSION}/${VOLUME_OP}/" +ENABLED_STATE_2="post/${ENABLED_NAME_PREFIX}${VOL_NAME}-${ENABLED_NAME}" +ENABLED_STATE="${ENABLED_STATE_1}${ENABLED_STATE_2}" + +if [ "${THIS_SCRIPT}" != *"${VOL_NAME}"* ]; then + exit 0 +fi + +## Is quota enabled? +FLAG=$(grep "^features.quota=" "${GLUSTERD_WORKDIR}/vols/${VOL_NAME}/info" \ +| awk -F'=' '{print $NF}'); +if [ "${FLAG}" != "on" ] +then + disable_and_exit +fi + +## ----------------------------------- +## Mount the volume in temp directory. +## ----------------------------------- +# Avoid long lines +CMD_1="glusterfs -s localhost" +CMD_2="--volfile-id=${VOL_NAME} client-pid=-42 ${MOUNT_DIR}" +CMD="${CMD_1}${CMD_2}" + +if ${CMD} +then + exit $?; +fi +## ----------------------------------- + +RET1=$(get_and_set_xattr "${QUOTA_LIMIT_XATTR}") +RET2=$(get_and_set_xattr "${QUOTA_OBJECT_LIMIT_XATTR}") + +## Clean up and exit +cleanup_mountpoint; + +if [ "${RET1}" -ne 0 ] || [ "${RET2}" -ne 0 ]; then + exit 1 +fi + +disable_and_exit; |
