Skip to content

Instantly share code, notes, and snippets.

@zyxar
Created December 29, 2011 07:26
Show Gist options
  • Save zyxar/1532584 to your computer and use it in GitHub Desktop.
Save zyxar/1532584 to your computer and use it in GitHub Desktop.
Cluster Server Distribution
#!/bin/bash
CLIENT=/opt/bin/redis-cli
HOSTING_SERVER="brick5"
HOSTING_PORT=6379
REQUEST="${CLIENT} -h ${HOSTING_SERVER}"
ALL_WORKING_SERVERS_SET="locked_server"
RMT_WORKING_SERVERS_SET="avail_server"
AVAIL_SERVER_LOCAL_LIST="brick0 brick1 brick2 brick3 brick4 brick5 brick6"
PPI_GRANT_SET="_grantss_"
PPI_GRANT="`id -un`@`hostname -s`"
PPI_GRANT_ID="`id -un`"
SUB_WORKING_SERVERS_SET="my_server_${PPI_GRANT_ID}"
EVAL_SET="_eval_set_"
EVAL_STRING="eval_${PPI_GRANT_ID}"
EVALUATION_BOOLEAN=1
WORKING_TIME_SET="_grant_time_set_"
WORKING_TIME_STRING="grant_time_${PPI_GRANT_ID}"
acquired_server=''
PUSH_LOCK_SET="push_lock_set"
PUSH_LOCK="locked"
_usage() {
echo "USAGE:"
echo " push your working set:"
echo " $0 -push LOCK_SERVER_LIST IF_EVALUATION EXPIRED_TIME"
echo " e.g.: $0 -push brick1 brick3 brick4 brick6 1 \"13:20\""
echo " clean previous locks:"
echo " $0 -clean"
echo " get working set:"
echo " $0 -get"
exit 1
}
_cleanup() {
#check_uid:
ret=`${REQUEST} SISMEMBER ${PPI_GRANT_SET} ${PPI_GRANT}`
if [ $ret -ne 1 ];then
echo "Your ID ${PPI_GRANT} is not in working set."
echo "exit..."
return
fi
list=`${REQUEST} SMEMBERS ${SUB_WORKING_SERVERS_SET}` #get working set by id
${REQUEST} SREM ${ALL_WORKING_SERVERS_SET} ${list} #rm working set in locked_server
${REQUEST} SADD ${RMT_WORKING_SERVERS_SET} ${list} #add working set back in avail_server
${REQUEST} SREM ${SUB_WORKING_SERVERS_SET} ${list} #cleanup working set
${REQUEST} SREM ${PPI_GRANT_SET} ${PPI_GRANT} #cleanup granted id
${REQUEST} DEL ${WORKING_TIME_STRING} #cleanup granted time
${REQUEST} SREM ${WORKING_TIME_SET} ${WORKING_TIME_STRING}
${REQUEST} DEL ${EVAL_STRING} #cleanup granted evaluation bit
${REQUEST} SREM ${EVAL_SET} ${EVAL_STRING}
}
_lock() {
ret=`${REQUEST} SADD ${PUSH_LOCK_SET} ${PUSH_LOCK}` # 1=succ, 0=fail
return $ret
}
_unlock() {
ret=`${REQUEST} DEL ${PUSH_LOCK_SET} ${PUSH_LOCK}` # 1=succ, 0=unkn
return $ret
}
if [ $# -eq 0 ];then
_usage
fi
case $1 in
'-init'|'init')
${REQUEST} SADD ${RMT_WORKING_SERVERS_SET} ${AVAIL_SERVER_LOCAL_LIST}
;;
'-push'|'push')
shift
_lock
if [ $? -eq 0 ];then #fail to grab lock
echo "Database locked. Try seconds later."
exit 1
fi
while [ $# -gt 2 ];do
ret=`${REQUEST} SISMEMBER ${ALL_WORKING_SERVERS_SET} $1`
if [ $ret -eq 1 ];then
echo "SERVER $1 already locked."
echo "exit..."
_unlock
exit 1
elif [ $ret -eq 0 ];then
acquired_server="${acquired_server} $1"
#echo "acquired_server: ${acquired_server}"
else
echo "unknow error."
echo "exit..."
_unlock
exit 2
fi
shift
done
echo "acquired_server: ${acquired_server}"
for item in ${acquired_server};do
${REQUEST} SMOVE ${RMT_WORKING_SERVERS_SET} ${ALL_WORKING_SERVERS_SET} ${item}
done
case $1 in
1)
EVALUATION_BOOLEAN=1
shift
;;
0)
EVALUATION_BOOLEAN=0
shift
;;
*)
EVALUATION_BOOLEAN=1
;;
esac
${REQUEST} SADD ${SUB_WORKING_SERVERS_SET} ${acquired_server}
${REQUEST} SADD ${PPI_GRANT_SET} ${PPI_GRANT}
#set deadline
${REQUEST} SADD ${WORKING_TIME_SET} ${WORKING_TIME_STRING}
${REQUEST} SET ${WORKING_TIME_STRING} "$1"
#set eval_bit
${REQUEST} SADD ${EVAL_SET} ${EVAL_STRING}
${REQUEST} SET ${EVAL_STRING} ${EVALUATION_BOOLEAN}
#set expired time
expired_time=`date -d $1 +%s`
if [ "z${expired_time}" != "z" ];then
${REQUEST} EXPIREAT ${WORKING_TIME_STRING} ${expired_time}
${REQUEST} EXPIREAT ${EVAL_STRING} ${expired_time}
fi
_unlock
;;
'-clean'|'clean')
echo "CLEAN..."
_cleanup
;;
'-get'|'get'|'-fetch'|'fetch')
echo "Available servers: "
${REQUEST} SMEMBERS "${RMT_WORKING_SERVERS_SET}"
echo "Locked servers: "
${REQUEST} SMEMBERS "${ALL_WORKING_SERVERS_SET}"
echo "Locked by "
${REQUEST} SMEMBERS "${PPI_GRANT_SET}"
for item in `${REQUEST} SMEMBERS ${WORKING_TIME_SET}`;do
echo -n " ${item} "
${REQUEST} GET ${item}
done
echo "is evaluation? "
for item in `${REQUEST} SMEMBERS ${EVAL_SET}`;do
echo -n " ${item} "
${REQUEST} GET ${item}
done
exit 1
;;
*)
_usage
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment