Incorrect bzrlib usage or a memory leak?

Asked by Abhay Mujumdar

In order to get content every file for for every revision, I was shell'ing out 'bzr cat' with the right parameters. It is pretty slow if you fork a process for each file revision, probably because Python runtime is started and bzr code is loaded for each invocation.

So I re-wrote it to use bzrlib API and it is order of magnitude faster. However, it is leaking 2-5MB per revision. I tweaked the code to print heap using heapy. The code and stats are below. Notice that along with other things, count of bzrlib._static_tuple_c.StaticTuple objects keep increasing.

I am suspecting I am not using the API correctly (may be the cmd_* classes are not supposed to be used in a loop?).

I'd appreciate any help or hints.

Thanks
Abhay

from bzrlib.builtins import cmd_cat
from bzrlib.builtins import cmd_log
from bzrlib.revisionspec import RevisionSpec
import StringIO
import os
from guppy import hpy
hp = hpy()

# Get contents of a file for specific revision.
def bzr_cat(repository_url, filename, revision):
  print "=cat file"
  print hp.heap()
  os.chdir(repository_url)
  spec = RevisionSpec.from_string(revision)
  output = StringIO.StringIO()
  cmd = cmd_cat()
  cmd.outf = output
  cmd.run(filename=filename, revision=[spec], name_from_revision=True)
  cmd.cleanup_now()
  val = output.getvalue()
  output.close()
  print hp.heap()
  return val

# Output of heapy when script started
Partition of a set of 111157 objects. Total size = 14541184 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
    0 50169 45 5017480 35 5017480 35 str
    1 30786 28 2947480 20 7964960 55 tuple
    2 8229 7 987480 7 8952440 62 function
    3 8449 8 946288 7 9898728 68 types.CodeType
    4 839 1 838768 6 10737496 74 dict of type
    5 290 0 773152 5 11510648 79 dict of module
    6 999 1 769392 5 12280040 84 dict (no owner)
    7 843 1 731648 5 13011688 89 type
    8 658 1 336416 2 13348104 92 dict of class
    9 209 0 217360 1 13565464 93 dict of bzrlib.option.Option

#Output of heapy after a few thousand calls
Partition of a set of 437390 objects. Total size = 334836816 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
    0 211711 48 302202312 90 302202312 90 bzrlib._static_tuple_c.StaticTuple
    1 160872 37 19002840 6 321205152 96 str
    2 1369 0 4491920 1 325697072 97 dict (no owner)
    3 31504 7 3026832 1 328723904 98 tuple
    4 8403 2 1008360 0 329732264 98 function
    5 8643 2 968016 0 330700280 99 types.CodeType
    6 866 0 863008 0 331563288 99 dict of type
    7 296 0 784000 0 332347288 99 dict of module
    8 871 0 755808 0 333103096 99 type
    9 662 0 337504 0 333440600 100 dict of class

Question information

Language:
English Edit question
Status:
Solved
For:
Bazaar Edit question
Assignee:
No assignee Edit question
Solved by:
Abhay Mujumdar
Solved:
Last query:
Last reply:
Revision history for this message
John A Meinel (jameinel) said :
#1

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/3/2011 4:30 PM, Abhay Mujumdar wrote:
> New question #173096 on Bazaar:
> https://answers.launchpad.net/bzr/+question/173096
>
> In order to get content every file for for every revision, I was
> shell'ing out 'bzr cat' with the right parameters. It is pretty
> slow if you fork a process for each file revision, probably because
> Python runtime is started and bzr code is loaded for each
> invocation.
>
> So I re-wrote it to use bzrlib API and it is order of magnitude
> faster. However, it is leaking 2-5MB per revision. I tweaked the
> code to print heap using heapy. The code and stats are below.
> Notice that along with other things, count of
> bzrlib._static_tuple_c.StaticTuple objects keep increasing.
>
> I am suspecting I am not using the API correctly (may be the cmd_*
> classes are not supposed to be used in a loop?).
>
> I'd appreciate any help or hints.
>
> Thanks Abhay
>

I'm guessing we are just loading more and more of the history and
indexes into memory as you request more data.

I certainly wouldn't recommend running all of this at the 'cmd_cat'
level, given it will have to re-open the repository for every file.

Instead, I would look at opening the branch/repository, using
something like:

b = branch.Branch.open(path)
b.lock_read()
# Note, this will iterate from newest to oldest, you can use
'reversed' # if you want to go from oldest to newest.
ancestry = b.repository.get_graph().iter_ancestry(b.last_revision())
deltas = b.repository.get_revision_deltas(ancestry)
for delta in delta:
  stuff_that_changed = []
  for stuff in delta:
    stuff_that_changed.append(...)
  stream = b.repository.get_record_stream(stuff_that_changed,
 'unordered', True)
  for record in stream:
    content = record.get_bytes_as('fulltext')
    record.key
    with open(whatever_file, 'wb') as f:
      f.write(content)

Note that not all the bits are hooked up exactly right, but that
should give you all the apis you need to do the work. I would expect
it to be another order of magnitude faster to extract all the content.

Even faster if you changed it to build up the 'stuff_that_changed'
across all revisions and do a single call to 'get_record_stream'. (I
benchmarked extracting all the texts for bzr into memory at about
600MB/s back when we were working on the new repository format.)

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6JzJkACgkQJdeBCYSNAAOS3gCghTDKshKGi2lc6xjB090wt0pL
V4MAn21PGLFlOUcH6nEGSjhPx6SjIcIm
=ypom
-----END PGP SIGNATURE-----

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#2

Thanks John a quick response and the code sample!
I ditched cmd_cat and wrote something similar this morning. It is definitely faster but still keeps growing in memory. I have to hook up heapy in this script to see what is accumulating.
Be back with more info; here is the code meanwhile -

from bzrlib.branch import Branch
from bzrlib.revision import Revision
from datetime import datetime

branch = Branch.open('/var/spool/clumps/000/000/000/039')
branch.lock_read()
repo = branch.repository
revisions = branch.revision_history()
print "Revisions -" + str(len(revisions))
i = 1
for rev in revisions:
  print "%s Processing revision %s of %s" % (str(datetime.now()), i, len(revisions))
  i = i + 1
  revtree = repo.revision_tree(rev)
  fcount = 0
  for path, versioned, kind, file_id, inv_entry in revtree.list_files():
    if kind == 'file':
      fcount = fcount + 1
      content = revtree.get_file_text(file_id)
  print " containing %s files" % (fcount)

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#3

By the way, we at Ohloh (http://www.ohloh.net) are implementing a bzrlib based SCM adapter (http://www.github.com/ohloh/ohloh_scm). We observed memory leak when we were trying to analyze MySQL's revision history (it has over 70K revisions; many of them with thousands of file).

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#4

Here is the code with heapy calls -

from bzrlib.branch import Branch
from bzrlib.revision import Revision
from datetime import datetime
from guppy import hpy
hp = hpy()

branch = Branch.open('/var/spool/clumps/000/000/000/039')
branch.lock_read()
repo = branch.repository
revisions = branch.revision_history()
print "Revisions -" + str(len(revisions))
i = 1
for rev in revisions:
  print "======= %s Processing revision %s of %s" % (str(datetime.now()), i, len(revisions))
  i = i + 1
  revtree = repo.revision_tree(rev)
  fcount = 0
  for path, versioned, kind, file_id, inv_entry in revtree.list_files():
    print hp.heap()
    if kind == 'file':
      fcount = fcount + 1
      content = revtree.get_file_text(file_id)
  print "======= processed %s files" % (fcount)
  print hp.heap()

I am running it against MySQL's repository. Here is the heapy output at beginning -
Partition of a set of 357144 objects. Total size = 231906328 bytes.
 Index Count % Size % Cumulative % Kind (class / dict of class)
     0 155949 44 175894624 76 175894624 76 bzrlib._static_tuple_c.StaticTuple
     1 139739 39 42124832 18 218019456 94 str
     2 1514 0 5115808 2 223135264 96 dict (no owner)
     3 29566 8 2817472 1 225952736 97 tuple
     4 7886 2 946320 0 226899056 98 function
     5 8094 2 906528 0 227805584 98 types.CodeType
     6 806 0 803680 0 228609264 99 dict of type
     7 284 0 763072 0 229372336 99 dict of module
     8 810 0 703040 0 230075376 99 type
     9 661 0 337232 0 230412608 99 dict of class

and here it is after getting contents of ~2000 files (still at revision 2 of the repository).
Partition of a set of 756794 objects. Total size = 564912904 bytes.
 Index Count % Size % Cumulative % Kind (class / dict of class)
     0 406333 54 447756728 79 447756728 79 bzrlib._static_tuple_c.StaticTuple
     1 276525 37 94862408 17 542619136 96 str
     2 2831 0 12573424 2 555192560 98 dict (no owner)
     3 29584 4 2818912 0 558011472 99 tuple
     4 7886 1 946320 0 558957792 99 function
     5 8094 1 906528 0 559864320 99 types.CodeType
     6 806 0 803680 0 560668000 99 dict of type
     7 284 0 763072 0 561431072 99 dict of module
     8 810 0 703040 0 562134112 100 type

As you can see, it has accumulated over 300MB doing that.

Thanks again!

Revision history for this message
John A Meinel (jameinel) said :
#5

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/3/2011 6:11 PM, Abhay Mujumdar wrote:
> Question #173096 on Bazaar changed:
> https://answers.launchpad.net/bzr/+question/173096
>
> Abhay Mujumdar gave more information on the question: Here is the
> code with heapy calls -
>
> from bzrlib.branch import Branch from bzrlib.revision import
> Revision from datetime import datetime from guppy import hpy hp =
> hpy()
>
> branch = Branch.open('/var/spool/clumps/000/000/000/039')
> branch.lock_read() repo = branch.repository revisions =
> branch.revision_history() print "Revisions -" +
> str(len(revisions)) i = 1 for rev in revisions: print "======= %s
> Processing revision %s of %s" % (str(datetime.now()), i,
> len(revisions)) i = i + 1 revtree = repo.revision_tree(rev) fcount
> = 0 for path, versioned, kind, file_id, inv_entry in
> revtree.list_files(): print hp.heap() if kind == 'file': fcount =
> fcount + 1 content = revtree.get_file_text(file_id) print "=======
> processed %s files" % (fcount) print hp.heap()

This will extract every file for a revision, even if it isn't
different from the previous revision. Are you sure that is what you want?

The prototype I outlined would be more efficient than this, if only
because it lets the repository extract the texts in whatever it
considers the most efficient order (such as whatever order it is
sorted on disk).

>
> I am running it against MySQL's repository. Here is the heapy
> output at beginning - Partition of a set of 357144 objects. Total
> size = 231906328 bytes. Index Count % Size % Cumulative %
> Kind (class / dict of class) 0 155949 44 175894624 76 175894624
> 76 bzrlib._static_tuple_c.StaticTuple 1 139739 39 42124832 18
> 218019456 94 str 2 1514 0 5115808 2 223135264 96 dict (no
> owner) 3 29566 8 2817472 1 225952736 97 tuple 4 7886 2
> 946320 0 226899056 98 function 5 8094 2 906528 0
> 227805584 98 types.CodeType 6 806 0 803680 0 228609264
> 99 dict of type 7 284 0 763072 0 229372336 99 dict of
> module 8 810 0 703040 0 230075376 99 type 9 661 0
> 337232 0 230412608 99 dict of class
>
> and here it is after getting contents of ~2000 files (still at
> revision 2 of the repository). Partition of a set of 756794
> objects. Total size = 564912904 bytes. Index Count % Size
> % Cumulative % Kind (class / dict of class) 0 406333 54 447756728
> 79 447756728 79 bzrlib._static_tuple_c.StaticTuple 1 276525 37
> 94862408 17 542619136 96 str 2 2831 0 12573424 2 555192560
> 98 dict (no owner) 3 29584 4 2818912 0 558011472 99 tuple 4
> 7886 1 946320 0 558957792 99 function 5 8094 1 906528
> 0 559864320 99 types.CodeType 6 806 0 803680 0 560668000
> 99 dict of type 7 284 0 763072 0 561431072 99 dict of
> module 8 810 0 703040 0 562134112 100 type
>
> As you can see, it has accumulated over 300MB doing that.
>
> Thanks again!
>

I'm not sure that this is an actual leak, versus increasing memory
consumption that will hit a peak shortly thereafter. Specifically
StaticTuple is used in the Index code. We generally don't read the
whole index into memory, but we cache the bits that we do read. So
after a few operations we should have cached all that we are going to.

Let me write up a real prototype, and I'll send it to you.

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6K/goACgkQJdeBCYSNAAN+PQCfcnAcGCfEJvtlZ18ecAUTmD93
yIkAn2PT7TI0/TgQOFszd4pibswxefDn
=CsL9
-----END PGP SIGNATURE-----

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#6

Thanks again, John!

> This will extract every file for a revision, even if it isn't
> different from the previous revision. Are you sure that is what you want?
Yes, this is what I want.

>I'm not sure that this is an actual leak, versus increasing memory
>consumption that will hit a peak shortly thereafter.
When I was running it for MySQL, it did accumulate over 1GB in few hours. Is there a way to configure how much of data to cache?

Abhay

Revision history for this message
John A Meinel (jameinel) said :
#7

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/4/2011 3:15 PM, Abhay Mujumdar wrote:
> Question #173096 on Bazaar changed:
> https://answers.launchpad.net/bzr/+question/173096
>
> Abhay Mujumdar posted a new comment: Thanks again, John!
>
>> This will extract every file for a revision, even if it isn't
>> different from the previous revision. Are you sure that is what
>> you want?
> Yes, this is what I want.

There are, say, 2500 files in a given revision, but only ~10 of them
actually change. It seems a bit silly to extract the 2490 files with
identical content over and over again. However, I went ahead and did that.

Also, the script you wrote only extracts mainline revisions, not all
revisions, I have the option in the script I wrote (commented out),
but I went ahead and made it so that the script extracts the contents
of every revision.

>
>> I'm not sure that this is an actual leak, versus increasing
>> memory consumption that will hit a peak shortly thereafter.
> When I was running it for MySQL, it did accumulate over 1GB in few
> hours. Is there a way to configure how much of data to cache?
>
> Abhay
>

The one I wrote seems to have peaked after about 65 revisions. I'll
paste the result so far after sending this.

John
=:->

from bzrlib import branch, initialize, plugin, trace, ui

with initialize():
    plugin.load_plugins()
    # b = branch.Branch.open('/var/spool/clumps/000/000/000/039')
    b = branch.Branch.open('.')
    b.lock_read()
    pb = ui.ui_factory.nested_progress_bar()
    total_bytes = 0
    try:
        repo = b.repository
        # Note, this is only the mainline history, 'revision_history'
        # does not include revisions that are merged. For example:
        # A
        # |\
        # | B
        # |/
        # C
        # revision_history will only be "A C".
        # revisions = b.revision_history()
        trace.debug_memory('before get_known_graph_ancestry')
        kg = repo.get_known_graph_ancestry([b.last_revision()])
        revisions = list(reversed(
            [n.key for n in kg.merge_sort(b.last_revision())]))
        trace.debug_memory('after evaluating revisions')
        old_trees = {}
        for idx, revision in enumerate(revisions):
            pb.update('revision', idx, len(revisions))
            tree = repo.revision_tree(revision)
            all_entries = [(ie.file_id, ie.revision)
                           for _, ie in tree.iter_entries_by_dir()]
            pb2 = ui.ui_factory.nested_progress_bar()
            stream = repo.texts.get_record_stream(all_entries,
                                                  'unordered', True)
            revision_bytes = 0
            for record_idx, record in enumerate(stream):
                pb2.update('text', record_idx, len(all_entries))
                content = record.get_bytes_as('fulltext')
                revision_bytes += len(content)
            pb2.finished()
            trace.debug_memory(
                'after revision %d extracted %d bytes %d total'
                % (idx, revision_bytes, total_bytes))
            total_bytes += revision_bytes
    finally:
        pb.finished()
        b.unlock()
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LEkkACgkQJdeBCYSNAAMHnACfacC1coqVnYf86ZnCrWOaiqFf
lMgAoLjG/HxynXc7ZSOeOmvRVAX5SRvl
=evv8
-----END PGP SIGNATURE-----

Revision history for this message
John A Meinel (jameinel) said :
#9

$ py ../../../bzr/bzr.dev/extract_all_texts.py
WorkingSize 15884KiB PeakWorking 15884KiB before get_known_graph_ancestry
WorkingSize 59472KiB PeakWorking 65292KiB after evaluating revisions
WorkingSize 76636KiB PeakWorking 77424KiB after revision 0 extracted 2537 bytes 0 total
WorkingSize 153560KiB PeakWorking 166704KiB after revision 1 extracted 16700251 bytes 2537 total
WorkingSize 155780KiB PeakWorking 169072KiB after revision 2 extracted 16700335 bytes 16702788 total
WorkingSize 161844KiB PeakWorking 174740KiB after revision 3 extracted 16700269 bytes 33403123 total
WorkingSize 162240KiB PeakWorking 176648KiB after revision 4 extracted 16700378 bytes 50103392 total
WorkingSize 164876KiB PeakWorking 179616KiB after revision 5 extracted 16700290 bytes 66803770 total
WorkingSize 167788KiB PeakWorking 181284KiB after revision 6 extracted 16700378 bytes 83504060 total
WorkingSize 162532KiB PeakWorking 181284KiB after revision 7 extracted 16700427 bytes 100204438 total
WorkingSize 163184KiB PeakWorking 181284KiB after revision 8 extracted 16700381 bytes 116904865 total
WorkingSize 167708KiB PeakWorking 182404KiB after revision 9 extracted 16700405 bytes 133605246 total
WorkingSize 171116KiB PeakWorking 186292KiB after revision 10 extracted 16700419 bytes 150305651 total
WorkingSize 176264KiB PeakWorking 191196KiB after revision 11 extracted 16700451 bytes 167006070 total
WorkingSize 177716KiB PeakWorking 191196KiB after revision 12 extracted 16700472 bytes 183706521 total
WorkingSize 179548KiB PeakWorking 194956KiB after revision 13 extracted 16700404 bytes 200406993 total
WorkingSize 179052KiB PeakWorking 194960KiB after revision 14 extracted 16700654 bytes 217107397 total
WorkingSize 179048KiB PeakWorking 194960KiB after revision 15 extracted 16700662 bytes 233808051 total
WorkingSize 179564KiB PeakWorking 195480KiB after revision 16 extracted 16700645 bytes 250508713 total
WorkingSize 167072KiB PeakWorking 195480KiB after revision 17 extracted 16701321 bytes 267209358 total
WorkingSize 171348KiB PeakWorking 195480KiB after revision 18 extracted 16701331 bytes 283910679 total
WorkingSize 175068KiB PeakWorking 195480KiB after revision 19 extracted 16701349 bytes 300612010 total
WorkingSize 175172KiB PeakWorking 195480KiB after revision 20 extracted 16701261 bytes 317313359 total
WorkingSize 174904KiB PeakWorking 195480KiB after revision 21 extracted 16701530 bytes 334014620 total
WorkingSize 175380KiB PeakWorking 195480KiB after revision 22 extracted 16701554 bytes 350716150 total
WorkingSize 176268KiB PeakWorking 195480KiB after revision 23 extracted 16702104 bytes 367417704 total
WorkingSize 179004KiB PeakWorking 195480KiB after revision 24 extracted 16702545 bytes 384119808 total
WorkingSize 184912KiB PeakWorking 200008KiB after revision 25 extracted 16703269 bytes 400822353 total
WorkingSize 172112KiB PeakWorking 200008KiB after revision 26 extracted 16718551 bytes 417525622 total
WorkingSize 176440KiB PeakWorking 200008KiB after revision 27 extracted 16718578 bytes 434244173 total
WorkingSize 176796KiB PeakWorking 200008KiB after revision 28 extracted 16710543 bytes 450962751 total
WorkingSize 184724KiB PeakWorking 200628KiB after revision 29 extracted 16710543 bytes 467673294 total
WorkingSize 181856KiB PeakWorking 200628KiB after revision 30 extracted 16726133 bytes 484383837 total
WorkingSize 184600KiB PeakWorking 200628KiB after revision 31 extracted 16703292 bytes 501109970 total
WorkingSize 172460KiB PeakWorking 200628KiB after revision 32 extracted 16703329 bytes 517813262 total
WorkingSize 172452KiB PeakWorking 200628KiB after revision 33 extracted 16710605 bytes 534516591 total
WorkingSize 174396KiB PeakWorking 200628KiB after revision 34 extracted 16710605 bytes 551227196 total
WorkingSize 174888KiB PeakWorking 200628KiB after revision 35 extracted 16710562 bytes 567937801 total
WorkingSize 181136KiB PeakWorking 200628KiB after revision 36 extracted 16710598 bytes 584648363 total
WorkingSize 180628KiB PeakWorking 200628KiB after revision 37 extracted 16710592 bytes 601358961 total
WorkingSize 173292KiB PeakWorking 200628KiB after revision 38 extracted 16711270 bytes 618069553 total
WorkingSize 181436KiB PeakWorking 200628KiB after revision 39 extracted 16711742 bytes 634780823 total
WorkingSize 173836KiB PeakWorking 200628KiB after revision 40 extracted 16727307 bytes 651492565 total
WorkingSize 183296KiB PeakWorking 200628KiB after revision 41 extracted 16727384 bytes 668219872 total
WorkingSize 186104KiB PeakWorking 202328KiB after revision 42 extracted 16711769 bytes 684947256 total
WorkingSize 180396KiB PeakWorking 202328KiB after revision 43 extracted 16714804 bytes 701659025 total
WorkingSize 183380KiB PeakWorking 202328KiB after revision 44 extracted 16715303 bytes 718373829 total
WorkingSize 185472KiB PeakWorking 202328KiB after revision 45 extracted 16703428 bytes 735089132 total
WorkingSize 178808KiB PeakWorking 202328KiB after revision 46 extracted 16715334 bytes 751792560 total
WorkingSize 186072KiB PeakWorking 202328KiB after revision 47 extracted 16730920 bytes 768507894 total
WorkingSize 181324KiB PeakWorking 202328KiB after revision 48 extracted 16791069 bytes 785238814 total
WorkingSize 185592KiB PeakWorking 202328KiB after revision 49 extracted 16791018 bytes 802029883 total
WorkingSize 178784KiB PeakWorking 202328KiB after revision 50 extracted 16806707 bytes 818820901 total
WorkingSize 181384KiB PeakWorking 202328KiB after revision 51 extracted 16806734 bytes 835627608 total
WorkingSize 179248KiB PeakWorking 202328KiB after revision 52 extracted 16808431 bytes 852434342 total
WorkingSize 179244KiB PeakWorking 202328KiB after revision 53 extracted 16808458 bytes 869242773 total
WorkingSize 182416KiB PeakWorking 202328KiB after revision 54 extracted 16811262 bytes 886051231 total
WorkingSize 184120KiB PeakWorking 202328KiB after revision 55 extracted 16811336 bytes 902862493 total
WorkingSize 186012KiB PeakWorking 202328KiB after revision 56 extracted 16811437 bytes 919673829 total
WorkingSize 186004KiB PeakWorking 202328KiB after revision 57 extracted 16811511 bytes 936485266 total
WorkingSize 187668KiB PeakWorking 203604KiB after revision 58 extracted 16821595 bytes 953296777 total
WorkingSize 183316KiB PeakWorking 203604KiB after revision 59 extracted 16824648 bytes 970118372 total
WorkingSize 186272KiB PeakWorking 203604KiB after revision 60 extracted 16828980 bytes 986943020 total
WorkingSize 180948KiB PeakWorking 203604KiB after revision 61 extracted 16811173 bytes 1003772000 total
WorkingSize 180984KiB PeakWorking 203604KiB after revision 62 extracted 16828891 bytes 1020583173 total
WorkingSize 183664KiB PeakWorking 203604KiB after revision 63 extracted 16824585 bytes 1037412064 total
WorkingSize 193364KiB PeakWorking 209780KiB after revision 64 extracted 16824649 bytes 1054236649 total
WorkingSize 194416KiB PeakWorking 210848KiB after revision 65 extracted 16824649 bytes 1071061298 total
WorkingSize 194416KiB PeakWorking 210848KiB after revision 66 extracted 16828874 bytes 1087885947 total
WorkingSize 182544KiB PeakWorking 210848KiB after revision 67 extracted 16833430 bytes 1104714821 total
WorkingSize 186524KiB PeakWorking 210848KiB after revision 68 extracted 16833423 bytes 1121548251 total
WorkingSize 187040KiB PeakWorking 210848KiB after revision 69 extracted 16833304 bytes 1138381674 total
WorkingSize 182488KiB PeakWorking 210848KiB after revision 70 extracted 16833512 bytes 1155214978 total
WorkingSize 182824KiB PeakWorking 210848KiB after revision 71 extracted 16829058 bytes 1172048490 total
WorkingSize 182956KiB PeakWorking 210848KiB after revision 72 extracted 16829041 bytes 1188877548 total
WorkingSize 182868KiB PeakWorking 210848KiB after revision 73 extracted 16833623 bytes 1205706589 total
WorkingSize 182308KiB PeakWorking 210848KiB after revision 74 extracted 16833624 bytes 1222540212 total
WorkingSize 182784KiB PeakWorking 210848KiB after revision 75 extracted 16833621 bytes 1239373836 total
WorkingSize 183436KiB PeakWorking 210848KiB after revision 76 extracted 16833622 bytes 1256207457 total
WorkingSize 185996KiB PeakWorking 210848KiB after revision 77 extracted 16829380 bytes 1273041079 total
WorkingSize 186332KiB PeakWorking 210848KiB after revision 78 extracted 16829381 bytes 1289870459 total
WorkingSize 188960KiB PeakWorking 210848KiB after revision 79 extracted 16829005 bytes 1306699840 total
WorkingSize 189192KiB PeakWorking 210848KiB after revision 80 extracted 16829345 bytes 1323528845 total
WorkingSize 187088KiB PeakWorking 210848KiB after revision 81 extracted 16829345 bytes 1340358190 total
WorkingSize 191372KiB PeakWorking 210848KiB after revision 82 extracted 16830283 bytes 1357187535 total
WorkingSize 198756KiB PeakWorking 214416KiB after revision 83 extracted 16829637 bytes 1374017818 total
WorkingSize 198308KiB PeakWorking 214984KiB after revision 84 extracted 16830539 bytes 1390847455 total
WorkingSize 198268KiB PeakWorking 214984KiB after revision 85 extracted 16830503 bytes 1407677994 total
WorkingSize 186504KiB PeakWorking 214984KiB after revision 86 extracted 16830489 bytes 1424508497 total
WorkingSize 188288KiB PeakWorking 214984KiB after revision 87 extracted 16711743 bytes 1441338986 total
WorkingSize 188404KiB PeakWorking 214984KiB after revision 88 extracted 16711770 bytes 1458050729 total
WorkingSize 187940KiB PeakWorking 214984KiB after revision 89 extracted 16828892 bytes 1474762499 total
WorkingSize 188184KiB PeakWorking 214984KiB after revision 90 extracted 16833623 bytes 1491591391 total
WorkingSize 188944KiB PeakWorking 214984KiB after revision 91 extracted 16837101 bytes 1508425014 total
WorkingSize 188920KiB PeakWorking 214984KiB after revision 92 extracted 16833968 bytes 1525262115 total
WorkingSize 192404KiB PeakWorking 214984KiB after revision 93 extracted 16833945 bytes 1542096083 total
WorkingSize 192488KiB PeakWorking 214984KiB after revision 94 extracted 16830511 bytes 1558930028 total
WorkingSize 193340KiB PeakWorking 214984KiB after revision 95 extracted 16833967 bytes 1575760539 total
WorkingSize 193092KiB PeakWorking 214984KiB after revision 96 extracted 16833973 bytes 1592594506 total
WorkingSize 193256KiB PeakWorking 214984KiB after revision 97 extracted 16833974 bytes 1609428479 total
WorkingSize 193860KiB PeakWorking 214984KiB after revision 98 extracted 16835171 bytes 1626262453 total
WorkingSize 193880KiB PeakWorking 214984KiB after revision 99 extracted 16839748 bytes 1643097624 total
WorkingSize 185936KiB PeakWorking 214984KiB after revision 100 extracted 16840317 bytes 1659937372 total
WorkingSize 181980KiB PeakWorking 214984KiB after revision 101 extracted 16841061 bytes 1676777689 total
WorkingSize 186904KiB PeakWorking 214984KiB after revision 102 extracted 16841068 bytes 1693618750 total
WorkingSize 177916KiB PeakWorking 214984KiB after revision 103 extracted 16841068 bytes 1710459818 total
WorkingSize 181744KiB PeakWorking 214984KiB after revision 104 extracted 16841326 bytes 1727300886 total
WorkingSize 187328KiB PeakWorking 214984KiB after revision 105 extracted 16840995 bytes 1744142212 total
WorkingSize 188352KiB PeakWorking 214984KiB after revision 106 extracted 16841124 bytes 1760983207 total
WorkingSize 184728KiB PeakWorking 214984KiB after revision 107 extracted 16853473 bytes 1777824331 total
WorkingSize 192340KiB PeakWorking 214984KiB after revision 108 extracted 16864330 bytes 1794677804 total
WorkingSize 188060KiB PeakWorking 214984KiB after revision 109 extracted 16864399 bytes 1811542134 total
WorkingSize 191024KiB PeakWorking 214984KiB after revision 110 extracted 16865686 bytes 1828406533 total
WorkingSize 180360KiB PeakWorking 214984KiB after revision 111 extracted 16871994 bytes 1845272219 total
WorkingSize 189972KiB PeakWorking 214984KiB after revision 112 extracted 16873281 bytes 1862144213 total
WorkingSize 190336KiB PeakWorking 214984KiB after revision 113 extracted 16874735 bytes 1879017494 total
WorkingSize 190340KiB PeakWorking 214984KiB after revision 114 extracted 16874864 bytes 1895892229 total
WorkingSize 190948KiB PeakWorking 214984KiB after revision 115 extracted 16875011 bytes 1912767093 total
WorkingSize 184664KiB PeakWorking 214984KiB after revision 116 extracted 16874803 bytes 1929642104 total
WorkingSize 185156KiB PeakWorking 214984KiB after revision 117 extracted 16874950 bytes 1946516907 total
WorkingSize 191264KiB PeakWorking 214984KiB after revision 118 extracted 16875124 bytes 1963391857 total
WorkingSize 191072KiB PeakWorking 214984KiB after revision 119 extracted 16875271 bytes 1980266981 total
WorkingSize 195680KiB PeakWorking 214984KiB after revision 120 extracted 16875414 bytes 1997142252 total
WorkingSize 195656KiB PeakWorking 214984KiB after revision 121 extracted 16875414 bytes 2014017666 total
WorkingSize 191748KiB PeakWorking 214984KiB after revision 122 extracted 16875293 bytes 2030893080 total
WorkingSize 192224KiB PeakWorking 214984KiB after revision 123 extracted 16875293 bytes 2047768373 total
WorkingSize 191748KiB PeakWorking 214984KiB after revision 124 extracted 16875436 bytes 2064643666 total
WorkingSize 192224KiB PeakWorking 214984KiB after revision 125 extracted 16875436 bytes 2081519102 total
WorkingSize 192252KiB PeakWorking 214984KiB after revision 126 extracted 16875436 bytes 2098394538 total
WorkingSize 194800KiB PeakWorking 214984KiB after revision 127 extracted 16875512 bytes 2115269974 total
WorkingSize 194588KiB PeakWorking 214984KiB after revision 128 extracted 16875714 bytes 2132145486 total
WorkingSize 196872KiB PeakWorking 214984KiB after revision 129 extracted 16875747 bytes 2149021200 total
WorkingSize 196844KiB PeakWorking 214984KiB after revision 130 extracted 16875748 bytes 2165896947 total
WorkingSize 196228KiB PeakWorking 214984KiB after revision 131 extracted 16876257 bytes 2182772695 total
WorkingSize 199964KiB PeakWorking 216888KiB after revision 132 extracted 16875444 bytes 2199648952 total
WorkingSize 200220KiB PeakWorking 217144KiB after revision 133 extracted 16876265 bytes 2216524396 total
WorkingSize 189740KiB PeakWorking 217144KiB after revision 134 extracted 16872623 bytes 2233400661 total
WorkingSize 196936KiB PeakWorking 217144KiB after revision 135 extracted 16872604 bytes 2250273284 total
WorkingSize 197804KiB PeakWorking 217144KiB after revision 136 extracted 16873455 bytes 2267145888 total
WorkingSize 188528KiB PeakWorking 217144KiB after revision 137 extracted 16875882 bytes 2284019343 total
WorkingSize 197060KiB PeakWorking 217144KiB after revision 138 extracted 16876430 bytes 2300895225 total
WorkingSize 188448KiB PeakWorking 217144KiB after revision 139 extracted 16876717 bytes 2317771655 total
WorkingSize 196880KiB PeakWorking 217144KiB after revision 140 extracted 16876888 bytes 2334648372 total
WorkingSize 198736KiB PeakWorking 217144KiB after revision 141 extracted 16876505 bytes 2351525260 total
WorkingSize 191240KiB PeakWorking 217144KiB after revision 142 extracted 16879401 bytes 2368401765 total
WorkingSize 191240KiB PeakWorking 217144KiB after revision 143 extracted 16880635 bytes 2385281166 total
WorkingSize 191740KiB PeakWorking 217144KiB after revision 144 extracted 16880635 bytes 2402161801 total
WorkingSize 191240KiB PeakWorking 217144KiB after revision 145 extracted 16880511 bytes 2419042436 total
WorkingSize 191440KiB PeakWorking 217144KiB after revision 146 extracted 16838744 bytes 2435922947 total
WorkingSize 194568KiB PeakWorking 217144KiB after revision 147 extracted 16838728 bytes 2452761691 total
WorkingSize 194096KiB PeakWorking 217144KiB after revision 148 extracted 16885221 bytes 2469600419 total
WorkingSize 185908KiB PeakWorking 217144KiB after revision 149 extracted 16879168 bytes 2486485640 total
WorkingSize 189124KiB PeakWorking 217144KiB after revision 150 extracted 16881778 bytes 2503364808 total
WorkingSize 199792KiB PeakWorking 219576KiB after revision 151 extracted 16959264 bytes 2520246586 total
WorkingSize 190800KiB PeakWorking 219576KiB after revision 152 extracted 16967973 bytes 2537205850 total
WorkingSize 195876KiB PeakWorking 219576KiB after revision 153 extracted 16968144 bytes 2554173823 total
WorkingSize 195776KiB PeakWorking 219576KiB after revision 154 extracted 16968044 bytes 2571141967 total
WorkingSize 199504KiB PeakWorking 219576KiB after revision 155 extracted 16968713 bytes 2588110011 total
WorkingSize 188832KiB PeakWorking 219576KiB after revision 156 extracted 16968170 bytes 2605078724 total
WorkingSize 188704KiB PeakWorking 219576KiB after revision 157 extracted 16968070 bytes 2622046894 total
WorkingSize 188204KiB PeakWorking 219576KiB after revision 158 extracted 16968739 bytes 2639014964 total
WorkingSize 188704KiB PeakWorking 219576KiB after revision 159 extracted 16968821 bytes 2655983703 total
WorkingSize 189496KiB PeakWorking 219576KiB after revision 160 extracted 16968439 bytes 2672952524 total
WorkingSize 190856KiB PeakWorking 219576KiB after revision 161 extracted 16882370 bytes 2689920963 total
WorkingSize 193440KiB PeakWorking 219576KiB after revision 162 extracted 16882720 bytes 2706803333 total
WorkingSize 193472KiB PeakWorking 219576KiB after revision 163 extracted 16970948 bytes 2723686053 total
WorkingSize 197572KiB PeakWorking 219576KiB after revision 164 extracted 16970964 bytes 2740657001 total
WorkingSize 192900KiB PeakWorking 219576KiB after revision 165 extracted 16970968 bytes 2757627965 total
WorkingSize 194768KiB PeakWorking 219576KiB after revision 166 extracted 16971073 bytes 2774598933 total
WorkingSize 195216KiB PeakWorking 219576KiB after revision 167 extracted 16970970 bytes 2791570006 total
WorkingSize 194236KiB PeakWorking 219576KiB after revision 168 extracted 16971070 bytes 2808540976 total
WorkingSize 195244KiB PeakWorking 219576KiB after revision 169 extracted 16971072 bytes 2825512046 total
WorkingSize 196516KiB PeakWorking 219576KiB after revision 170 extracted 16971107 bytes 2842483118 total
WorkingSize 196236KiB PeakWorking 219576KiB after revision 171 extracted 16971211 bytes 2859454225 total
WorkingSize 196176KiB PeakWorking 219576KiB after revision 172 extracted 16971316 bytes 2876425436 total
WorkingSize 196176KiB PeakWorking 219576KiB after revision 173 extracted 16971487 bytes 2893396752 total
WorkingSize 194120KiB PeakWorking 219576KiB after revision 174 extracted 18458015 bytes 2910368239 total
WorkingSize 199076KiB PeakWorking 219576KiB after revision 175 extracted 18458538 bytes 2928826254 total
WorkingSize 199076KiB PeakWorking 219576KiB after revision 176 extracted 18458880 bytes 2947284792 total
WorkingSize 196812KiB PeakWorking 219576KiB after revision 177 extracted 18462961 bytes 2965743672 total
WorkingSize 200936KiB PeakWorking 219576KiB after revision 178 extracted 18463303 bytes 2984206633 total
WorkingSize 193808KiB PeakWorking 219576KiB after revision 179 extracted 16971506 bytes 3002669936 total
WorkingSize 193812KiB PeakWorking 219576KiB after revision 180 extracted 18463322 bytes 3019641442 total
WorkingSize 193808KiB PeakWorking 219576KiB after revision 181 extracted 18467993 bytes 3038104764 total
WorkingSize 193808KiB PeakWorking 219576KiB after revision 182 extracted 18468012 bytes 3056572757 total
WorkingSize 186324KiB PeakWorking 219576KiB after revision 183 extracted 18475269 bytes 3075040769 total
WorkingSize 190388KiB PeakWorking 219576KiB after revision 184 extracted 18475411 bytes 3093516038 total
WorkingSize 189784KiB PeakWorking 219576KiB after revision 185 extracted 18486078 bytes 3111991449 total
WorkingSize 191084KiB PeakWorking 219576KiB after revision 186 extracted 18467997 bytes 3130477527 total
WorkingSize 191088KiB PeakWorking 219576KiB after revision 187 extracted 18486082 bytes 3148945524 total
WorkingSize 197380KiB PeakWorking 219576KiB after revision 188 extracted 18486215 bytes 3167431606 total
WorkingSize 197536KiB PeakWorking 219576KiB after revision 189 extracted 18486239 bytes 3185917821 total
WorkingSize 199932KiB PeakWorking 219576KiB after revision 190 extracted 18486243 bytes 3204404060 total
WorkingSize 199312KiB PeakWorking 219576KiB after revision 191 extracted 18486189 bytes 3222890303 total
WorkingSize 188220KiB PeakWorking 219576KiB after revision 192 extracted 18493560 bytes 3241376492 total
WorkingSize 191940KiB PeakWorking 219576KiB after revision 193 extracted 18489932 bytes 3259870052 total
WorkingSize 189880KiB PeakWorking 219576KiB after revision 194 extracted 18497249 bytes 3278359984 total
WorkingSize 190440KiB PeakWorking 219576KiB after revision 195 extracted 18497544 bytes 3296857233 total
WorkingSize 193716KiB PeakWorking 219576KiB after revision 196 extracted 18505718 bytes 3315354777 total
WorkingSize 193716KiB PeakWorking 219576KiB after revision 197 extracted 18509471 bytes 3333860495 total
WorkingSize 194556KiB PeakWorking 219576KiB after revision 198 extracted 18509766 bytes 3352369966 total
WorkingSize 194080KiB PeakWorking 219576KiB after revision 199 extracted 18509691 bytes 3370879732 total
WorkingSize 194556KiB PeakWorking 219576KiB after revision 200 extracted 18509743 bytes 3389389423 total
WorkingSize 193988KiB PeakWorking 219576KiB after revision 201 extracted 18509902 bytes 3407899166 total
WorkingSize 195616KiB PeakWorking 219576KiB after revision 202 extracted 18510841 bytes 3426409068 total
WorkingSize 196032KiB PeakWorking 219576KiB after revision 203 extracted 18511225 bytes 3444919909 total
WorkingSize 195892KiB PeakWorking 219576KiB after revision 204 extracted 18511592 bytes 3463431134 total
WorkingSize 196228KiB PeakWorking 219576KiB after revision 205 extracted 18510457 bytes 3481942726 total
WorkingSize 195968KiB PeakWorking 219576KiB after revision 206 extracted 18512383 bytes 3500453183 total
WorkingSize 195528KiB PeakWorking 219576KiB after revision 207 extracted 18511856 bytes 3518965566 total
WorkingSize 201060KiB PeakWorking 219576KiB after revision 208 extracted 18512787 bytes 3537477422 total
WorkingSize 200804KiB PeakWorking 219576KiB after revision 209 extracted 18513197 bytes 3555990209 total
WorkingSize 201280KiB PeakWorking 219576KiB after revision 210 extracted 18515314 bytes 3574503406 total
WorkingSize 200520KiB PeakWorking 219576KiB after revision 211 extracted 18515297 bytes 3593018720 total
WorkingSize 200300KiB PeakWorking 219576KiB after revision 212 extracted 18515297 bytes 3611534017 total
WorkingSize 191792KiB PeakWorking 219576KiB after revision 213 extracted 18513165 bytes 3630049314 total
WorkingSize 194848KiB PeakWorking 219576KiB after revision 214 extracted 18514220 bytes 3648562479 total
WorkingSize 194352KiB PeakWorking 219576KiB after revision 215 extracted 18517661 bytes 3667076699 total
WorkingSize 192060KiB PeakWorking 219576KiB after revision 216 extracted 18502838 bytes 3685594360 total
WorkingSize 199692KiB PeakWorking 219576KiB after revision 217 extracted 18522105 bytes 3704097198 total
WorkingSize 192356KiB PeakWorking 219576KiB after revision 218 extracted 18513594 bytes 3722619303 total
WorkingSize 192356KiB PeakWorking 219576KiB after revision 219 extracted 18513593 bytes 3741132897 total
WorkingSize 192352KiB PeakWorking 219576KiB after revision 220 extracted 18522502 bytes 3759646490 total
WorkingSize 198224KiB PeakWorking 219576KiB after revision 221 extracted 18523386 bytes 3778168992 total
WorkingSize 202756KiB PeakWorking 219576KiB after revision 222 extracted 18523783 bytes 3796692378 total
WorkingSize 202256KiB PeakWorking 219576KiB after revision 223 extracted 18523651 bytes 3815216161 total
WorkingSize 202756KiB PeakWorking 219576KiB after revision 224 extracted 18523653 bytes 3833739812 total
WorkingSize 198168KiB PeakWorking 219576KiB after revision 225 extracted 18524429 bytes 3852263465 total
WorkingSize 192352KiB PeakWorking 219576KiB after revision 226 extracted 18524299 bytes 3870787894 total
WorkingSize 194832KiB PeakWorking 219576KiB after revision 227 extracted 18525114 bytes 3889312193 total
WorkingSize 200036KiB PeakWorking 219576KiB after revision 228 extracted 18526015 bytes 3907837307 total
WorkingSize 200028KiB PeakWorking 219576KiB after revision 229 extracted 18525967 bytes 3926363322 total
WorkingSize 200032KiB PeakWorking 219576KiB after revision 230 extracted 18525922 bytes 3944889289 total
WorkingSize 192284KiB PeakWorking 219576KiB after revision 231 extracted 18522537 bytes 3963415211 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 232 extracted 18523818 bytes 3981937748 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 233 extracted 18525984 bytes 4000461566 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 234 extracted 18522657 bytes 4018987550 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 235 extracted 18526235 bytes 4037510207 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 236 extracted 18526127 bytes 4056036442 total
WorkingSize 192288KiB PeakWorking 219576KiB after revision 237 extracted 18525785 bytes 4074562569 total
WorkingSize 197016KiB PeakWorking 219576KiB after revision 238 extracted 16971018 bytes 4093088354 total
WorkingSize 197496KiB PeakWorking 219576KiB after revision 239 extracted 16971047 bytes 4110059372 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 240 extracted 18526002 bytes 4127030419 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 241 extracted 18526031 bytes 4145556421 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 242 extracted 18526166 bytes 4164082452 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 243 extracted 18526124 bytes 4182608618 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 244 extracted 18526065 bytes 4201134742 total
WorkingSize 197492KiB PeakWorking 219576KiB after revision 245 extracted 18525899 bytes 4219660807 total
WorkingSize 196068KiB PeakWorking 219576KiB after revision 246 extracted 18532708 bytes 4238186706 total
WorkingSize 193228KiB PeakWorking 219576KiB after revision 247 extracted 18534175 bytes 4256719414 total
WorkingSize 193236KiB PeakWorking 219576KiB after revision 248 extracted 18535595 bytes 4275253589 total
WorkingSize 193236KiB PeakWorking 219576KiB after revision 249 extracted 18535812 bytes 4293789184 total
WorkingSize 193236KiB PeakWorking 219576KiB after revision 250 extracted 18535646 bytes 4312324996 total
WorkingSize 196056KiB PeakWorking 219576KiB after revision 251 extracted 18536184 bytes 4330860642 total
WorkingSize 195840KiB PeakWorking 219576KiB after revision 252 extracted 18541325 bytes 4349396826 total
WorkingSize 200380KiB PeakWorking 219576KiB after revision 253 extracted 18536567 bytes 4367938151 total
WorkingSize 200172KiB PeakWorking 219576KiB after revision 254 extracted 18536784 bytes 4386474718 total
WorkingSize 197488KiB PeakWorking 219576KiB after revision 255 extracted 18536929 bytes 4405011502 total
WorkingSize 199212KiB PeakWorking 219576KiB after revision 256 extracted 18536948 bytes 4423548431 total
WorkingSize 200164KiB PeakWorking 219576KiB after revision 257 extracted 18542461 bytes 4442085379 total
WorkingSize 201736KiB PeakWorking 219576KiB after revision 258 extracted 18536442 bytes 4460627840 total
WorkingSize 201596KiB PeakWorking 219576KiB after revision 259 extracted 18541955 bytes 4479164282 total
WorkingSize 202060KiB PeakWorking 219576KiB after revision 260 extracted 18541953 bytes 4497706237 total
WorkingSize 202064KiB PeakWorking 219576KiB after revision 261 extracted 18542273 bytes 4516248190 total
WorkingSize 203064KiB PeakWorking 219576KiB after revision 262 extracted 18542591 bytes 4534790463 total
WorkingSize 195416KiB PeakWorking 219576KiB after revision 263 extracted 18551750 bytes 4553333054 total
WorkingSize 195412KiB PeakWorking 219576KiB after revision 264 extracted 18552357 bytes 4571884804 total
WorkingSize 195412KiB PeakWorking 219576KiB after revision 265 extracted 18552359 bytes 4590437161 total
WorkingSize 195412KiB PeakWorking 219576KiB after revision 266 extracted 18552373 bytes 4608989520 total
WorkingSize 195132KiB PeakWorking 219576KiB after revision 267 extracted 18542463 bytes 4627541893 total
WorkingSize 204048KiB PeakWorking 219888KiB after revision 268 extracted 18552883 bytes 4646084356 total
WorkingSize 194964KiB PeakWorking 219888KiB after revision 269 extracted 18552885 bytes 4664637239 total
WorkingSize 196984KiB PeakWorking 219888KiB after revision 270 extracted 18552914 bytes 4683190124 total
WorkingSize 200724KiB PeakWorking 219888KiB after revision 271 extracted 18539325 bytes 4701743038 total
WorkingSize 204196KiB PeakWorking 220620KiB after revision 272 extracted 18555887 bytes 4720282363 total
WorkingSize 190376KiB PeakWorking 220620KiB after revision 273 extracted 18543707 bytes 4738838250 total
WorkingSize 198956KiB PeakWorking 220620KiB after revision 274 extracted 18544248 bytes 4757381957 total
WorkingSize 195212KiB PeakWorking 220620KiB after revision 275 extracted 18544427 bytes 4775926205 total
WorkingSize 196532KiB PeakWorking 220620KiB after revision 276 extracted 18544429 bytes 4794470632 total
WorkingSize 194252KiB PeakWorking 220620KiB after revision 277 extracted 18558492 bytes 4813015061 total
WorkingSize 194752KiB PeakWorking 220620KiB after revision 278 extracted 18558512 bytes 4831573553 total
WorkingSize 194752KiB PeakWorking 220620KiB after revision 279 extracted 18558444 bytes 4850132065 total
WorkingSize 191832KiB PeakWorking 220620KiB after revision 280 extracted 18560224 bytes 4868690509 total
WorkingSize 191832KiB PeakWorking 220620KiB after revision 281 extracted 18560156 bytes 4887250733 total
WorkingSize 192308KiB PeakWorking 220620KiB after revision 282 extracted 18560232 bytes 4905810889 total
WorkingSize 200668KiB PeakWorking 220620KiB after revision 283 extracted 18561314 bytes 4924371121 total
WorkingSize 200300KiB PeakWorking 220620KiB after revision 284 extracted 18561390 bytes 4942932435 total
WorkingSize 200296KiB PeakWorking 220620KiB after revision 285 extracted 18561404 bytes 4961493825 total
WorkingSize 196060KiB PeakWorking 220620KiB after revision 286 extracted 18561417 bytes 4980055229 total
WorkingSize 203184KiB PeakWorking 220620KiB after revision 287 extracted 18561484 bytes 4998616646 total
WorkingSize 191980KiB PeakWorking 220620KiB after revision 288 extracted 18561663 bytes 5017178130 total
WorkingSize 194984KiB PeakWorking 220620KiB after revision 289 extracted 18561290 bytes 5035739793 total
WorkingSize 194648KiB PeakWorking 220620KiB after revision 290 extracted 18558237 bytes 5054301083 total
WorkingSize 194656KiB PeakWorking 220620KiB after revision 291 extracted 18567911 bytes 5072859320 total
WorkingSize 197260KiB PeakWorking 220620KiB after revision 292 extracted 18568004 bytes 5091427231 total
WorkingSize 207368KiB PeakWorking 222772KiB after revision 293 extracted 18558522 bytes 5109995235 total
WorkingSize 197812KiB PeakWorking 222772KiB after revision 294 extracted 18563926 bytes 5128553757 total
WorkingSize 204884KiB PeakWorking 222772KiB after revision 295 extracted 18573008 bytes 5147117683 total
WorkingSize 198904KiB PeakWorking 222772KiB after revision 296 extracted 18573316 bytes 5165690691 total
WorkingSize 197688KiB PeakWorking 222772KiB after revision 297 extracted 18580533 bytes 5184264007 total
WorkingSize 201284KiB PeakWorking 222772KiB after revision 298 extracted 18581550 bytes 5202844540 total
WorkingSize 197036KiB PeakWorking 222772KiB after revision 299 extracted 18585575 bytes 5221426090 total
WorkingSize 200112KiB PeakWorking 222772KiB after revision 300 extracted 18587289 bytes 5240011665 total
WorkingSize 200588KiB PeakWorking 222772KiB after revision 301 extracted 18591336 bytes 5258598954 total
WorkingSize 200608KiB PeakWorking 222772KiB after revision 302 extracted 18586051 bytes 5277190290 total
WorkingSize 200876KiB PeakWorking 222772KiB after revision 303 extracted 18591837 bytes 5295776341 total
WorkingSize 199216KiB PeakWorking 222772KiB after revision 304 extracted 18592596 bytes 5314368178 total
WorkingSize 206600KiB PeakWorking 222772KiB after revision 305 extracted 18581597 bytes 5332960774 total
WorkingSize 206124KiB PeakWorking 222772KiB after revision 306 extracted 18592643 bytes 5351542371 total
WorkingSize 204868KiB PeakWorking 222772KiB after revision 307 extracted 18596256 bytes 5370135014 total
WorkingSize 203952KiB PeakWorking 222772KiB after revision 308 extracted 18596303 bytes 5388731270 total
WorkingSize 204368KiB PeakWorking 222772KiB after revision 309 extracted 18595461 bytes 5407327573 total
WorkingSize 204368KiB PeakWorking 222772KiB after revision 310 extracted 18599168 bytes 5425923034 total
WorkingSize 204368KiB PeakWorking 222772KiB after revision 311 extracted 18599133 bytes 5444522202 total
WorkingSize 204368KiB PeakWorking 222772KiB after revision 312 extracted 18599246 bytes 5463121335 total
WorkingSize 204368KiB PeakWorking 222772KiB after revision 313 extracted 18599246 bytes 5481720581 total
WorkingSize 206976KiB PeakWorking 223404KiB after revision 314 extracted 18598930 bytes 5500319827 total
WorkingSize 206980KiB PeakWorking 223404KiB after revision 315 extracted 18599008 bytes 5518918757 total
WorkingSize 199992KiB PeakWorking 223404KiB after revision 316 extracted 18599518 bytes 5537517765 total
WorkingSize 199996KiB PeakWorking 223404KiB after revision 317 extracted 18599518 bytes 5556117283 total
WorkingSize 199996KiB PeakWorking 223404KiB after revision 318 extracted 18599280 bytes 5574716801 total
WorkingSize 202772KiB PeakWorking 223404KiB after revision 319 extracted 18599246 bytes 5593316081 total
WorkingSize 206532KiB PeakWorking 223404KiB after revision 320 extracted 18599280 bytes 5611915327 total
WorkingSize 200292KiB PeakWorking 223404KiB after revision 321 extracted 18599261 bytes 5630514607 total
WorkingSize 200292KiB PeakWorking 223404KiB after revision 322 extracted 18599532 bytes 5649113868 total
WorkingSize 200292KiB PeakWorking 223404KiB after revision 323 extracted 18599539 bytes 5667713400 total
WorkingSize 200292KiB PeakWorking 223404KiB after revision 324 extracted 18599539 bytes 5686312939 total
WorkingSize 200184KiB PeakWorking 223404KiB after revision 325 extracted 18617219 bytes 5704912478 total
WorkingSize 207288KiB PeakWorking 223720KiB after revision 326 extracted 18617594 bytes 5723529697 total
WorkingSize 210272KiB PeakWorking 226696KiB after revision 327 extracted 18599546 bytes 5742147291 total
WorkingSize 210272KiB PeakWorking 226696KiB after revision 328 extracted 18617608 bytes 5760746837 total
WorkingSize 210272KiB PeakWorking 226700KiB after revision 329 extracted 18617607 bytes 5779364445 total
WorkingSize 197480KiB PeakWorking 226700KiB after revision 330 extracted 18597032 bytes 5797982052 total
WorkingSize 199632KiB PeakWorking 226700KiB after revision 331 extracted 18592088 bytes 5816579084 total
WorkingSize 203000KiB PeakWorking 226700KiB after revision 332 extracted 18597805 bytes 5835171172 total
WorkingSize 203504KiB PeakWorking 226700KiB after revision 333 extracted 18597807 bytes 5853768977 total
WorkingSize 199560KiB PeakWorking 226700KiB after revision 334 extracted 18624008 bytes 5872366784 total
WorkingSize 199092KiB PeakWorking 226700KiB after revision 335 extracted 18624073 bytes 5890990792 total
WorkingSize 199088KiB PeakWorking 226700KiB after revision 336 extracted 18624073 bytes 5909614865 total
WorkingSize 196680KiB PeakWorking 226700KiB after revision 337 extracted 18617843 bytes 5928238938 total
WorkingSize 196664KiB PeakWorking 226700KiB after revision 338 extracted 18624295 bytes 5946856781 total
WorkingSize 197720KiB PeakWorking 226700KiB after revision 339 extracted 18624392 bytes 5965481076 total
WorkingSize 197728KiB PeakWorking 226700KiB after revision 340 extracted 18624614 bytes 5984105468 total
WorkingSize 204384KiB PeakWorking 226700KiB after revision 341 extracted 18625752 bytes 6002730082 total
WorkingSize 204244KiB PeakWorking 226700KiB after revision 342 extracted 18625765 bytes 6021355834 total
WorkingSize 204164KiB PeakWorking 226700KiB after revision 343 extracted 18625766 bytes 6039981599 total
WorkingSize 203768KiB PeakWorking 226700KiB after revision 344 extracted 18625423 bytes 6058607365 total
WorkingSize 204272KiB PeakWorking 226700KiB after revision 345 extracted 18625766 bytes 6077232788 total
WorkingSize 203768KiB PeakWorking 226700KiB after revision 346 extracted 18625766 bytes 6095858554 total
WorkingSize 204280KiB PeakWorking 226700KiB after revision 347 extracted 18625766 bytes 6114484320 total
WorkingSize 203768KiB PeakWorking 226700KiB after revision 348 extracted 18625820 bytes 6133110086 total
WorkingSize 210432KiB PeakWorking 226844KiB after revision 349 extracted 18630068 bytes 6151735906 total
WorkingSize 202812KiB PeakWorking 226844KiB after revision 350 extracted 18631255 bytes 6170365974 total
WorkingSize 205828KiB PeakWorking 226844KiB after revision 351 extracted 18631307 bytes 6188997229 total
WorkingSize 209860KiB PeakWorking 226844KiB after revision 352 extracted 18631731 bytes 6207628536 total
WorkingSize 209856KiB PeakWorking 226844KiB after revision 353 extracted 18885264 bytes 6226260267 total
WorkingSize 211164KiB PeakWorking 227320KiB after revision 354 extracted 18885310 bytes 6245145531 total
WorkingSize 210404KiB PeakWorking 227320KiB after revision 355 extracted 18885343 bytes 6264030841 total
WorkingSize 200328KiB PeakWorking 227320KiB after revision 356 extracted 18885611 bytes 6282916184 total
WorkingSize 200328KiB PeakWorking 227320KiB after revision 357 extracted 18885902 bytes 6301801795 total
WorkingSize 204756KiB PeakWorking 227320KiB after revision 358 extracted 18649057 bytes 6320687697 total
WorkingSize 204700KiB PeakWorking 227320KiB after revision 359 extracted 18910894 bytes 6339336754 total
WorkingSize 201196KiB PeakWorking 227320KiB after revision 360 extracted 18911463 bytes 6358247648 total
WorkingSize 192732KiB PeakWorking 227320KiB after revision 361 extracted 18912686 bytes 6377159111 total
WorkingSize 202596KiB PeakWorking 227320KiB after revision 362 extracted 18918548 bytes 6396071797 total
WorkingSize 204892KiB PeakWorking 227320KiB after revision 363 extracted 18919066 bytes 6414990345 total
WorkingSize 205392KiB PeakWorking 227320KiB after revision 364 extracted 18919693 bytes 6433909411 total
WorkingSize 205532KiB PeakWorking 227320KiB after revision 365 extracted 18921884 bytes 6452829104 total
WorkingSize 209372KiB PeakWorking 227320KiB after revision 366 extracted 18922402 bytes 6471750988 total
WorkingSize 205252KiB PeakWorking 227320KiB after revision 367 extracted 18922988 bytes 6490673390 total
WorkingSize 199220KiB PeakWorking 227320KiB after revision 368 extracted 18926474 bytes 6509596378 total
WorkingSize 201376KiB PeakWorking 227320KiB after revision 369 extracted 18927121 bytes 6528522852 total
WorkingSize 198164KiB PeakWorking 227320KiB after revision 370 extracted 18926741 bytes 6547449973 total
WorkingSize 197768KiB PeakWorking 227320KiB after revision 371 extracted 18927388 bytes 6566376714 total
WorkingSize 198192KiB PeakWorking 227320KiB after revision 372 extracted 18973329 bytes 6585304102 total
WorkingSize 202052KiB PeakWorking 227320KiB after revision 373 extracted 18973312 bytes 6604277431 total
WorkingSize 202052KiB PeakWorking 227320KiB after revision 374 extracted 18977759 bytes 6623250743 total
WorkingSize 204616KiB PeakWorking 227320KiB after revision 375 extracted 18978551 bytes 6642228502 total
WorkingSize 213284KiB PeakWorking 230224KiB after revision 376 extracted 18979174 bytes 6661207053 total
WorkingSize 213088KiB PeakWorking 230224KiB after revision 377 extracted 18982455 bytes 6680186227 total
WorkingSize 206784KiB PeakWorking 230224KiB after revision 378 extracted 18982133 bytes 6699168682 total
WorkingSize 210176KiB PeakWorking 230224KiB after revision 379 extracted 18985298 bytes 6718150815 total
WorkingSize 210176KiB PeakWorking 230224KiB after revision 380 extracted 18985298 bytes 6737136113 total
WorkingSize 211020KiB PeakWorking 230224KiB after revision 381 extracted 18985755 bytes 6756121411 total
WorkingSize 204976KiB PeakWorking 230224KiB after revision 382 extracted 18986205 bytes 6775107166 total
WorkingSize 207012KiB PeakWorking 230224KiB after revision 383 extracted 18986229 bytes 6794093371 total
WorkingSize 207012KiB PeakWorking 230224KiB after revision 384 extracted 18986229 bytes 6813079600 total
WorkingSize 207012KiB PeakWorking 230224KiB after revision 385 extracted 18986103 bytes 6832065829 total
WorkingSize 210332KiB PeakWorking 230224KiB after revision 386 extracted 18986376 bytes 6851051932 total
WorkingSize 211664KiB PeakWorking 230224KiB after revision 387 extracted 18986363 bytes 6870038308 total
WorkingSize 211568KiB PeakWorking 230224KiB after revision 388 extracted 18986705 bytes 6889024671 total
WorkingSize 212408KiB PeakWorking 230224KiB after revision 389 extracted 18986728 bytes 6908011376 total
WorkingSize 213016KiB PeakWorking 230224KiB after revision 390 extracted 18986705 bytes 6926998104 total
WorkingSize 212744KiB PeakWorking 230224KiB after revision 391 extracted 18986728 bytes 6945984809 total
WorkingSize 204960KiB PeakWorking 230224KiB after revision 392 extracted 18927805 bytes 6964971537 total
| revision:text 1773/2715

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#10

Thanks much for your help!

Why do you say it stabilized after 65 revisions? I see this at rev 65 (and up to rev 82)
WorkingSize 194416KiB PeakWorking 210848KiB after revision 65 extracted 16824649 bytes 1071061298 total

but then it starts to grow again. At rev 392 (toward the end), I see
WorkingSize 204960KiB PeakWorking 230224KiB after revision 392 extracted 18927805 bytes 6964971537 total.

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#11
Revision history for this message
John A Meinel (jameinel) said :
#12

After 2 hours we're at:
WorkingSize 225868KiB PeakWorking 266580KiB after revision 2687 extracted 38031990 bytes 77234608120 total
WorkingSize 225752KiB PeakWorking 266580KiB after revision 2688 extracted 38031976 bytes 77272640110 total

I would guess that Peak is probably fairly affected by the size of the actual file texts.

Note that we're at approximately 1/10th of the way through. Peak has gone up a bit, but it isn't like it is exploding.

Also, note that we've extracted 77GB of file content by this point. Each revision has roughly 38MB of files, and then you go across 3000 revisions. This amounts to about 178MB/s extraction speed.

You can certainly do it this way, but it is a bit silly to extract the content repeatedly. I think it should be reasonably efficient internally, where much of the content will still be cached.

At the current rate, it should take about 20 hours to extract the whole history, though I expect it to slow down because newer trees are bigger (the tip revision is 198,875,611, so ~200MB, or about 5x bigger than revision 2688). So probably around 4 days or something.

I'll let it run as long as it isn't interfering with other work, and I'll let you know what the peak memory comes to.

At the very least, I don't expect it to grow to the 1.5GB you said you were seeing. Note that in your original version using cmd_cat, it was re-opening the repository, which means you'll likely get the same content cached in multiple repository objects.

Revision history for this message
John A Meinel (jameinel) said :
#13

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/4/2011 5:05 PM, Abhay Mujumdar wrote:
> Question #173096 on Bazaar changed:
> https://answers.launchpad.net/bzr/+question/173096
>
> Abhay Mujumdar posted a new comment: Here is the graph -
> https://docs.google.com/spreadsheet/ccc?key=0AhIEtge8GOUVdENTWVJEVk9DWmxfVlN1UGwxNjNQVXc&hl=en_US
>
>
Note that the size of the tree gets bigger with time, and the total
number of bytes of content in the tree gets bigger with time. So at
least some of the memory growth is just because we have more data to
process for each revision.

John
=:->

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LMRsACgkQJdeBCYSNAAMxxwCeP6P4s1zjlI728JgeuTYDcPw6
cEUAoLp4SMOm8K+vdsP3BhN+o1ifvxKQ
=pTR6
-----END PGP SIGNATURE-----

Revision history for this message
John A Meinel (jameinel) said :
#14

Here is a graph of the current peak memory after 3000 revisions (~2 hours).

http://imagebin.org/177384

I'll try to update as I get more data.

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#15

Thanks, John!
You are right, the growth here doesn't look as bad as I was seeing with cmd_cat.

> Note that in your original version using cmd_cat, it was re-opening the repository,
> which means you'll likely get the same content cached in multiple repository objects.
Is there a way to keep using cmd_cat but close the repository after each call so that it flushes all the cached objects?

I'll try to rewrite the adapter without cmd_cat. I am using rubypython gem to call bzrlib APIs from Ruby code and have been passing strings around (stayed away from passing Ruby/Python objects)

Thanks again, I have enough information now.

Revision history for this message
John A Meinel (jameinel) said :
#16

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/4/2011 6:55 PM, Abhay Mujumdar wrote:
> Question #173096 on Bazaar changed:
> https://answers.launchpad.net/bzr/+question/173096
>
> Status: Answered => Solved
>
> Abhay Mujumdar confirmed that the question is solved: Thanks,
> John! You are right, the growth here doesn't look as bad as I was
> seeing with cmd_cat.
>
>> Note that in your original version using cmd_cat, it was
>> re-opening the repository, which means you'll likely get the same
>> content cached in multiple repository objects.
> Is there a way to keep using cmd_cat but close the repository after
> each call so that it flushes all the cached objects?
>
> I'll try to rewrite the adapter without cmd_cat. I am using
> rubypython gem to call bzrlib APIs from Ruby code and have been
> passing strings around (stayed away from passing Ruby/Python
> objects)
>
> Thanks again, I have enough information now.
>

Just before I shut it down, it has been running for 6.5hrs and is
currently at:
WorkingSize 222268KiB PeakWorking 267768KiB after revision 6818
extracted 44434405 bytes 241379575757 total
WorkingSize 219304KiB PeakWorking 267768KiB after revision 6819
extracted 44396263 bytes 241424010162 total
WorkingSize 223416KiB PeakWorking 267768KiB after revision 6820
extracted 44396295 bytes 241468406425 total
WorkingSize 223416KiB PeakWorking 267768KiB after revision 6821
extracted 44435080 bytes 241512802720 total
WorkingSize 223420KiB PeakWorking 267768KiB after revision 6822
extracted 44435083 bytes 241557237800 total

So at 6.8k revisions, and a tree size of 44MB, it seems to still be at
a reasonable peak memory.

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LbK0ACgkQJdeBCYSNAAPiIQCghE1PNg1YKv2EIlXPetjpBZdb
QpUAoIPL8pwX9+e3uXLysao+iWITFgqQ
=k3EP
-----END PGP SIGNATURE-----

Revision history for this message
John A Meinel (jameinel) said :
#17

I forgot to actually stop the process, so it ran overnight. I'm pleased about 2 things.

1) Peak memory really does stop growing, after ~16 hours I'm at:
WorkingSize 230428KiB PeakWorking 271956KiB after revision 18287 extracted 57899882 bytes 788451701240 total

Here is the graph over time:
http://people.canonical.com/~jameinel/peak_working.png

I also included the size of the working tree, as a point of comparison. (How many bytes of content did we extract for the revision).

2) The time to extract each revision doesn't get significantly worse, even though there is more data
http://people.canonical.com/~jameinel/extract_time.png

I have the feeling this is because of how we store the data. When we compact a repository, we favor making recent content faster to extract. There are a lot of details, but roughly we store the most recent text as a full text, and then store deltas to that fulltext going back in history.

So most likely, the extra data is offset by the fact that it is faster to extract it.

Revision history for this message
Abhay Mujumdar (amujumdar) said :
#18

At Ohloh, we store revision-ids for every commit and files affected in each commit in DB. So what I really needed was a method to get file-content, given a revision-id and filename. Here is the code I ended up writing that passes Ohloh adapter tests. Does it seem like the right way to do it?

Thanks again for all your help
Abhay
ps: I also need parent revision-ids in some case, hence the get_parent_tokens method below.

from bzrlib.branch import Branch
from bzrlib.revisionspec import RevisionSpec

class BzrCommander:
 def __init__(self, repository_url):
   self.branch = Branch.open(repository_url)
   self.branch.lock_read()
   #self.repository = self.branch.repository

 def get_file_content(self, filename, revision):
   rev_spec = RevisionSpec.from_string(revision)
   tree = rev_spec.as_tree(self.branch)
   file_id = tree.path2id(filename)
   if file_id == None:
     return None
   content = tree.get_file_text(file_id)
   return content

 def get_parent_tokens(self, revision):
   revision = RevisionSpec.from_string(revision)
   tree = revision.as_tree(self.branch)
   parents = tree.get_parent_ids()
   #print parents
   return parents

 def cleanup():
   self.branch.unlock()

Revision history for this message
John A Meinel (jameinel) said :
#19

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 10/6/2011 11:30 PM, Abhay Mujumdar wrote:
> Question #173096 on Bazaar changed:
> https://answers.launchpad.net/bzr/+question/173096
>
> Abhay Mujumdar posted a new comment: At Ohloh, we store
> revision-ids for every commit and files affected in each commit in
> DB. So what I really needed was a method to get file- content,
> given a revision-id and filename. Here is the code I ended up
> writing that passes Ohloh adapter tests. Does it seem like the
> right way to do it?

get_file_content() is ok, the mapping from filename => file_id is correct.

I'll note that if you could make a request for more than one file
content, we could more efficiently extract the content from the
repository. However, as long as you hold locked repository open, it
shouldn't be too bad.

get_parent_tokens seems fine, as long as the calling code realizes
that it is a (file_id, revision_id) pair, and not a (filename,
revision_id) pair.

One thing to note, because we track renames, it is possible that the
path in the parent revision is *not* the same as the one in the child
revision.

John
=:->

>
> Thanks again for all your help Abhay ps: I also need parent
> revision-ids in some case, hence the get_parent_tokens method
> below.
>
> from bzrlib.branch import Branch from bzrlib.revisionspec import
> RevisionSpec
>
> class BzrCommander: def __init__(self, repository_url): self.branch
> = Branch.open(repository_url) self.branch.lock_read()
> #self.repository = self.branch.repository
>
> def get_file_content(self, filename, revision): rev_spec =
> RevisionSpec.from_string(revision) tree =
> rev_spec.as_tree(self.branch) file_id = tree.path2id(filename) if
> file_id == None: return None content = tree.get_file_text(file_id)
> return content
>
> def get_parent_tokens(self, revision): revision =
> RevisionSpec.from_string(revision) tree =
> revision.as_tree(self.branch) parents = tree.get_parent_ids()
> #print parents return parents
>
> def cleanup(): self.branch.unlock()
>

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6OoWMACgkQJdeBCYSNAAOX2wCgqeSQjW+o7kZx6igCbIYke7wj
I94AnimYq6vtJEtTx1nAPhFtvu1EdD9o
=fK84
-----END PGP SIGNATURE-----