]> git.rkrishnan.org Git - tahoe-lafs/zfec.git/commitdiff
whitespace, docstrings, copyright statements
authorzooko <zooko@zooko.com>
Tue, 4 May 2010 09:57:58 +0000 (15:27 +0530)
committerzooko <zooko@zooko.com>
Tue, 4 May 2010 09:57:58 +0000 (15:27 +0530)
Ignore-this: afed20b517f8d3f8a229a52dfa185085

darcs-hash:85f4eed17c792be5d90b60778381a2ec229503b1

zfec/README.txt
zfec/bench/bench_zfec.py
zfec/setup.py
zfec/zfec/__init__.py
zfec/zfec/_fecmodule.c
zfec/zfec/fec.c
zfec/zfec/filefec.py
zfec/zfec/test/test_zfec.py

index 49fac551c7cc82319e212fbff5b373bc35dfabaf..ac2959ac551cca91e05efec096bddf61b9165057 100644 (file)
@@ -118,7 +118,7 @@ Note that if 7z is used for archiving then it also does compression, so you
 don't need a separate compressor in that case.
 
 
- * Performance Measurements
+ * Performance
 
 On my Athlon 64 2.4 GHz workstation (running Linux), the "zfec" command-line
 tool encoded a 160 MB file with m=100, k=94 (about 6% redundancy) in 3.9
@@ -139,6 +139,14 @@ at about 6.8 million bytes per second.
 On my old PowerPC G4 867 MHz Mac laptop, it encoded from a file at about 1.3
 million bytes per second.
 
+Here is a paper analyzing the performance of various erasure codes and their
+implementations, including zfec:
+
+http://www.usenix.org/events/fast09/tech/full_papers/plank/plank.pdf
+
+Zfec shows good performance on different machines and with different values of
+K and M. It also has a nice small memory footprint.
+
 
  * API
 
index 30b847c5be34699cc3537b6b78b229da9609d6af..c3b25cabcb9787300089ede2036f13fc3d58359d 100644 (file)
@@ -40,10 +40,10 @@ def hashem(results, reslenthing):
 
 def _encode_file(N):
     filefec.encode_file(open(FNAME, "rb"), donothing, K, M)
-   
+
 def _encode_file_stringy(N):
     filefec.encode_file_stringy(open(FNAME, "rb"), donothing, K, M)
-   
+
 def _encode_file_stringy_easyfec(N):
     filefec.encode_file_stringy_easyfec(open(FNAME, "rb"), donothing, K, M)
 
index 3684b6d3886d28de364de33d3393b63b62dd96c6..21e9739a256fef9ad28614f958e6d4856e81f03a 100755 (executable)
@@ -1,10 +1,10 @@
 #!/usr/bin/env python
 
 # zfec -- fast forward error correction library with Python interface
-# 
-# Copyright (C) 2007-2009 Allmydata, Inc.
+#
+# Copyright (C) 2007-2010 Allmydata, Inc.
 # Author: Zooko Wilcox-O'Hearn
-# 
+#
 # This file is part of zfec.
 #
 # See README.txt for licensing information.
@@ -63,10 +63,10 @@ if DEBUGMODE:
 trove_classifiers=[
     "Development Status :: 5 - Production/Stable",
     "Environment :: Console",
-    "License :: OSI Approved :: GNU General Public License (GPL)", 
+    "License :: OSI Approved :: GNU General Public License (GPL)",
     "License :: DFSG approved",
     "License :: Other/Proprietary License",
-    "Intended Audience :: Developers", 
+    "Intended Audience :: Developers",
     "Intended Audience :: End Users/Desktop",
     "Intended Audience :: System Administrators",
     "Operating System :: Microsoft",
@@ -76,9 +76,9 @@ trove_classifiers=[
     "Operating System :: POSIX",
     "Operating System :: MacOS :: MacOS X",
     "Operating System :: Microsoft :: Windows :: Windows NT/2000",
-    "Operating System :: OS Independent", 
-    "Natural Language :: English", 
-    "Programming Language :: C", 
+    "Operating System :: OS Independent",
+    "Natural Language :: English",
+    "Programming Language :: C",
     "Programming Language :: Python", 
     "Programming Language :: Python :: 2",
     "Programming Language :: Python :: 2.4",
@@ -89,9 +89,9 @@ trove_classifiers=[
     "Topic :: System :: Distributed Computing",
     "Topic :: Software Development :: Libraries",
     "Topic :: Communications :: Usenet News",
-    "Topic :: System :: Archiving :: Backup", 
-    "Topic :: System :: Archiving :: Mirroring", 
-    "Topic :: System :: Archiving", 
+    "Topic :: System :: Archiving :: Backup",
+    "Topic :: System :: Archiving :: Mirroring",
+    "Topic :: System :: Archiving",
     ]
 
 PKG = "zfec"
index a5716c01475e365322b580c3ad9108416091be11..d3e742f4d39830e12f7bbd68deec64612aca5454 100644 (file)
@@ -1,9 +1,9 @@
 """
 zfec -- fast forward error correction library with Python interface
 
-maintainer web site: U{http://allmydata.com/source/zfec}
+maintainer web site: U{http://tahoe-lafs.org/source/zfec}
 
-zfec web site: U{http://allmydata.com/source/zfec}
+zfec web site: U{http://tahoe-lafs.org/source/zfec}
 """
 
 __version__ = "unknown"
@@ -21,11 +21,11 @@ import easyfec, filefec, cmdline_zfec, cmdline_zunfec
 quiet_pyflakes=[__version__, Error, Encoder, Decoder, cmdline_zunfec, filefec, cmdline_zfec, easyfec]
 
 # zfec -- fast forward error correction library with Python interface
-# 
-# Copyright (C) 2007 Allmydata, Inc.
+#
+# Copyright (C) 2007-2010 Allmydata, Inc.
 # Author: Zooko Wilcox-O'Hearn
 # mailto:zooko@zooko.com
-# 
+#
 # This file is part of zfec.
 #
 # See README.txt for licensing information.
index e9449c9f373eb502655190f2aec171f087e97d91..9d04dc49aed0fc47a9f77d7aa6b1047a13d50266 100644 (file)
@@ -168,7 +168,7 @@ Encoder_encode(Encoder *self, PyObject *args) {
         }
         oldsz = sz;
     }
-    
+
     /* Allocate space for all of the check blocks. */
 
     for (i=0; i<num_desired_blocks; i++) {
index 637498d02aa01244f175f41eedc621f8ad4fc650..a18a4f69bfc26473473e1d59037c72d2f7dedb1b 100644 (file)
@@ -523,12 +523,12 @@ fec_decode(const fec_t* code, const gf*restrict const*restrict const inpkts, gf*
 
 /**
  * zfec -- fast forward error correction library with Python interface
- * 
- * Copyright (C) 2007 Allmydata, Inc.
+ *
+ * Copyright (C) 2007-2010 Zooko Wilcox-O'Hearn
  * Author: Zooko Wilcox-O'Hearn
- * 
+ *
  * This file is part of zfec.
- * 
+ *
  * See README.txt for licensing information.
  */
 
@@ -542,7 +542,7 @@ fec_decode(const fec_t* code, const gf*restrict const*restrict const inpkts, gf*
  * Robert Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari
  * Thirumoorthy (harit@spectra.eng.hawaii.edu), Aug 1995
  *
- * Modifications by Dan Rubenstein (see Modifications.txt for 
+ * Modifications by Dan Rubenstein (see Modifications.txt for
  * their description.
  * Modifications (C) 1998 Dan Rubenstein (drubenst@cs.umass.edu)
  *
index 682c387a951d822bda8d24bd17a3ad37184c82fe..25b6513a5e84f682653368aac963e1ebbe2b74d5 100644 (file)
@@ -133,7 +133,7 @@ def _parse_header(inf):
             raise CorruptedShareFilesError("Share files were corrupted -- share file %r didn't have a complete metadata header at the front.  Perhaps the file was truncated." % (inf.name,))
         byte = struct.unpack(">B", ch)[0]
         val <<= 8
-        val |= byte 
+        val |= byte
         needed_padbits -= 8
     assert needed_padbits <= 0
     extrabits = -needed_padbits
@@ -147,7 +147,7 @@ def _parse_header(inf):
             raise CorruptedShareFilesError("Share files were corrupted -- share file %r didn't have a complete metadata header at the front.  Perhaps the file was truncated." % (inf.name,))
         byte = struct.unpack(">B", ch)[0]
         val <<= 8
-        val |= byte 
+        val |= byte
         needed_shbits -= 8
     assert needed_shbits <= 0
 
@@ -163,7 +163,7 @@ def encode_to_files(inf, fsize, dirname, prefix, k, m, suffix=".fec", overwrite=
     """
     Encode inf, writing the shares to specially named, newly created files.
 
-    @param fsize: calling read() on inf must yield fsize bytes of data and 
+    @param fsize: calling read() on inf must yield fsize bytes of data and
         then raise an EOFError
     @param dirname: the name of the directory into which the sharefiles will
         be written
@@ -199,7 +199,7 @@ def encode_to_files(inf, fsize, dirname, prefix, k, m, suffix=".fec", overwrite=
             if verbose:
                 if int((float(oldsumlen) / fsize) * 10) != int((float(sumlen[0]) / fsize) * 10):
                     print str(int((float(sumlen[0]) / fsize) * 10) * 10) + "% ...",
-            
+
             if sumlen[0] > fsize:
                 raise IOError("Wrong file size -- possibly the size of the file changed during encoding.  Original size: %d, observed size at least: %s" % (fsize, sumlen[0],))
             for i in range(len(blocks)):
@@ -222,7 +222,7 @@ def encode_to_files(inf, fsize, dirname, prefix, k, m, suffix=".fec", overwrite=
             fileutil.remove_if_possible(fn)
         return 1
     if verbose:
-        print 
+        print
         print "Done!"
     return 0
 
@@ -292,29 +292,29 @@ def encode_file(inf, cb, k, m, chunksize=4096):
     """
     Read in the contents of inf, encode, and call cb with the results.
 
-    First, k "input blocks" will be read from inf, each input block being of 
-    size chunksize.  Then these k blocks will be encoded into m "result 
-    blocks".  Then cb will be invoked, passing a list of the m result blocks 
-    as its first argument, and the length of the encoded data as its second 
-    argument.  (The length of the encoded data is always equal to k*chunksize, 
-    until the last iteration, when the end of the file has been reached and 
-    less than k*chunksize bytes could be read from the file.)  This procedure 
-    is iterated until the end of the file is reached, in which case the space 
+    First, k "input blocks" will be read from inf, each input block being of
+    size chunksize.  Then these k blocks will be encoded into m "result
+    blocks".  Then cb will be invoked, passing a list of the m result blocks
+    as its first argument, and the length of the encoded data as its second
+    argument.  (The length of the encoded data is always equal to k*chunksize,
+    until the last iteration, when the end of the file has been reached and
+    less than k*chunksize bytes could be read from the file.)  This procedure
+    is iterated until the end of the file is reached, in which case the space
     of the input blocks that is unused is filled with zeroes before encoding.
 
     Note that the sequence passed in calls to cb() contains mutable array
-    objects in its first k elements whose contents will be overwritten when 
-    the next segment is read from the input file.  Therefore the 
-    implementation of cb() has to either be finished with those first k arrays 
-    before returning, or if it wants to keep the contents of those arrays for 
-    subsequent use after it has returned then it must make a copy of them to 
+    objects in its first k elements whose contents will be overwritten when
+    the next segment is read from the input file.  Therefore the
+    implementation of cb() has to either be finished with those first k arrays
+    before returning, or if it wants to keep the contents of those arrays for
+    subsequent use after it has returned then it must make a copy of them to
     keep.
 
     @param inf the file object from which to read the data
     @param cb the callback to be invoked with the results
     @param k the number of shares required to reconstruct the file
     @param m the total number of shares created
-    @param chunksize how much data to read from inf for each of the k input 
+    @param chunksize how much data to read from inf for each of the k input
         blocks
     """
     enc = zfec.Encoder(k, m)
@@ -335,7 +335,7 @@ def encode_file(inf, cb, k, m, chunksize=4096):
             except EOFError:
                 eof = True
                 indatasize = i*chunksize + len(a)
-                
+
                 # padding
                 a.fromstring("\x00" * (chunksize-len(a)))
                 i += 1
@@ -374,7 +374,7 @@ def encode_file_not_really(inf, cb, k, m, chunksize=4096):
             except EOFError:
                 eof = True
                 indatasize = i*chunksize + len(a)
-                
+
                 # padding
                 a.fromstring("\x00" * (chunksize-len(a)))
                 i += 1
@@ -406,7 +406,7 @@ def encode_file_not_really_and_hash(inf, cb, k, m, chunksize=4096):
             except EOFError:
                 eof = True
                 indatasize = i*chunksize + len(a)
-                
+
                 # padding
                 a.fromstring("\x00" * (chunksize-len(a)))
                 i += 1
@@ -424,21 +424,21 @@ def encode_file_stringy(inf, cb, k, m, chunksize=4096):
     """
     Read in the contents of inf, encode, and call cb with the results.
 
-    First, k "input blocks" will be read from inf, each input block being of 
-    size chunksize.  Then these k blocks will be encoded into m "result 
-    blocks".  Then cb will be invoked, passing a list of the m result blocks 
-    as its first argument, and the length of the encoded data as its second 
-    argument.  (The length of the encoded data is always equal to k*chunksize, 
-    until the last iteration, when the end of the file has been reached and 
-    less than k*chunksize bytes could be read from the file.)  This procedure 
-    is iterated until the end of the file is reached, in which case the part 
+    First, k "input blocks" will be read from inf, each input block being of
+    size chunksize.  Then these k blocks will be encoded into m "result
+    blocks".  Then cb will be invoked, passing a list of the m result blocks
+    as its first argument, and the length of the encoded data as its second
+    argument.  (The length of the encoded data is always equal to k*chunksize,
+    until the last iteration, when the end of the file has been reached and
+    less than k*chunksize bytes could be read from the file.)  This procedure
+    is iterated until the end of the file is reached, in which case the part
     of the input shares that is unused is filled with zeroes before encoding.
 
     @param inf the file object from which to read the data
     @param cb the callback to be invoked with the results
     @param k the number of shares required to reconstruct the file
     @param m the total number of shares created
-    @param chunksize how much data to read from inf for each of the k input 
+    @param chunksize how much data to read from inf for each of the k input
         blocks
     """
     enc = zfec.Encoder(k, m)
@@ -454,7 +454,7 @@ def encode_file_stringy(inf, cb, k, m, chunksize=4096):
             l.append(inf.read(chunksize))
             if len(l[-1]) < chunksize:
                 indatasize = i*chunksize + len(l[-1])
-                
+
                 # padding
                 l[-1] = l[-1] + "\x00" * (chunksize-len(l[-1]))
                 while i<k:
@@ -482,7 +482,7 @@ def encode_file_stringy_easyfec(inf, cb, k, m, chunksize=4096):
     @param cb the callback to be invoked with the results
     @param k the number of shares required to reconstruct the file
     @param m the total number of shares created
-    @param chunksize how much data to read from inf for each of the k input 
+    @param chunksize how much data to read from inf for each of the k input
         blocks
     """
     enc = easyfec.Encoder(k, m)
@@ -495,10 +495,10 @@ def encode_file_stringy_easyfec(inf, cb, k, m, chunksize=4096):
         indata = inf.read(readsize)
 
 # zfec -- fast forward error correction library with Python interface
-# 
-# Copyright (C) 2007 Allmydata, Inc.
+#
+# Copyright (C) 2007-2010 Allmydata, Inc.
 # Author: Zooko Wilcox-O'Hearn
-# 
+#
 # This file is part of zfec.
 #
 # See README.txt for licensing information.
index 5b40d0a90b6711dbbdf41a504a7ab2267add5dec..7ed3c13ea47a2dc41bf90ea5838a3454cd45702c 100755 (executable)
@@ -60,7 +60,7 @@ def _h_easy(k, m, s):
     blocks = [ x[1] for x in nums_and_blocks ]
     nums = [ x[0] for x in nums_and_blocks ]
     decer = zfec.easyfec.Decoder(k, m)
-    
+
     decodeds = decer.decode(blocks, nums, padlen=k*len(blocks[0]) - len(s))
     assert len(decodeds) == len(s), (ab(decodeds), ab(s), k, m)
     assert decodeds == s, (ab(decodeds), ab(s),)
@@ -77,7 +77,7 @@ def _help_test_random_with_l_easy(l):
     k = random.randrange(1, m+1)
     s = randstr(l)
     _h_easy(k, m, s)
-    
+
 class ZFecTest(unittest.TestCase):
     def test_from_agl_c(self):
         self.failUnless(zfec._fec.test_from_agl())
@@ -94,7 +94,7 @@ class ZFecTest(unittest.TestCase):
 
         d = zfec.Decoder(3, 5)
         r0, r1, r2 = d.decode((b2, b3, b4), (1, 2, 3))
-        
+
         # print "after decoding:"
         # print "b0: %s, b1: %s" % tuple(base64.b16encode(x) for x in [b0, b1])
 
@@ -301,7 +301,7 @@ class FileFec(unittest.TestCase):
     def test_filefec_min_shares_with_crcrlflf(self, noisy=VERBOSE):
         return self._help_test_filefec("Yellow Whirled!A\r\r\n\n", 3, 8, numshs=3)
 
+
 class Cmdline(unittest.TestCase):
     def test_basic(self, noisy=VERBOSE):
         tempdir = fileutil.NamedTemporaryDirectory(cleanup=True)
@@ -314,7 +314,7 @@ class Cmdline(unittest.TestCase):
             DEFAULT_M=8
             DEFAULT_K=3
             sys.argv = ["zfec", os.path.join(tempdir.name, "test.data"),]
-        
+
             retcode = zfec.cmdline_zfec.main()
             assert retcode == 0, retcode
 
@@ -328,7 +328,7 @@ class Cmdline(unittest.TestCase):
             sys.argv = ["zunfec",]
             sys.argv.extend(sharefns)
             sys.argv.extend(['-o', os.path.join(tempdir.name, 'test.data-recovered'),])
-            
+
             retcode = zfec.cmdline_zunfec.main()
             assert retcode == 0, retcode
             import filecmp