mirror of
https://github.com/siderolabs/talos.git
synced 2025-11-03 09:51:32 +01:00
fix: retry blockdevice open in the installer
We had these retries in other places, but not here. This seems to happen more frequently with Linux 6.6 update, the tl;dr is same: `udevd` tries to rescan the partition table at the wrong moment, preventing Talos installer to open the partition which was just created. It's a race, so workaround it by retrying the call. Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
This commit is contained in:
parent
593afeea38
commit
a5e13c696d
@ -9,9 +9,11 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/siderolabs/go-blockdevice/blockdevice"
|
"github.com/siderolabs/go-blockdevice/blockdevice"
|
||||||
"github.com/siderolabs/go-procfs/procfs"
|
"github.com/siderolabs/go-procfs/procfs"
|
||||||
|
"github.com/siderolabs/go-retry/retry"
|
||||||
|
|
||||||
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime"
|
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime"
|
||||||
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board"
|
"github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board"
|
||||||
@ -229,7 +231,7 @@ func (i *Installer) Install(ctx context.Context, mode Mode) (err error) {
|
|||||||
|
|
||||||
var bd *blockdevice.BlockDevice
|
var bd *blockdevice.BlockDevice
|
||||||
|
|
||||||
bd, err = blockdevice.Open(device)
|
bd, err = retryBlockdeviceOpen(device)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -368,3 +370,20 @@ func (i *Installer) runPreflightChecks(mode Mode) error {
|
|||||||
|
|
||||||
return checks.Run(ctx)
|
return checks.Run(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func retryBlockdeviceOpen(device string) (*blockdevice.BlockDevice, error) {
|
||||||
|
var bd *blockdevice.BlockDevice
|
||||||
|
|
||||||
|
err := retry.Constant(10*time.Second, retry.WithUnits(100*time.Millisecond)).Retry(func() error {
|
||||||
|
var openErr error
|
||||||
|
|
||||||
|
bd, openErr = blockdevice.Open(device)
|
||||||
|
if openErr != nil && os.IsNotExist(openErr) {
|
||||||
|
return retry.ExpectedError(openErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return openErr
|
||||||
|
})
|
||||||
|
|
||||||
|
return bd, err
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user