[lxc-devel] [lxd/master] Process tracking fixes
stgraber on Github
lxc-bot at linuxcontainers.org
Tue May 26 15:09:48 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200526/1099da00/attachment-0001.bin>
-------------- next part --------------
From 901c2ae25c607db6f2916ae5e7e37ad921509af5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 26 May 2020 10:55:16 -0400
Subject: [PATCH 1/3] shared/subprocess: Fix race condition
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
shared/subprocess/proc.go | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/shared/subprocess/proc.go b/shared/subprocess/proc.go
index ca24eca9f1..8ce430e171 100644
--- a/shared/subprocess/proc.go
+++ b/shared/subprocess/proc.go
@@ -48,6 +48,9 @@ func (p *Process) Stop() error {
}
}
+ // Wait for any background goroutine to be done.
+ <-p.chExit
+
// Check if either the existence check or the kill resulted in an already finished error.
if strings.Contains(err.Error(), "process already finished") {
return ErrNotRunning
@@ -103,8 +106,7 @@ func (p *Process) Start() error {
return
}
- exitcode := int64(procstate.Sys().(syscall.WaitStatus).ExitStatus())
- p.exitCode = exitcode
+ p.exitCode = int64(procstate.ExitCode())
close(p.chExit)
}()
From f8304e70967a7d50d7e16648d3f76f1dda0d8fb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 26 May 2020 11:08:54 -0400
Subject: [PATCH 2/3] lxd: Make use of ExitCode
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/device/device_utils_disk.go | 6 ++----
lxd/patches_utils.go | 4 +---
lxd/rsync/rsync.go | 4 +---
lxd/storage/drivers/driver_ceph_utils.go | 15 +++++----------
lxd/storage/drivers/driver_common.go | 5 +----
lxd/storage/drivers/driver_lvm_utils.go | 4 +---
6 files changed, 11 insertions(+), 27 deletions(-)
diff --git a/lxd/device/device_utils_disk.go b/lxd/device/device_utils_disk.go
index a9245d0d0e..217be7e157 100644
--- a/lxd/device/device_utils_disk.go
+++ b/lxd/device/device_utils_disk.go
@@ -6,7 +6,6 @@ import (
"os"
"os/exec"
"strings"
- "syscall"
"time"
"golang.org/x/sys/unix"
@@ -149,13 +148,12 @@ again:
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 22 {
+ if exitError.ExitCode() == 22 {
// EINVAL (already unmapped)
return nil
}
- if waitStatus.ExitStatus() == 16 {
+ if exitError.ExitCode() == 16 {
// EBUSY (currently in use)
busyCount++
if busyCount == 10 {
diff --git a/lxd/patches_utils.go b/lxd/patches_utils.go
index c66ad692fd..256422f32e 100644
--- a/lxd/patches_utils.go
+++ b/lxd/patches_utils.go
@@ -9,7 +9,6 @@ import (
"sort"
"strconv"
"strings"
- "syscall"
"github.com/lxc/lxd/lxd/project"
"github.com/lxc/lxd/lxd/state"
@@ -171,8 +170,7 @@ func lvmLVExists(lvName string) (bool, error) {
if ok {
exitError, ok := runErr.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 5 {
+ if exitError.ExitCode() == 5 {
// logical volume not found
return false, nil
}
diff --git a/lxd/rsync/rsync.go b/lxd/rsync/rsync.go
index 8f811ff4f8..b5b70a58ce 100644
--- a/lxd/rsync/rsync.go
+++ b/lxd/rsync/rsync.go
@@ -7,7 +7,6 @@ import (
"net"
"os"
"os/exec"
- "syscall"
"time"
"github.com/pborman/uuid"
@@ -67,8 +66,7 @@ func LocalCopy(source string, dest string, bwlimit string, xattrs bool, rsyncArg
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 24 {
+ if exitError.ExitCode() == 24 {
return msg, nil
}
}
diff --git a/lxd/storage/drivers/driver_ceph_utils.go b/lxd/storage/drivers/driver_ceph_utils.go
index 47ebdb1be2..a7a0f1fea6 100644
--- a/lxd/storage/drivers/driver_ceph_utils.go
+++ b/lxd/storage/drivers/driver_ceph_utils.go
@@ -10,7 +10,6 @@ import (
"regexp"
"strconv"
"strings"
- "syscall"
"time"
"github.com/pborman/uuid"
@@ -157,13 +156,12 @@ again:
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 22 {
+ if exitError.ExitCode() == 22 {
// EINVAL (already unmapped).
return nil
}
- if waitStatus.ExitStatus() == 16 {
+ if exitError.ExitCode() == 16 {
// EBUSY (currently in use).
busyCount++
if busyCount == 10 {
@@ -203,8 +201,7 @@ again:
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 22 {
+ if exitError.ExitCode() == 22 {
// EINVAL (already unmapped).
return nil
}
@@ -256,8 +253,7 @@ func (d *ceph) rbdProtectVolumeSnapshot(vol Volume, snapshotName string) error {
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 16 {
+ if exitError.ExitCode() == 16 {
// EBUSY (snapshot already protected).
return nil
}
@@ -287,8 +283,7 @@ func (d *ceph) rbdUnprotectVolumeSnapshot(vol Volume, snapshotName string) error
if ok {
exitError, ok := runError.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 22 {
+ if exitError.ExitCode() == 22 {
// EBUSY (snapshot already unprotected).
return nil
}
diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go
index 7f0c7dbf78..e3992540c4 100644
--- a/lxd/storage/drivers/driver_common.go
+++ b/lxd/storage/drivers/driver_common.go
@@ -4,7 +4,6 @@ import (
"fmt"
"os/exec"
"strings"
- "syscall"
"github.com/pkg/errors"
@@ -207,11 +206,9 @@ func (d *common) moveGPTAltHeader(devPath string) error {
if ok {
exitError, ok := runErr.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
-
// sgdisk manpage says exit status 3 means:
// "Non-GPT disk detected and no -g option, but operation requires a write action".
- if waitStatus.ExitStatus() == 3 {
+ if exitError.ExitCode() == 3 {
return nil // Non-error as non-GPT disk specified.
}
}
diff --git a/lxd/storage/drivers/driver_lvm_utils.go b/lxd/storage/drivers/driver_lvm_utils.go
index fed31681bc..25fccb82bb 100644
--- a/lxd/storage/drivers/driver_lvm_utils.go
+++ b/lxd/storage/drivers/driver_lvm_utils.go
@@ -7,7 +7,6 @@ import (
"path/filepath"
"strconv"
"strings"
- "syscall"
"github.com/pkg/errors"
@@ -120,8 +119,7 @@ func (d *lvm) isLVMNotFoundExitError(err error) bool {
if ok {
exitError, ok := runErr.Err.(*exec.ExitError)
if ok {
- waitStatus := exitError.Sys().(syscall.WaitStatus)
- if waitStatus.ExitStatus() == 5 {
+ if exitError.ExitCode() == 5 {
return true
}
}
From ed5cf84fec386e98e524ed20995d72951d7c7854 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 26 May 2020 11:09:30 -0400
Subject: [PATCH 3/3] share/subprocess: Reduce sleep back to 5
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
shared/subprocess/testscript/stoprestart.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/shared/subprocess/testscript/stoprestart.sh b/shared/subprocess/testscript/stoprestart.sh
index fb36b8e0c8..2f74e74ce2 100644
--- a/shared/subprocess/testscript/stoprestart.sh
+++ b/shared/subprocess/testscript/stoprestart.sh
@@ -2,4 +2,4 @@
echo "hello again"
echo "waiting now"
-sleep 10
+sleep 5
More information about the lxc-devel
mailing list