From 1ccd426a34f3f9f06ab21e6849136566e037a487 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Mon, 9 Mar 2009 13:42:17 -0700
Subject: [PATCH] expirer: fix prediction math, thanks to Zandr for the catch

---
 src/allmydata/storage/expirer.py   |  3 ++-
 src/allmydata/test/test_storage.py | 10 +++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/allmydata/storage/expirer.py b/src/allmydata/storage/expirer.py
index 5769cb64..9a7d13c1 100644
--- a/src/allmydata/storage/expirer.py
+++ b/src/allmydata/storage/expirer.py
@@ -354,7 +354,8 @@ class LeaseCheckingCrawler(ShareCrawler):
         cycle = {"space-recovered": cycle_sr}
 
         if progress["cycle-complete-percentage"] > 0.0:
-            m = 100.0 / progress["cycle-complete-percentage"]
+            pc = progress["cycle-complete-percentage"] / 100.0
+            m = (1-pc)/pc
             for a in ("actual", "original-leasetimer", "configured-leasetimer"):
                 for b in ("numbuckets", "numshares", "sharebytes", "diskbytes"):
                     k = a+"-"+b
diff --git a/src/allmydata/test/test_storage.py b/src/allmydata/test/test_storage.py
index 66f2d4ae..286efe11 100644
--- a/src/allmydata/test/test_storage.py
+++ b/src/allmydata/test/test_storage.py
@@ -1812,15 +1812,15 @@ class LeaseCrawler(unittest.TestCase, pollmixin.PollMixin, WebRenderingMixin):
         def _check_html_in_cycle(html):
             s = remove_tags(html)
             # the first bucket encountered gets deleted, and its prefix
-            # happens to be about 1/6th of the way through the ring, so the
-            # predictor thinks we'll have 6 shares and that we'll delete them
+            # happens to be about 1/5th of the way through the ring, so the
+            # predictor thinks we'll have 5 shares and that we'll delete them
             # all. This part of the test depends upon the SIs landing right
             # where they do now.
             self.failUnlessIn("The remainder of this cycle is expected to "
-                              "recover: 5 shares, 5 buckets", s)
+                              "recover: 4 shares, 4 buckets", s)
             self.failUnlessIn("The whole cycle is expected to examine "
-                              "6 shares in 6 buckets and to recover: "
-                              "6 shares, 6 buckets", s)
+                              "5 shares in 5 buckets and to recover: "
+                              "5 shares, 5 buckets", s)
         d.addCallback(_check_html_in_cycle)
 
         # wait for the crawler to finish the first cycle. Two shares should
-- 
2.45.2