Created
December 29, 2011 07:26
-
-
Save zyxar/1532584 to your computer and use it in GitHub Desktop.
Cluster Server Distribution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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