summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@pm.me>2019-02-15 10:33:59 -0500
committerMatthew Heon <matthew.heon@pm.me>2019-02-21 10:51:42 -0500
commitf9c548219b6543959dd240618f8a922fdbcabc6d (patch)
treef992bfd9c0bf4d0afb98b79b03ead819aa247ae8
parenta72025d6fd111bfa2dc4e1d22871966fec614f88 (diff)
downloadpodman-f9c548219b6543959dd240618f8a922fdbcabc6d.tar.gz
podman-f9c548219b6543959dd240618f8a922fdbcabc6d.tar.bz2
podman-f9c548219b6543959dd240618f8a922fdbcabc6d.zip
Recreate SHM locks when renumbering on count mismatch
When we're renumbering locks, we're destroying all existing allocations anyways, so destroying the old lock struct is not a particularly big deal. Existing long-lived libpod instances will continue to use the old locks, but that will be solved in a followon. Also, solve an issue with returning error values in the C code. There were a few places where we return ERRNO where it was not set, so make them return actual error codes). Signed-off-by: Matthew Heon <matthew.heon@pm.me>
-rw-r--r--libpod/lock/shm/shm_lock.c6
-rw-r--r--libpod/runtime.go26
2 files changed, 24 insertions, 8 deletions
diff --git a/libpod/lock/shm/shm_lock.c b/libpod/lock/shm/shm_lock.c
index 367055823..d11fce71a 100644
--- a/libpod/lock/shm/shm_lock.c
+++ b/libpod/lock/shm/shm_lock.c
@@ -203,6 +203,8 @@ shm_struct_t *setup_lock_shm(char *path, uint32_t num_locks, int *error_code) {
// terminating NULL byte.
// Returns a valid pointer on success or NULL on error.
// If an error occurs, negative ERRNO values will be written to error_code.
+// ERANGE is returned for a mismatch between num_locks and the number of locks
+// available in the the SHM lock struct.
shm_struct_t *open_lock_shm(char *path, uint32_t num_locks, int *error_code) {
int shm_fd;
shm_struct_t *shm;
@@ -255,11 +257,11 @@ shm_struct_t *open_lock_shm(char *path, uint32_t num_locks, int *error_code) {
// Need to check the SHM to see if it's actually our locks
if (shm->magic != MAGIC) {
- *error_code = -1 * errno;
+ *error_code = -1 * EBADF;
goto CLEANUP;
}
if (shm->num_locks != (num_bitmaps * BITMAP_SIZE)) {
- *error_code = -1 * errno;
+ *error_code = -1 * ERANGE;
goto CLEANUP;
}
diff --git a/libpod/runtime.go b/libpod/runtime.go
index bc7c061c4..850df4fc9 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -7,6 +7,7 @@ import (
"os/exec"
"path/filepath"
"sync"
+ "syscall"
"github.com/BurntSushi/toml"
is "github.com/containers/image/storage"
@@ -757,12 +758,6 @@ func makeRuntime(runtime *Runtime) (err error) {
aliveLock.Unlock()
}
}()
- // If we're renumbering locks, do it now.
- // It breaks out of normal runtime init, and will not return a valid
- // runtime.
- if runtime.doRenumber {
- return runtime.renumberLocks()
- }
_, err = os.Stat(runtimeAliveFile)
if err != nil {
@@ -789,12 +784,31 @@ func makeRuntime(runtime *Runtime) (err error) {
if err != nil {
return err
}
+ } else if err == syscall.ERANGE && runtime.doRenumber {
+ // ERANGE indicates a lock numbering mismatch.
+ // Since we're renumbering, this is not fatal.
+ // Remove the earlier set of locks and recreate.
+ if err := os.Remove(filepath.Join("/dev/shm", lockPath)); err != nil {
+ return errors.Wrapf(err, "error removing libpod locks file %s", lockPath)
+ }
+
+ manager, err = lock.NewSHMLockManager(lockPath, runtime.config.NumLocks)
+ if err != nil {
+ return err
+ }
} else {
return err
}
}
runtime.lockManager = manager
+ // If we're renumbering locks, do it now.
+ // It breaks out of normal runtime init, and will not return a valid
+ // runtime.
+ if runtime.doRenumber {
+ return runtime.renumberLocks()
+ }
+
// If we need to refresh the state, do it now - things are guaranteed to
// be set up by now.
if doRefresh {