diff options
author | Miguel Molina <miguel@erizocosmi.co> | 2017-09-07 10:02:29 +0200 |
---|---|---|
committer | Miguel Molina <miguel@erizocosmi.co> | 2017-09-07 10:58:47 +0200 |
commit | 90418e6ab682d1888dd7658a8ebd72a7be8cf502 (patch) | |
tree | 12c8fe4d2ec04400ac6f50b46184fb3cda94eb99 /plumbing | |
parent | 508a89726c9287b3fb5daac23b7957d4297bc42a (diff) | |
download | go-git-90418e6ab682d1888dd7658a8ebd72a7be8cf502.tar.gz |
packfile: parallelize deltification of objects in groups
Signed-off-by: Miguel Molina <miguel@erizocosmi.co>
Diffstat (limited to 'plumbing')
-rw-r--r-- | plumbing/format/packfile/delta_selector.go | 32 | ||||
-rw-r--r-- | plumbing/format/packfile/diff_delta.go | 20 |
2 files changed, 31 insertions, 21 deletions
diff --git a/plumbing/format/packfile/delta_selector.go b/plumbing/format/packfile/delta_selector.go index 021b520..0b3539d 100644 --- a/plumbing/format/packfile/delta_selector.go +++ b/plumbing/format/packfile/delta_selector.go @@ -2,6 +2,7 @@ package packfile import ( "sort" + "sync" "gopkg.in/src-d/go-git.v4/plumbing" "gopkg.in/src-d/go-git.v4/plumbing/storer" @@ -40,7 +41,36 @@ func (dw *deltaSelector) ObjectsToPack(hashes []plumbing.Hash) ([]*ObjectToPack, dw.sort(otp) - if err := dw.walk(otp); err != nil { + var objectGroups [][]*ObjectToPack + var prev *ObjectToPack + i := -1 + for _, obj := range otp { + if prev == nil || prev.Type() != obj.Type() { + objectGroups = append(objectGroups, []*ObjectToPack{obj}) + i++ + prev = obj + } else { + objectGroups[i] = append(objectGroups[i], obj) + } + } + + var wg sync.WaitGroup + var once sync.Once + for _, objs := range objectGroups { + objs := objs + wg.Add(1) + go func() { + if walkErr := dw.walk(objs); walkErr != nil { + once.Do(func() { + err = walkErr + }) + } + wg.Done() + }() + } + wg.Wait() + + if err != nil { return nil, err } diff --git a/plumbing/format/packfile/diff_delta.go b/plumbing/format/packfile/diff_delta.go index 7c9360e..2e58ec6 100644 --- a/plumbing/format/packfile/diff_delta.go +++ b/plumbing/format/packfile/diff_delta.go @@ -135,26 +135,6 @@ func encodeInsertOperation(ibuf, buf *bytes.Buffer) { ibuf.Reset() } -// https://lemire.me/blog/2015/10/22/faster-hashing-without-effort/ -func hashBuf(buf []byte) int64 { - var h int64 - var i int - len := len(buf) - for ; i+3 < len; i += 4 { - h = 31*31*31*31*h + - 31*31*31*int64(buf[i]) + - 31*31*int64(buf[i+1]) + - 31*int64(buf[i+2]) + - int64(buf[i+3]) - } - - for ; i < len; i++ { - h = 31*h + int64(buf[i]) - } - - return h -} - func matchLength(src, tgt []byte, otgt, osrc int) int { l := 0 for { |