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