16767a8f6e
continuous replication of a zfs filesystem, to another filesystem. That filesystem can be on another machine, or on the same machine. It also handles 'failover', as simply as "zrep failover datapool/yourfs". This will conveniently handle all the details of - Making 'yourfs' be a data destination, rather than a source - Making 'yourfs' be read-only - Making the destination fs be "live", and ready to transfer data to yourfs WWW: http://www.bolthole.com/solaris/zrep/ PR: ports/184086 Submitted by: Oleg Ginzburg <olevole@olevole.ru>
94 lines
3.1 KiB
Text
94 lines
3.1 KiB
Text
--- zrep.orig 2013-05-13 22:01:15.000000000 +0400
|
|
+++ zrep 2013-11-19 18:37:52.921978370 +0400
|
|
@@ -15,7 +15,6 @@
|
|
ZREP_PATH=${ZREP_PATH:-zrep} #Set to /path/to/zrep, if needed, for remote
|
|
#ZREP_CREATE_FLAGS="-o whatever" #Set for extra options on remote zfs create
|
|
|
|
-
|
|
#########################################################################
|
|
# Everyting else below here, should not be touched. First we have autodetect
|
|
# routines, and then internal utilities such as locking functions.
|
|
@@ -35,8 +34,8 @@
|
|
|
|
# dump the usage message, and check for capabilities
|
|
# make sure we dont spew for non-root, so that "zrep status" works
|
|
-case `id` in
|
|
- *\(root\))
|
|
+case `whoami` in
|
|
+ root)
|
|
zrep_checkfile=/var/run/zrep.check.$$
|
|
;;
|
|
*)
|
|
@@ -109,7 +108,8 @@
|
|
# Note that we check for "us, OR our global parent", if different
|
|
#
|
|
zrep_has_global_lock(){
|
|
- lockpid=`ls -l $Z_GLOBAL_LOCKFILE 2>/dev/null |awk -F/ '{print $NF}'`
|
|
+ [ ! -f "${Z_GLOBAL_LOCKFILE}" ] && return 1
|
|
+ lockpid=`cat ${Z_GLOBAL_LOCKFILE}`
|
|
if [[ "$lockpid" == "" ]] ; then return 1 ; fi
|
|
if [[ "$lockpid" != "$Z_GLOBAL_PID" ]] ; then
|
|
if [[ "$lockpid" != "$$" ]] ; then
|
|
@@ -127,7 +127,10 @@
|
|
zrep_get_global_lock(){
|
|
typeset retry_count=$Z_LOCK_RETRY
|
|
|
|
- ln -s /proc/$Z_GLOBAL_PID $Z_GLOBAL_LOCKFILE && return 0
|
|
+ if [ ! -f "${Z_GLOBAL_LOCKFILE}" ] ; then
|
|
+ echo $Z_GLOBAL_PID > $Z_GLOBAL_LOCKFILE
|
|
+ return 0
|
|
+ fi
|
|
|
|
# otherwise, deal with fail
|
|
# Check for dead old holder first.
|
|
@@ -135,7 +138,10 @@
|
|
|
|
while (( retry_count > 0 )); do
|
|
sleep 1
|
|
- ln -s /proc/$Z_GLOBAL_PID $Z_GLOBAL_LOCKFILE && return 0
|
|
+ if [ ! -f "${Z_GLOBAL_LOCKFILE}" ] ; then
|
|
+ echo $Z_GLOBAL_PID > $Z_GLOBAL_LOCKFILE
|
|
+ return 0
|
|
+ fi
|
|
retry_count=$((retry_count-1))
|
|
done
|
|
|
|
@@ -178,7 +184,9 @@
|
|
typeset check=`zrep_fs_lock_pid $1` newcheck
|
|
if [[ "$check" != "-" ]] ; then
|
|
# validate fs lock before giving up
|
|
- ls -d /proc/$check >/dev/null 2>&1 && return 1
|
|
+ if [ "${check}" != "-" ] ; then
|
|
+ [ -f "${Z_GLOBAL_LOCKFILE}" ] && return 1
|
|
+ fi
|
|
fi
|
|
|
|
zrep_get_global_lock || return 1
|
|
@@ -257,8 +265,7 @@
|
|
|
|
zrep_gettimeinseconds(){
|
|
# unfortunately, solaris date doesnt do '%s', so need to use perl
|
|
- typeset PATH=$PERL_BIN:$PATH
|
|
- perl -e 'print int(time);'
|
|
+ date +%s
|
|
}
|
|
###### zrep_status
|
|
|
|
@@ -713,7 +720,7 @@
|
|
READONLYPROP="-o readonly=on"
|
|
else
|
|
READONLYPROP=""
|
|
- print Ancient local version of ZFS detected.
|
|
+# print Ancient local version of ZFS detected.
|
|
print Creating destination filesystem as separate step
|
|
zrep_ssh $desthost zfs create $ZREP_CREATE_FLAGS -o readonly=on $destfs || zrep_errquit "Cannot create $desthost:$destfs"
|
|
fi
|
|
@@ -757,7 +764,7 @@
|
|
# Successful initial sync! Woo! okay record that, etc.
|
|
# ... after stupid old-zfs-compat junk, that is
|
|
if (( ! Z_HAS_X )) ; then
|
|
- print Debug: Because you have old zfs support, setting remote properties by hand
|
|
+# print Debug: Because you have old zfs support, setting remote properties by hand
|
|
zrep_ssh $desthost zfs set readonly=on $destfs ||
|
|
clearquit Could not set readonly for $desthost:$destfs
|
|
|