From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=Ie8bEV0CJ8hx3en4big/X1HgYrwEFKTCuNDHQoP8FeA=; b=gS7UcEwQkHvkFzl/lx9ShpDKN16vHuE1MhzRdQg2b0d8rfAG7ZpFFDf3xLGTvZeyRC fZ1cBCvwJ9XBfe5LytNPFQV+lLAQqQxkpr0oL1gLJybwjGV6hWmpnnY55w1Bm13mTrFY 1a02X4DuwH/NT69s2rPyqKhLeJGavdTaAnj3V57Bx9HM+IJu/MzRpNYBhTuUXz4rAUx3 REL6cA57MpYpbWS24E10hsCwd3EwW5SElzKhqFjyop2OtUr6axAQqaWRhptGR8JzzRh3 iYxMIFag+0YReNsSKARmFOS/0Ke5FT+/pzzpqHMJCTNYn57vBHNYaFW5MXdgVl+3iAdv zy/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=Ie8bEV0CJ8hx3en4big/X1HgYrwEFKTCuNDHQoP8FeA=; b=BDX/VjjEOg34e9pyVrkW+i8QqKVEvlgJASvyLqkbNYQcK/x8NqJNJQKNKUaS3eO7Xj 94rtQYQHdQqFQFrhyfnrkp5uYVmUv29Ot/NDCdqqEghrncsVSImZ2ZhNrSfIs8+As0xG Ok2ZczjZWO2LAOjOpvtrrLdSJPDAaPPbAYuzDab2XzQbQzhV1n9PKkRBBqhPXQYm389X 8yLemxFPo7teLKZPSDNGOAaEYUw94qTA8Zm7/PR0oB5txX1jDB4WiNMryHFzIZi5C52M NrQIuOKTVrr+4PqxJHB9sHSiu//C1vW0WbpIBoOw3t1jdzwl+iAbbN7J7QanENEnYuWO nBXA== X-Gm-Message-State: AOAM530kIXgAUxmoKh3kwzW6RJW21sp6o2ZHT+SUmt4/vYuMaWlzTaFf zwSXcS/j5a6b23nMg4i9y0VJvAbXhws= X-Google-Smtp-Source: ABdhPJzmXIMHiDgoq+lcmh4n80ML4PPWO3xWnAC8VSybE4zjEeWqOfNk+o8NX6h3A9m7hFcJ2wmE7w== X-Received: by 2002:a05:6512:3611:: with SMTP id f17mr14118620lfs.409.1635276719487; Tue, 26 Oct 2021 12:31:59 -0700 (PDT) To: make-initrd@lists.altlinux.org References: <20211024172108.668CDA5E4C@lists.altlinux.org> <20211026105516.jfbatbtjfah74vou@example.org> <37c46f84-217f-81bd-56a9-1d5b8d02d670@gmail.com> <20211026135552.wratyys3jkvboqm6@example.org> <20211026140528.pqyv5jgqclcef4ry@example.org> From: Leonid Krivoshein Message-ID: Date: Tue, 26 Oct 2021 22:31:58 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20211026140528.pqyv5jgqclcef4ry@example.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: ru Subject: Re: [make-initrd] [PATCH v6 08/22] bootchain-waitdev: introduces an optional waitdev_timeout X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Oct 2021 19:32:02 -0000 Archived-At: List-Archive: 26.10.2021 17:05, Alexey Gladkov пишет: > On Tue, Oct 26, 2021 at 03:55:52PM +0200, Alexey Gladkov wrote: >> On Tue, Oct 26, 2021 at 02:25:55PM +0300, Leonid Krivoshein wrote: >>> 26.10.2021 13:55, Alexey Gladkov пишет: >>>> On Sun, Oct 24, 2021 at 08:21:08PM +0300, Leonid Krivoshein wrote: >>>>> "waitdev_timeout" describes a common timeout for all "waitdev" steps >>>>> in the "bootchain". Defining a timeout allows to use a fallback if >>>>> the specified devices are not ready yet. By default is not set, which >>>>> makes to wait forever. >>>>> >>>>> Signed-off-by: Leonid Krivoshein >>>>> --- >>>>> features/bootchain-waitdev/README.md | 3 +++ >>>>> .../etc/initrd/cmdline.d/bootchain-waitdev | 1 + >>>>> .../data/lib/bootchain/waitdev | 18 ++++++++++++++++++ >>>>> .../data/lib/initrd/pre/bootchain/300-waitdev | 3 +++ >>>>> 4 files changed, 25 insertions(+) >>>>> >>>>> diff --git a/features/bootchain-waitdev/README.md b/features/bootchain-waitdev/README.md >>>>> index 126a904..d6bae63 100644 >>>>> --- a/features/bootchain-waitdev/README.md >>>>> +++ b/features/bootchain-waitdev/README.md >>>>> @@ -13,6 +13,9 @@ feature. It allows to wait a specified block or character special devices. >>>>> the same as `root=`, but with optional `CDROM:` prefix. This parameter can be >>>>> specified more than once depending on how many times a corresponding element >>>>> is mentioned in the `bootchain`. >>>>> +- `waitdev_timeout` describes a common timeout for all `waitdev` steps in the >>>>> + `bootchain`. Defining a timeout allows to use a fallback if the specified >>>>> + devices are not ready yet. By default is not set, which makes to wait forever. >>>> Почему он общий между всеми waitdev ??? >>> Логика в этом железная: если для сборки корня шагам, следующим за >>> wiatdev'ами, нужны все указанные устройства, то не имеет значения, какого >>> устройства в цепочке не хватает. Это очень похоже на общий rootdelay и схему >>> "И". Общий таймаут нужен для того, чтобы не ждать вечно и дать возможность >>> отработать некоему fallback'у, следующим за этими шагами, или выдать общий >>> на все отказы диалог, и вернуться в начало. >> Аналогия с rootdelay= тут не корректна т.к. rootdelay= распространяется на >> весь процесс загрузки. Я бы понял, если бы timeout распространялся на весь >> bootchain=, тогда было бы логично. >> >> Таймаут логичен если после него будет либо ошибка, либо предполагаются >> какие-то действия. >> >> Я предложил добавить таймаут как параметр конкретного waitdev. >> >>>> Получается, если первый waitdev прождал весь wait_timeout, то остальные >>>> даже пробовать не будут, но это же неправильно так как они другой девайс >>>> ожидают. >>> Можно было бы им дать попробовать без дополнительных sleep'ов, но есть два >>> контраргумента: >>> >>> 1) Цепочка могла быть построена исходя из знания, что к устройству "Б" >>> нельзя обращаться, пока не будет подключено устройство "А". Обращение к "Б" >>> без готовности "А" может привести к нехорошим последствиям, типа зависания. >>> >>> 2) Чтобы отработал fallback, по всей видимости, последний waitdev не должен >>> быть готов. >> А как происходит этот fallback ? >> >> В твоей реализации если достигнут таймаут, то последующие waitdev просто >> exit 0 делают и невозможно понять дождались они чего-то или нет. >> >> Получается, что следующий шаг может только гадать о результате waitdev. >> >> Потому что мне сейчас приходит в голову сделать параметр (или шаг) >> onfail, но это явно не то чем пользуешься ты для failback. > Ох. Ты спрятал его в 16 патче в next_bootchain. Но тогда у меня всё равно > вопрос, как будет происходить fallback если next_bootchain waitdev не > вызывает ? Без вызова next_bootchain и многоходовочки: waitdev,waidev,localdev waitdev_timeout=7 waitdev=... waitdev=... altboot_localdev=... Имеем два wiatdev, один localdev и общий таймаут на все waitdev'ы. Если первый или второй waidev не уложатся в 7 секунд, т.е. если за заданное время не будет найдено всех заданных устройств waitdev, не тормозим, а переходим к следующему шагу localdev. В этом суть fallback'а и общего таймаута. localdev может проверить результат предыдущего шага, ему достаточно проверить только последний waitdev. В одном из первых коммитов давалось объяснение, что в ближайшее время планируется заапстримить несколько модулей bootchain, так что не удивительно, что мы не видим всей картины сразу. >>> Если игнорировать эти моменты, можно дать хотя бы попробовать проверить >>> готовность следующих устройств без дополнительных sleep'ов, благо асинхронно >>> работающая конструкция это позволяет сделать. >>> >>> >>>> Например, мы ждём сначала cdrom, а потом usb-флешку с ключом. >>>> >>>>> ## Example >>>>> diff --git a/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev b/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>>> index 3544c25..6929a86 100644 >>>>> --- a/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>>> +++ b/features/bootchain-waitdev/data/etc/initrd/cmdline.d/bootchain-waitdev >>>>> @@ -1 +1,2 @@ >>>>> register_array string WAITDEV >>>>> +register_parameter number WAITDEV_TIMEOUT >>>>> diff --git a/features/bootchain-waitdev/data/lib/bootchain/waitdev b/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>>> index 60464d9..fa99c45 100755 >>>>> --- a/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>>> +++ b/features/bootchain-waitdev/data/lib/bootchain/waitdev >>>>> @@ -3,6 +3,14 @@ >>>>> . bootchain-sh-functions >>>>> check_parameter WAITDEV >>>>> + >>>>> +timeout= >>>>> +timecnt=/.initrd/bootchain/waitdev/TIMECNT >>>>> + >>>>> +[ ! -s "$timecnt" ] || >>>>> + read -r timeout < "$timecnt" ||: >>>>> +[ "$timeout" != 0 ] || >>>>> + exit 0 >>>>> devspec="$(get_parameter WAITDEV)" >>>>> while [ -n "$devspec" ]; do >>>>> @@ -25,4 +33,14 @@ while [ -n "$devspec" ]; do >>>>> fi >>>>> sleep 1 >>>>> + [ -n "$timeout" ] || >>>>> + continue >>>>> + timeout=$(($timeout - 1)) >>>>> + >>>>> + if [ "$timeout" = 0 ]; then >>>>> + message "device waiting timeout exceedded" >>>>> + break >>>>> + fi >>>>> done >>>>> + >>>>> +[ -z "$timeout" ] || printf '%s\n' "$timeout" > "$timecnt" >>>>> diff --git a/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev b/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>>> index 3642722..5e0f040 100755 >>>>> --- a/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>>> +++ b/features/bootchain-waitdev/data/lib/initrd/pre/bootchain/300-waitdev >>>>> @@ -5,6 +5,9 @@ >>>>> dir=/.initrd/bootchain/waitdev >>>>> mkdir -p -- "$dir" >>>>> +[ -z "${WAITDEV_TIMEOUT-}" ] || >>>>> + printf '%s\n' "$WAITDEV_TIMEOUT" >"$dir"/TIMECNT >>>>> + >>>>> i=0 >>>>> while [ "$i" -lt "${WAITDEV:-0}" ]; do >>>>> touch "$dir/$i" >>>>> -- >>>>> 2.24.1 >>>>> >>>>> _______________________________________________ >>>>> Make-initrd mailing list >>>>> Make-initrd@lists.altlinux.org >>>>> https://lists.altlinux.org/mailman/listinfo/make-initrd >>>>> >>> -- >>> Best regards, >>> Leonid Krivoshein. >>> >>> _______________________________________________ >>> Make-initrd mailing list >>> Make-initrd@lists.altlinux.org >>> https://lists.altlinux.org/mailman/listinfo/make-initrd >> -- >> Rgrds, legion >> >> _______________________________________________ >> Make-initrd mailing list >> Make-initrd@lists.altlinux.org >> https://lists.altlinux.org/mailman/listinfo/make-initrd -- Best regards, Leonid Krivoshein.