Let's say you have
a venti server and
you would like to mirror its contents to another one. How to do it?
First, you will need to have another venti configured. Please look at
the venti(8) manual page to know how to do it, or see my post on
how to set up a venti server. Please note
that, if you want to run both servers at the same time, and if they
are in the same machine, they must listen to different port numbers.
There are several ways to copy the contents of a venti server into
another:
- venti-copy
With venti-copy you can copy an entire tree of blocks
from one venti server to another. Both servers must be running
in order to copy the blocks.
If you have the list of scores all the trees in the
file scores.txt, you could use the following command to
start copying:
cat scores.txt | while read score ; do venti-copy $venti1 $venti2 $a ; done
Advantages: you don't need to stop either server; arena
partitions in each server can have different geometry
Disadvantages: it is very slow, and you need to know a priori
the list of VtRoot scores you want to copy.
- venti-mirrorarenas
This command can be used to copy every arena from one arena
partition to another. Both servers should be stopped.
Advantages: it is very fast, and there are several tests to
check that the arena geometries are the same.
Disadvantages: it only works if source and destination have
exactly the same number of arenas of the same size; after
finishing the copy, you must use venti-buildarenas in
the destination server.
- venti-rdarena and venti-wrarena
venti-rdarena reads one arena from a venti server and
writes it to standard output; venti-wrarena writes an
arena from a file to a venti server.
In order to mirror one venti server, you could read all its
arenas with venti-rdarena, one by one, and then write
them to another server with venti-wrarena. Both
servers should be stopped.
Advantages: it works even if source and destination have
different number of arenas; it is faster than venti-copy.
Disadvantages: it only works if source and destination have
arenas of the same size; it is very slow if your venti servers
have a lot of arenas (each invocation of these executables read
all the arena map); after finishing the copy, you must
use venti-buildarenas in the destination server.
- Copy all the arenas by hand
If you figure out the position in the arena partition of each
arena, and its size, you can yust copy the arenas
with dd. Both servers should be stopped.
For example, if you formatted the arena partitions with the
default arenasize and blocksize, then the arenas will have 512MB
(536870912 bytes), and will be located in the position 794624 +
536870912*n. So, you could use the following loop to copy arenas
$start to $end, from file $orig to $dest:
for i in $( seq $start $end )
do
echo "Copying arena $i from $start to $end..."
skip=$(( 97 + $i * 65536 ))
dd if="$orig" bs=8192 skip=$skip count=65536 seek=$skip of="$dest"
done
Advantages: it is very fast.
Disadvantages: it only works if source and destination have
arenas of the same size; you have to make sure that the arenas
are located exactly where you are reading and writting them;
after finishing the copy, you must
use venti-buildarenas in the destination server.