juju/utils/fslock: data race caused by createAliveFile running twice

Bug #1519097 reported by Dave Cheney
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
juju-core
Fix Released
High
James Tunnicliffe

Bug Description

==================
WARNING: DATA RACE
Write by goroutine 12:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:160 +0x5a
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.assertCanLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:30 +0x4c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestCleanNoMatchingProcess()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:392 +0xcc
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80

Previous read by goroutine 14:
  github.com/juju/utils/fslock.(*Lock).createAliveFile.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:175 +0xc5

Goroutine 12 (running) created at:
  gopkg.in/check%2ev1.(*suiteRunner).forkCall()
      /home/dfc/src/gopkg.in/check.v1/check.go:667 +0x48b
  gopkg.in/check%2ev1.(*suiteRunner).forkTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:804 +0x126
  gopkg.in/check%2ev1.(*suiteRunner).runTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:809 +0x38
  gopkg.in/check%2ev1.(*suiteRunner).run()
      /home/dfc/src/gopkg.in/check.v1/check.go:615 +0x481
  gopkg.in/check%2ev1.Run()
      /home/dfc/src/gopkg.in/check.v1/run.go:92 +0x50
  gopkg.in/check%2ev1.RunAll()
      /home/dfc/src/gopkg.in/check.v1/run.go:84 +0x138
  gopkg.in/check%2ev1.TestingT()
      /home/dfc/src/gopkg.in/check.v1/run.go:72 +0x4af
  github.com/juju/utils/fslock_test.Test()
      /home/dfc/src/github.com/juju/utils/fslock/package_test.go:13 +0x2e
  testing.tRunner()
      /home/dfc/go/src/testing/testing.go:456 +0xdc

Goroutine 14 (finished) created at:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:179 +0x99
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.assertCanLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:30 +0x4c
  github.com/juju/utils/fslock_test.newLockedLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:39 +0x19c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestCleanNoMatchingProcess()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:388 +0x6f
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80
==================
==================
WARNING: DATA RACE
Write by goroutine 16:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:160 +0x5a
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.assertCanLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:30 +0x4c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestCleanStaleLock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:384 +0x813
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80

Previous read by goroutine 18:
  github.com/juju/utils/fslock.(*Lock).createAliveFile.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:175 +0xc5

Goroutine 16 (running) created at:
  gopkg.in/check%2ev1.(*suiteRunner).forkCall()
      /home/dfc/src/gopkg.in/check.v1/check.go:667 +0x48b
  gopkg.in/check%2ev1.(*suiteRunner).forkTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:804 +0x126
  gopkg.in/check%2ev1.(*suiteRunner).runTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:809 +0x38
  gopkg.in/check%2ev1.(*suiteRunner).run()
      /home/dfc/src/gopkg.in/check.v1/check.go:615 +0x481
  gopkg.in/check%2ev1.Run()
      /home/dfc/src/gopkg.in/check.v1/run.go:92 +0x50
  gopkg.in/check%2ev1.RunAll()
      /home/dfc/src/gopkg.in/check.v1/run.go:84 +0x138
  gopkg.in/check%2ev1.TestingT()
      /home/dfc/src/gopkg.in/check.v1/run.go:72 +0x4af
  github.com/juju/utils/fslock_test.Test()
      /home/dfc/src/github.com/juju/utils/fslock/package_test.go:13 +0x2e
  testing.tRunner()
      /home/dfc/go/src/testing/testing.go:456 +0xdc

Goroutine 18 (finished) created at:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:179 +0x99
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.assertCanLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:30 +0x4c
  github.com/juju/utils/fslock_test.newLockedLock()
      /home/dfc/src/github.com/juju/utils/fslock/util_test.go:39 +0x19c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestCleanStaleLock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:373 +0x87
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80
==================
==================
WARNING: DATA RACE
Write by goroutine 20:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:160 +0x5a
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).LockWithTimeout()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:323 +0x228
  github.com/juju/utils/fslock_test.(*fslockSuite).TestInitialMessageWhenLocking()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:288 +0x47e
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80

Previous read by goroutine 22:
  github.com/juju/utils/fslock.(*Lock).createAliveFile.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:175 +0xc5

Goroutine 20 (running) created at:
  gopkg.in/check%2ev1.(*suiteRunner).forkCall()
      /home/dfc/src/gopkg.in/check.v1/check.go:667 +0x48b
  gopkg.in/check%2ev1.(*suiteRunner).forkTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:804 +0x126
  gopkg.in/check%2ev1.(*suiteRunner).runTest()
      /home/dfc/src/gopkg.in/check.v1/check.go:809 +0x38
  gopkg.in/check%2ev1.(*suiteRunner).run()
      /home/dfc/src/gopkg.in/check.v1/check.go:615 +0x481
  gopkg.in/check%2ev1.Run()
      /home/dfc/src/gopkg.in/check.v1/run.go:92 +0x50
  gopkg.in/check%2ev1.RunAll()
      /home/dfc/src/gopkg.in/check.v1/run.go:84 +0x138
  gopkg.in/check%2ev1.TestingT()
      /home/dfc/src/gopkg.in/check.v1/run.go:72 +0x4af
  github.com/juju/utils/fslock_test.Test()
      /home/dfc/src/github.com/juju/utils/fslock/package_test.go:13 +0x2e
  testing.tRunner()
      /home/dfc/go/src/testing/testing.go:456 +0xdc

Goroutine 22 (running) created at:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:179 +0x99
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestInitialMessageWhenLocking()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:281 +0x186
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80
==================
==================
WARNING: DATA RACE
Write by goroutine 61:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:160 +0x5a
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestStress.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:314 +0x1d0

Previous read by goroutine 64:
  github.com/juju/utils/fslock.(*Lock).createAliveFile.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:175 +0xc5

Goroutine 61 (running) created at:
  github.com/juju/utils/fslock_test.(*fslockSuite).TestStress()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:332 +0x3ec
  runtime.call32()
      /home/dfc/go/src/runtime/asm_amd64.s:471 +0x3d
  reflect.Value.Call()
      /home/dfc/go/src/reflect/value.go:303 +0xcd
  gopkg.in/check%2ev1.(*suiteRunner).forkTest.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:772 +0x5d1
  gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1()
      /home/dfc/src/gopkg.in/check.v1/check.go:666 +0x80

Goroutine 64 (running) created at:
  github.com/juju/utils/fslock.(*Lock).createAliveFile()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:179 +0x99
  github.com/juju/utils/fslock.(*Lock).acquire()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:247 +0x2ef
  github.com/juju/utils/fslock.(*Lock).lockLoop()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:280 +0x93
  github.com/juju/utils/fslock.(*Lock).Lock()
      /home/dfc/src/github.com/juju/utils/fslock/fslock.go:309 +0x6c
  github.com/juju/utils/fslock_test.(*fslockSuite).TestStress.func1()
      /home/dfc/src/github.com/juju/utils/fslock/fslock_test.go:314 +0x1d0
==================
OK: 20 passed
PASS
Found 4 data race(s)
exit status 66
FAIL github.com/juju/utils/fslock 5.261s

Changed in juju-core:
status: New → Triaged
importance: Undecided → High
Changed in juju-core:
assignee: nobody → James Tunnicliffe (dooferlad)
Changed in juju-core:
status: Triaged → In Progress
Changed in juju-core:
status: In Progress → Fix Committed
Revision history for this message
Dave Cheney (dave-cheney) wrote :

Reopened: #178 was rolled back. https://github.com/juju/utils/pull/179

Changed in juju-core:
status: Fix Committed → Triaged
Changed in juju-core:
status: Triaged → Fix Committed
milestone: none → 1.26-alpha3
Changed in juju-core:
milestone: 1.26-alpha3 → 2.0-alpha1
Changed in juju-core:
milestone: 2.0-alpha1 → 1.26-alpha3
Curtis Hovey (sinzui)
tags: added: race-condition tech-debt
Curtis Hovey (sinzui)
Changed in juju-core:
status: Fix Committed → Fix Released
tags: added: 2.0-count
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.