[Gluster-devel] ECC translator

Csibra Gergo gergo at csibra.hu
Wed Dec 26 15:52:52 UTC 2007


Wednesday, December 5, 2007, 3:16:16 PM, Csibra Gergo wrote:

> So, I want to make an ECC translator...

Well, the working prototype of this translator is done. You can
download from http://www.csibra.hu/glusterfs/ecc.tar.gz

This code is GPLed, so feel free to put in glusterfs main source.

I've put this under features, so extract the ecc.tar.gz under
xlators/features.

cd ecc/src
make
make install

example config files located under ecc/src/config directory, one for
client (very simple) and one for server.

you can test with this config files if you make 3 directories:

/mnt/gluster1
/mnt/gluster2
/mnt/glusterclient

and start the server:

glusterfsd -f /etc/glusterfs/ecc-server.vol

and the client

glusterfs -f /etc/glusterfs/ecc-client /mnt/glusterclient

Server uses two subvolume, one for files (user files, data files) this
is the first subvolume and one for ecc files, this is the second
subvolume. All of the ecc file named as

.ORIGINALFILE.ecc

for example the if I copy the ecc.c file on ecc subvolume
(/mnt/glusterclient after mount) the file copied in the firs subvolume
(/mnt/gluster1) and another .ecc.c.ecc file will be created in
(/mnt/gluster2).

There are some restrictions:

because it makes 4 ecc bytes for 32 data bytes, this version only
works if the write offset is on 32 bytes bound, and data length is
multiple of 32 bytes.

with 4 ecc bytes this can correct 2-4 bit error in every 32 bytes
block (this is the same error correction as used in CD-s (there's 2048
data bytes and 256 ecc bytes for each block).

My first idea was to write the ecc datas to the same subvolume as the
data files, but I have some problems:

I can not create an other FD for writing in ecc file. I knew the ino
number, and I try to do this in ecc_create_cbk when callbacked after
the ecc file creation on subvolume:

inode_t *eccinode = update_inode(inode->table, inode, "eccinode", eccstbuf);
fd_t = fd_create(eccinode);

but I always get an error, "FD in invalid format" (or same, was in
hungarian :)).

Any idea?

My other question:
if somebody wants to write other than 32 bytes offset (for example
offset 48) I need to read the data from the 32 bytes block begining
(eg. from offset 32) and if I have the first 16 bytes, I can calculate
the ecc bytes. I think I need to do this in every writev calls. But
how can I do this? Must I call readv first, and calculate the ecc
bytes in readv callbacks (I think this is an other readv not the main
readv ofcourse). But what if the user opens the file in write only
(append) mode? I can't read from an write only FD...

So. If you think this translator is useful, try, test it, give
opinions, ask for features or something ;)

And Merry Christmas (it's a little late) and a Happy new year!

-- 
Best regards,
 Csibra Gergo                            mailto:gergo at csibra.hu






More information about the Gluster-devel mailing list