Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

plumbing: format/packfile, Fix data race and resource leak. #1159

Merged
merged 1 commit into from
Jun 6, 2019
Merged

plumbing: format/packfile, Fix data race and resource leak. #1159

merged 1 commit into from
Jun 6, 2019

Conversation

ebardsley
Copy link
Contributor

Two problems are fixed:

  • Buffers are not returned to the pool in the case of errors.
  • Per https://golang.org/pkg/bytes/#Buffer.Bytes, the slice returned
    from bytes.Buffer.Bytes() is only valid until the next modification
    of the buffer, so it must be copied before the buffer is returned to the pool.

Running go test -race detected the following:

==================
WARNING: DATA RACE
Write at 0x00c000224020 by goroutine 15:
  bytes.(*Buffer).WriteByte()
      /usr/local/Cellar/go/1.11.5/libexec/src/bytes/buffer.go:271 +0xc8
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.diffDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go:95 +0x505
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.getDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go:60 +0x4ae
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).tryToDeltify()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:309 +0x398
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).walk()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:262 +0x33b
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack.func1()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:70 +0x6a

Previous read at 0x00c000224020 by goroutine 8:
  runtime.slicecopy()
      /usr/local/Cellar/go/1.11.5/libexec/src/runtime/slice.go:221 +0x0
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.getDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/memory.go:53 +0x5e2
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).tryToDeltify()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:309 +0x398
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).walk()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:262 +0x33b
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack.func1()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:70 +0x6a

Goroutine 15 (running) created at:
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:69 +0x761
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*Encoder).Encode()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/encoder.go:52 +0xb1
  vendor/gopkg.in/src-d/go-git%2ev4.pushHashes.func1()
      vendor/gopkg.in/src-d/go-git.v4/remote.go:1026 +0x102

Goroutine 8 (finished) created at:
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:69 +0x761
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*Encoder).Encode()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/encoder.go:52 +0xb1
  vendor/gopkg.in/src-d/go-git%2ev4.pushHashes.func1()
      vendor/gopkg.in/src-d/go-git.v4/remote.go:1026 +0x102
==================

Signed-off-by: Ed Bardsley [email protected]

Two problems are fixed:
 - Buffers are not returned to the pool in the case of errors.
 - Per https://golang.org/pkg/bytes/#Buffer.Bytes, the slice returned
   from bytes.Buffer.Bytes() is only valid until the next modification
   of the buffer, so it must be copied before the buffer is returned to the pool.

Running `go test -race` detected the following:

```
==================
WARNING: DATA RACE
Write at 0x00c000224020 by goroutine 15:
  bytes.(*Buffer).WriteByte()
      /usr/local/Cellar/go/1.11.5/libexec/src/bytes/buffer.go:271 +0xc8
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.diffDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go:95 +0x505
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.getDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/diff_delta.go:60 +0x4ae
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).tryToDeltify()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:309 +0x398
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).walk()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:262 +0x33b
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack.func1()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:70 +0x6a

Previous read at 0x00c000224020 by goroutine 8:
  runtime.slicecopy()
      /usr/local/Cellar/go/1.11.5/libexec/src/runtime/slice.go:221 +0x0
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.getDelta()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/memory.go:53 +0x5e2
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).tryToDeltify()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:309 +0x398
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).walk()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:262 +0x33b
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack.func1()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:70 +0x6a

Goroutine 15 (running) created at:
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:69 +0x761
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*Encoder).Encode()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/encoder.go:52 +0xb1
  vendor/gopkg.in/src-d/go-git%2ev4.pushHashes.func1()
      vendor/gopkg.in/src-d/go-git.v4/remote.go:1026 +0x102

Goroutine 8 (finished) created at:
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*deltaSelector).ObjectsToPack()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/delta_selector.go:69 +0x761
  vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile.(*Encoder).Encode()
      vendor/gopkg.in/src-d/go-git.v4/plumbing/format/packfile/encoder.go:52 +0xb1
  vendor/gopkg.in/src-d/go-git%2ev4.pushHashes.func1()
      vendor/gopkg.in/src-d/go-git.v4/remote.go:1026 +0x102
==================
```

Signed-off-by: Ed Bardsley <[email protected]>
@ajnavarro ajnavarro requested a review from jfontan June 4, 2019 07:45
@mcuadros mcuadros merged commit 60033b8 into src-d:master Jun 6, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants