Merge pull request #2083 from mheon/shm_locking_fixes

Address lingering review comments from SHM locking PR
This commit is contained in:
OpenShift Merge Robot
2019-01-07 07:49:49 -08:00
committed by GitHub
4 changed files with 17 additions and 6 deletions

View File

@ -43,6 +43,9 @@ type Locker interface {
// encounters a fatal error.
// All errors must be handled internally, as they are not returned. For
// the most part, panicking should be appropriate.
// Some lock implementations may require that Lock() and Unlock() occur
// within the same goroutine (SHM locking, for example). The usual Go
// Lock()/defer Unlock() pattern will still work fine in these cases.
Lock()
// Unlock unlocks the lock.
// All errors must be handled internally, as they are not returned. For

View File

@ -36,7 +36,7 @@ type SHMLocks struct { // nolint
// size used by the underlying implementation.
func CreateSHMLock(path string, numLocks uint32) (*SHMLocks, error) {
if numLocks == 0 {
return nil, errors.Wrapf(syscall.EINVAL, "number of locks must greater than 0 0")
return nil, errors.Wrapf(syscall.EINVAL, "number of locks must be greater than 0")
}
locks := new(SHMLocks)
@ -65,7 +65,7 @@ func CreateSHMLock(path string, numLocks uint32) (*SHMLocks, error) {
// segment was created with.
func OpenSHMLock(path string, numLocks uint32) (*SHMLocks, error) {
if numLocks == 0 {
return nil, errors.Wrapf(syscall.EINVAL, "number of locks must greater than 0")
return nil, errors.Wrapf(syscall.EINVAL, "number of locks must be greater than 0")
}
locks := new(SHMLocks)

View File

@ -256,13 +256,13 @@ func TestLockSemaphoreActuallyLocks(t *testing.T) {
// Ensures that runtime.LockOSThread() is doing its job
func TestLockAndUnlockTwoSemaphore(t *testing.T) {
runLockTest(t, func(t *testing.T, locks *SHMLocks) {
err := locks.LockSemaphore(0)
err := locks.LockSemaphore(5)
assert.NoError(t, err)
err = locks.LockSemaphore(1)
err = locks.LockSemaphore(6)
assert.NoError(t, err)
err = locks.UnlockSemaphore(1)
err = locks.UnlockSemaphore(6)
assert.NoError(t, err)
// Now yield scheduling
@ -272,7 +272,7 @@ func TestLockAndUnlockTwoSemaphore(t *testing.T) {
// And unlock the last semaphore
// If we are in a different OS thread, this should fail.
// However, runtime.UnlockOSThread() should guarantee we are not
err = locks.UnlockSemaphore(0)
err = locks.UnlockSemaphore(5)
assert.NoError(t, err)
})
}

View File

@ -3,7 +3,10 @@
package lock
import (
"syscall"
"github.com/containers/libpod/libpod/lock/shm"
"github.com/pkg/errors"
)
// SHMLockManager manages shared memory locks.
@ -60,6 +63,11 @@ func (m *SHMLockManager) RetrieveLock(id uint32) (Locker, error) {
lock.lockID = id
lock.manager = m
if id >= m.locks.GetMaxLocks() {
return nil, errors.Wrapf(syscall.EINVAL, "lock ID %d is too large - max lock size is %d",
id, m.locks.GetMaxLocks()-1)
}
return lock, nil
}