From: Brian Warner <warner@lothar.com>
Date: Thu, 8 Nov 2007 11:30:37 +0000 (-0700)
Subject: mutable: cheap padding hack to make zfec tolerate short files
X-Git-Tag: allmydata-tahoe-0.7.0~237
X-Git-Url: https://git.rkrishnan.org/components/com_hotproperty?a=commitdiff_plain;h=61d9ab7690e0b29ad3c43a547cf242f5d97eb770;p=tahoe-lafs%2Ftahoe-lafs.git

mutable: cheap padding hack to make zfec tolerate short files
---

diff --git a/src/allmydata/mutable.py b/src/allmydata/mutable.py
index d7a0d669..d73e6c12 100644
--- a/src/allmydata/mutable.py
+++ b/src/allmydata/mutable.py
@@ -891,10 +891,16 @@ class Publish:
 
         # now apply FEC
         self.MAX_SEGMENT_SIZE = 1024*1024
+        data_length = len(crypttext)
+        if len(crypttext) < 10:
+            # TODO: FEC doesn't handle short (or empty) strings very well, so
+            # give it something longer and we'll trim the results later. For
+            # some reason I suspect the lower limit is k**2
+            crypttext = crypttext + "\x00"*(10-len(crypttext))
+
         segment_size = min(self.MAX_SEGMENT_SIZE, len(crypttext))
         # this must be a multiple of self.required_shares
-        segment_size = mathutil.next_multiple(segment_size,
-                                                   required_shares)
+        segment_size = mathutil.next_multiple(segment_size, required_shares)
         self.num_segments = mathutil.div_ceil(len(crypttext), segment_size)
         assert self.num_segments == 1 # SDMF restrictions
         fec = codec.CRSEncoder()
@@ -913,7 +919,7 @@ class Publish:
         d.addCallback(lambda shares_and_shareids:
                       (shares_and_shareids,
                        required_shares, total_shares,
-                       segment_size, len(crypttext),
+                       segment_size, data_length,
                        target_info) )
         return d