Mercurial > hg
comparison mercurial/testing/storage.py @ 39869:14e500b58263
revlog: add method for obtaining storage info (API)
We currently have a handful of methods on the file and manifest
storage interfaces for obtaining metadata about storage. e.g.
files() is used to obtain the files backing storage. rawsize()
is to quickly compute the size of tracked revisions without resolving
their fulltext.
Code in upgrade and stream clone make heavy use of these methods.
The existing APIs are generic and don't necessarily have the
specialization that we need going forward. For example, files()
doesn't distinguish between exclusive storage and shared storage.
This makes stream clone difficult to implement when e.g. there may
be a single file backing storage for multiple tracked paths. It
also makes reporting difficult, as we don't know how many bytes are
actually used by storage since we can't easily identify shared files.
This commit implements a new method for obtaining storage metadata.
It is designed to accept arguments specifying what metadata to request
and to return a dict with those fields populated. We /could/ make
each of these attributes a separate method. But this is a specialized
API and I'm trying to avoid method bloat on the interfaces. There is
also the possibility that certain callers will want to obtain multiple
fields in different combinations and some backends may have performance
issues obtaining all that data via separate method calls.
Simple storage integration tests have been added. For now, we assume
fields can't be "None" (ignoring the interface documentation). We can
revisit this later.
Differential Revision: https://phab.mercurial-scm.org/D4747
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 24 Sep 2018 11:56:48 -0700 |
parents | e23c03dc5cf9 |
children | 2ac4f3e97813 |
comparison
equal
deleted
inserted
replaced
39868:b06303a208be | 39869:14e500b58263 |
---|---|
386 Use ``makeifiledatatests()`` to create an instance of this type. | 386 Use ``makeifiledatatests()`` to create an instance of this type. |
387 """ | 387 """ |
388 def testempty(self): | 388 def testempty(self): |
389 f = self._makefilefn() | 389 f = self._makefilefn() |
390 | 390 |
391 self.assertEqual(f.storageinfo(), {}) | |
392 self.assertEqual(f.storageinfo(revisionscount=True, trackedsize=True), | |
393 {'revisionscount': 0, 'trackedsize': 0}) | |
394 | |
391 self.assertEqual(f.rawsize(nullrev), 0) | 395 self.assertEqual(f.rawsize(nullrev), 0) |
392 | 396 |
393 for i in range(-5, 5): | 397 for i in range(-5, 5): |
394 if i == nullrev: | 398 if i == nullrev: |
395 continue | 399 continue |
463 fulltext = b'initial' | 467 fulltext = b'initial' |
464 | 468 |
465 f = self._makefilefn() | 469 f = self._makefilefn() |
466 with self._maketransactionfn() as tr: | 470 with self._maketransactionfn() as tr: |
467 node = f.add(fulltext, None, tr, 0, nullid, nullid) | 471 node = f.add(fulltext, None, tr, 0, nullid, nullid) |
472 | |
473 self.assertEqual(f.storageinfo(), {}) | |
474 self.assertEqual(f.storageinfo(revisionscount=True, trackedsize=True), | |
475 {'revisionscount': 1, 'trackedsize': len(fulltext)}) | |
468 | 476 |
469 self.assertEqual(f.rawsize(0), len(fulltext)) | 477 self.assertEqual(f.rawsize(0), len(fulltext)) |
470 | 478 |
471 with self.assertRaises(IndexError): | 479 with self.assertRaises(IndexError): |
472 f.rawsize(1) | 480 f.rawsize(1) |
550 f = self._makefilefn() | 558 f = self._makefilefn() |
551 with self._maketransactionfn() as tr: | 559 with self._maketransactionfn() as tr: |
552 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) | 560 node0 = f.add(fulltext0, None, tr, 0, nullid, nullid) |
553 node1 = f.add(fulltext1, None, tr, 1, node0, nullid) | 561 node1 = f.add(fulltext1, None, tr, 1, node0, nullid) |
554 node2 = f.add(fulltext2, None, tr, 3, node1, nullid) | 562 node2 = f.add(fulltext2, None, tr, 3, node1, nullid) |
563 | |
564 self.assertEqual(f.storageinfo(), {}) | |
565 self.assertEqual( | |
566 f.storageinfo(revisionscount=True, trackedsize=True), | |
567 { | |
568 'revisionscount': 3, | |
569 'trackedsize': len(fulltext0) + len(fulltext1) + len(fulltext2), | |
570 }) | |
555 | 571 |
556 self.assertEqual(f.rawsize(0), len(fulltext0)) | 572 self.assertEqual(f.rawsize(0), len(fulltext0)) |
557 self.assertEqual(f.rawsize(1), len(fulltext1)) | 573 self.assertEqual(f.rawsize(1), len(fulltext1)) |
558 self.assertEqual(f.rawsize(2), len(fulltext2)) | 574 self.assertEqual(f.rawsize(2), len(fulltext2)) |
559 | 575 |