Skip to content

Commit 99b03b3

Browse files
committed
agent: retry mount on ENOMEM
There is a race between firecracker-containerd replacing the stub drive with the actual drive and mounting this drive. When the disk is replaced the kernel will schedule asynchronous work in virtblk_config_changed. In the meantime firecracker-containerd can proceed and already send a mount command to the agent running in the guest. This mount operation will, however, fail because the guest kernel still sees the stub drive with only 512 bytes in size. The resulting error code is a ENOMEM in this case. This commit therefore adds this as an retryable error code to accommodate for this situation. The issue can be reproduced when an artificial msleep(1000) is added in virtblk_config_changed_work. This produced the following error: error="failed to get stub drive for task \"test\": failed to mount drive inside vm: failed to mount newly patched drive: rpc error: code = Unknown desc = non-retryable failure mounting drive from \"/dev/vdb\" to \"/container/test/rootfs\": cannot allocate memory" Signed-off-by: Maximilian Heyne <[email protected]>
1 parent 73f17ac commit 99b03b3

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

agent/error.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import (
1818
)
1919

2020
// isRetryableMountError will check to see if the error passed in is an
21-
// syscall.EINVAL
21+
// syscall.EINVAL or syscall.ENOMEM
2222
func isRetryableMountError(err error) bool {
2323
errno, ok := err.(syscall.Errno)
24-
return ok && errno == syscall.EINVAL
24+
return ok && (errno == syscall.EINVAL || errno == syscall.ENOMEM)
2525
}

agent/error_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ func TestIsRetryableMountError(t *testing.T) {
3737
Error: syscall.EINVAL,
3838
Expected: true,
3939
},
40+
{
41+
Name: "syscall.Errno ENOMEM case",
42+
Error: syscall.ENOMEM,
43+
Expected: true,
44+
},
4045
{
4146
Name: "syscall.Errno ENOENT case",
4247
Error: syscall.ENOENT,

0 commit comments

Comments
 (0)