From a1a0bb55d4498ffa8d2bf782432b9905f78a2466 Mon Sep 17 00:00:00 2001 From: Chennamma-Hotkar Date: Mon, 18 May 2026 16:12:08 +0000 Subject: [PATCH 1/2] fix(unikontainers): warn on vAccel misconfiguration Introduce ErrVAccelDisabled to distinguish missing vAccel config from actual misconfiguration. Log Warn instead of Debug on error. Fixes: #698 Signed-off-by: Chennamma-Hotkar --- pkg/unikontainers/unikontainers.go | 4 ++- pkg/unikontainers/vaccel.go | 8 ++++-- pkg/unikontainers/vaccel_test.go | 44 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/pkg/unikontainers/unikontainers.go b/pkg/unikontainers/unikontainers.go index b7d61def7..10209d2d5 100644 --- a/pkg/unikontainers/unikontainers.go +++ b/pkg/unikontainers/unikontainers.go @@ -528,7 +528,9 @@ func (u *Unikontainer) Exec(metrics m.Writer) error { // vAccel setup vAccelType, vsockSocketPath, rpcAddress, err := resolveVAccelConfig(u.State.Annotations[annotHypervisor], u.Spec.Annotations) if err != nil { - uniklog.Debugf("vAccel config: %v", err) + if !errors.Is(err, ErrVAccelDisabled) { + uniklog.Warnf("vAccel misconfiguration: %v", err) + } } if vAccelType == "vsock" && err == nil { diff --git a/pkg/unikontainers/vaccel.go b/pkg/unikontainers/vaccel.go index 909089c9b..f6905696f 100644 --- a/pkg/unikontainers/vaccel.go +++ b/pkg/unikontainers/vaccel.go @@ -15,12 +15,17 @@ package unikontainers import ( + "errors" "fmt" "regexp" "golang.org/x/sys/unix" ) +// ErrVAccelDisabled is returned by resolveVAccelConfig when the vAccel +// annotation is absent. This is an expected condition, not a misconfiguration. +var ErrVAccelDisabled = errors.New("vaccel is disabled") + // idToGuestCID generates a deterministic guest CID (Context Identifier) // for vsock communication based on a container or VM ID. func idToGuestCID(id string) int { @@ -87,8 +92,7 @@ func resolveVAccelConfig(hypervisor string, annotations map[string]string) (stri return vAccelType, "", "", err } } else { - err = fmt.Errorf("vaccel is disabled") - return vAccelType, "", "", err + return "", "", "", ErrVAccelDisabled } if vAccelType == "vsock" { diff --git a/pkg/unikontainers/vaccel_test.go b/pkg/unikontainers/vaccel_test.go index 3a6ca47f1..37a5ef2fb 100644 --- a/pkg/unikontainers/vaccel_test.go +++ b/pkg/unikontainers/vaccel_test.go @@ -15,6 +15,7 @@ package unikontainers import ( + "errors" "testing" "github.com/stretchr/testify/assert" @@ -168,3 +169,46 @@ func TestIsValidVSockAddress(t *testing.T) { }) } } + +func TestResolveVAccelConfig(t *testing.T) { + t.Run("vaccel disabled returns ErrVAccelDisabled", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{} + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.ErrorIs(t, err, ErrVAccelDisabled) + }) + + t.Run("vaccel enabled but rpc address missing returns error", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + } + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.Error(t, err) + assert.False(t, errors.Is(err, ErrVAccelDisabled), "missing rpc address should not be ErrVAccelDisabled") + }) + + t.Run("vaccel enabled with malformed rpc address returns error", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + "com.urunc.unikernel.RPCAddress": "invalid-address", + } + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.Error(t, err) + assert.False(t, errors.Is(err, ErrVAccelDisabled), "malformed address should not be ErrVAccelDisabled") + }) + + t.Run("vaccel enabled with valid qemu vsock address succeeds", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + "com.urunc.unikernel.RPCAddress": "vsock://2:1234", + } + vAccelType, _, addr, err := resolveVAccelConfig("qemu", annotations) + assert.NoError(t, err) + assert.Equal(t, "vsock", vAccelType) + assert.Equal(t, "vsock://2:1234", addr) + }) +} + From 1e044a8f7cf20ff74011e6343ddfb045b4842536 Mon Sep 17 00:00:00 2001 From: Chennamma-Hotkar Date: Wed, 20 May 2026 13:40:13 +0000 Subject: [PATCH 2/2] chore(contributors): add new contributor entry Signed-off-by: Chennamma-Hotkar --- .github/contributors.yaml | 3 +++ pkg/unikontainers/vaccel_test.go | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/contributors.yaml b/.github/contributors.yaml index 68ada9327..73e2bf252 100644 --- a/.github/contributors.yaml +++ b/.github/contributors.yaml @@ -101,3 +101,6 @@ users: mdryaan: name: Md Raiyan email: alikhurshid842001@gmail.com + Chennamma-Hotkar: + name: Chennamma Hotkar + email: channuhotkar@gmail.com diff --git a/pkg/unikontainers/vaccel_test.go b/pkg/unikontainers/vaccel_test.go index 37a5ef2fb..9ab8f01d8 100644 --- a/pkg/unikontainers/vaccel_test.go +++ b/pkg/unikontainers/vaccel_test.go @@ -191,8 +191,8 @@ func TestResolveVAccelConfig(t *testing.T) { t.Run("vaccel enabled with malformed rpc address returns error", func(t *testing.T) { t.Parallel() annotations := map[string]string{ - "com.urunc.unikernel.vAccel": "vsock", - "com.urunc.unikernel.RPCAddress": "invalid-address", + "com.urunc.unikernel.vAccel": "vsock", + "com.urunc.unikernel.RPCAddress": "invalid-address", } _, _, _, err := resolveVAccelConfig("qemu", annotations) assert.Error(t, err) @@ -211,4 +211,3 @@ func TestResolveVAccelConfig(t *testing.T) { assert.Equal(t, "vsock://2:1234", addr) }) } -