view hgext/largefiles/wirestore.py @ 17127:9e1616307c4c

largefiles: batch statlfile requests when pushing a largefiles repo (issue3386) This implements a part of issue 3386. It batches the request for the status of all largefiles in the revisions that are about to be pushed into a single request, instead of doing N separate requests. In a real world test case, this change was verified to save 1,116 round-trips to the server. It only requires a client-side change; it is backwards-compatible with an older version of the server.
author Na'Tosha Bard <natosha@unity3d.com>
date Sun, 24 Jun 2012 20:36:22 +0200
parents 67964cda8701
children ed647c59753b
line wrap: on
line source

# Copyright 2010-2011 Fog Creek Software
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

'''largefile store working over Mercurial's wire protocol'''

import lfutil
import remotestore

class wirestore(remotestore.remotestore):
    def __init__(self, ui, repo, remote):
        cap = remote.capable('largefiles')
        if not cap:
            raise lfutil.storeprotonotcapable([])
        storetypes = cap.split(',')
        if 'serve' not in storetypes:
            raise lfutil.storeprotonotcapable(storetypes)
        self.remote = remote
        super(wirestore, self).__init__(ui, repo, remote.url())

    def _put(self, hash, fd):
        return self.remote.putlfile(hash, fd)

    def _get(self, hash):
        return self.remote.getlfile(hash)

    def _stat(self, hashes):
        batch = self.remote.batch()
        futures = {}
        for hash in hashes:
            futures[hash] = batch.statlfile(hash)
        batch.submit()
        retval = {}
        for hash in hashes:
            retval[hash] = not futures[hash].value
        return retval