[Checkins] SVN: relstorage/trunk/relstorage/adapters/packundo.py Report on the packing progress

Martijn Pieters mj at zopatista.com
Fri Feb 25 08:01:13 EST 2011


Log message for revision 120569:
  Report on the packing progress
  
  On batch completion, log progress if at least .1% of the total has been
  processed since last time we logged progress.

Changed:
  U   relstorage/trunk/relstorage/adapters/packundo.py

-=-
Modified: relstorage/trunk/relstorage/adapters/packundo.py
===================================================================
--- relstorage/trunk/relstorage/adapters/packundo.py	2011-02-25 07:49:31 UTC (rev 120568)
+++ relstorage/trunk/relstorage/adapters/packundo.py	2011-02-25 13:01:12 UTC (rev 120569)
@@ -632,7 +632,8 @@
                 tid_rows = list(cursor)
                 tid_rows.sort()  # oldest first
 
-                log.info("pack: will pack %d transaction(s)", len(tid_rows))
+                total = len(tid_rows)
+                log.info("pack: will pack %d transaction(s)", total)
 
                 stmt = self._script_create_temp_pack_visit
                 if stmt:
@@ -643,16 +644,28 @@
                 # the interruption of concurrent write operations.
                 start = time.time()
                 packed_list = []
+                counter, lastreport, statecounter = 0, 0, 0
+                # We'll report on progress in at most .1% step increments
+                reportstep = max(total / 1000, 1)
+
                 self.locker.hold_commit_lock(cursor)
                 for tid, packed, has_removable in tid_rows:
                     self._pack_transaction(
                         cursor, pack_tid, tid, packed, has_removable,
                         packed_list)
+                    counter += 1
                     if time.time() >= start + self.options.pack_batch_timeout:
                         conn.commit()
                         if packed_func is not None:
                             for oid, tid in packed_list:
                                 packed_func(oid, tid)
+                        statecounter += len(packed_list)
+                        if counter >= lastreport + reportstep:
+                            log.info("pack: packed %d (%.1f%%) transaction(s),"
+                                "affecting %d states",
+                                counter, counter/float(total)*100, 
+                                statecounter)
+                            lastreport = counter / reportstep * reportstep
                         del packed_list[:]
                         self.locker.release_commit_lock(cursor)
                         self._pause_pack(sleep, start)
@@ -1062,15 +1075,18 @@
                 self.runner.run_script_stmt(cursor, stmt)
                 to_remove = list(cursor)
 
-                log.info("pack: will remove %d object(s)", len(to_remove))
+                total = len(to_remove)
+                log.info("pack: will remove %d object(s)", total)
 
                 # Hold the commit lock while packing to prevent deadlocks.
                 # Pack in small batches of transactions in order to minimize
                 # the interruption of concurrent write operations.
                 start = time.time()
                 packed_list = []
+                # We'll report on progress in at most .1% step increments
+                lastreport, reportstep = 0, max(total / 1000, 1)
+
                 self.locker.hold_commit_lock(cursor)
-
                 while to_remove:
                     items = to_remove[:100]
                     del to_remove[:100]
@@ -1087,6 +1103,11 @@
                             for oid, tid in packed_list:
                                 packed_func(oid, tid)
                         del packed_list[:]
+                        counter = total - len(to_remove)
+                        if counter >= lastreport + reportstep:
+                            log.info("pack: removed %d (%.1f%%) state(s)",
+                                counter, counter/float(total)*100)
+                            lastreport = counter / reportstep * reportstep
                         self.locker.release_commit_lock(cursor)
                         self._pause_pack(sleep, start)
                         self.locker.hold_commit_lock(cursor)



More information about the checkins mailing list