git: 77e1ccbee3ed - main - rc: implement parallel boot
Cy Schubert
Cy.Schubert at cschubert.com
Wed Feb 24 14:15:28 UTC 2021
In message <f8c96f59-bf38-42c8-bd3c-0f486eebd4f9 at FreeBSD.org>, Baptiste
Darouss
in writes:
>
> 24 févr. 2021 14:48:29 Cy Schubert <Cy.Schubert at cschubert.com>:
>
> > In message <20210224092047.qjazicrzfvnf4vb2 at aniel.nours.eu>, Baptiste
> > Daroussin
> > writes:
> >>
> >>
> >> --7stizekjxx47ph24
> >> Content-Type: text/plain; charset=us-ascii
> >> Content-Disposition: inline
> >> Content-Transfer-Encoding: quoted-printable
> >>
> >> On Tue, Feb 23, 2021 at 05:05:37PM -0800, Cy Schubert wrote:
> >>> In message <202102231027.11NARYYE041280 at gitrepo.freebsd.org>, Baptiste=20
> >>> Daroussi
> >>> n writes:
> >>>> The branch main has been updated by bapt:
> >>>>
> >>>> URL: https://cgit.FreeBSD.org/src/commit/?id=3D77e1ccbee3ed6c837929e4e2=
> >> 32fd07f9
> >>>> 5bfc8294
> >>>>
> >>>> commit 77e1ccbee3ed6c837929e4e232fd07f95bfc8294
> >>>> Author:Â Â Â Â Rick Parrish <unitrunker at gmail.com>
> >>>> AuthorDate: 2021-02-07 06:15:21 +0000
> >>>> Commit:Â Â Â Â Baptiste Daroussin <bapt at FreeBSD.org>
> >>>> CommitDate: 2021-02-23 10:16:53 +0000
> >>>>
> >>>> Â Â Â rc: implement parallel boot
> >>>> Â Â =20
> >>>> Â Â Â take advantage of the rcorder -p argument to implement parallel
> >>>> Â Â Â booting in rc.
> >>>> Â Â =20
> >>>> Â Â Â According to the author non scientific tests:
> >>>> Â Â Â on a Core 2 Duo with spinning disk:
> >>>> Â Â =20
> >>>> Â Â Â | Services enabled | before | after | saving |
> >>>>    | 0               | 8s    | 8s   | 0 Â
> Â Â Â |
> >>>>    | 1               | 13s   | 13s  | 0  Â
> Â Â |
> >>>>    | 2               | 17s   | 13s  | 5  Â
> Â Â |
> >>>>    | 3               | 23s   | 13s  | 10  Â
> Â |
> >>>>    | 4               | 28s   | 13s  | 15  Â
> Â |
> >>>>    | 5               | 33s   | 13s  | 20  Â
> Â |
> >>>> Â Â =20
> >>>> Â Â Â PR:Â Â Â Â Â Â Â Â Â Â Â Â 249192
> >>>> Â Â Â MFC after:Â Â Â Â Â 3 weeks
> >>>> ---
> >>>> libexec/rc/rc | 49 ++++++++++++++++++++++++++++++++++---------------
> >>>> 1 file changed, 34 insertions(+), 15 deletions(-)
> >>>>
> >>>> diff --git a/libexec/rc/rc b/libexec/rc/rc
> >>>> index 35db4a850516..722d7fe35884 100644
> >>>> --- a/libexec/rc/rc
> >>>> +++ b/libexec/rc/rc
> >>>> @@ -91,19 +91,31 @@ if ! [ -e ${firstboot_sentinel} ]; then
> >>>> Â skip_firstboot=3D"-s firstboot"
> >>>> fi
> >>>> =20
> >>>> +# rc_parallel_start default is "NO"
> >>>> +rc_parallel_start=3D${rc_parallel_start:-NO}
> >>>> +_rc_parallel=3D''
> >>>> +# enable rcorder -p if /etc/rc.conf rc_parallel_start is "YES"
> >>>> +checkyesno rc_parallel_start && _rc_parallel=3D'-p'
> >>>> +
> >>>> # Do a first pass to get everything up to $early_late_divider so that
> >>>> # we can do a second pass that includes $local_startup directories
> >>>> #
> >>>> -files=3D`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* 2>/dev/null`
> >>>> +files=3D`rcorder ${skip} ${skip_firstboot} ${_rc_parallel} /etc/rc.d/*=
> >> 2>/dev/
> >>>> null`
> >>>> =20
> >>>> _rc_elem_done=3D' '
> >>>> -for _rc_elem in ${files}; do
> >>>> - run_rc_script ${_rc_elem} ${_boot}
> >>>> - _rc_elem_done=3D"${_rc_elem_done}${_rc_elem} "
> >>>> -
> >>>> - case "$_rc_elem" in
> >>>> - */${early_late_divider})Â break ;;
> >>>> - esac
> >>>> +IFS=3D$'\n'
> >>>> +for _rc_group in ${files}; do
> >>>> + IFS=3D$' '
> >>>> + for _rc_elem in ${_rc_group}; do
> >>>> +Â Â run_rc_script ${_rc_elem} ${_boot} &
> >>>> +Â Â _rc_elem_done=3D"${_rc_elem_done}${_rc_elem} "
> >>>> +
> >>>> +Â Â case "$_rc_elem" in
> >>>> +Â Â */${early_late_divider}) break ;;
> >>>> +Â Â esac
> >>>> + done
> >>>> + wait
> >>>> + IFS=3D$'\n'
> >>>> done
> >>>> =20
> >>>> unset files local_rc
> >>>> @@ -122,14 +134,21 @@ if [ -e ${firstboot_sentinel} ]; then
> >>>> Â skip_firstboot=3D""
> >>>> fi
> >>>> =20
> >>>> -files=3D`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} 2>/=
> >> dev/null
> >>>> `
> >>>> -for _rc_elem in ${files}; do
> >>>> - case "$_rc_elem_done" in
> >>>> - *" $_rc_elem "*)Â continue ;;
> >>>> - esac
> >>>> -
> >>>> - run_rc_script ${_rc_elem} ${_boot}
> >>>> +files=3D`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} ${_=
> >> rc_paral
> >>>> lel} 2>/dev/null`
> >>>> +IFS=3D$'\n'
> >>>> +for _rc_group in ${files}; do
> >>>> + IFS=3D$' '
> >>>> + for _rc_elem in ${_rc_group}; do
> >>>> +Â Â case "$_rc_elem_done" in
> >>>> +Â Â *" $_rc_elem "*) continue ;;
> >>>> +Â Â esac
> >>>> +
> >>>> +Â Â run_rc_script ${_rc_elem} ${_boot} &
> >>>> + done
> >>>> + wait
> >>>> + IFS=3D$'\n'
> >>>> done
> >>>> +unset IFS
> >>>> =20
> >>>> # Remove the firstboot sentinel, and reboot if it was requested.
> >>>> # Be a bit paranoid about removing it to handle the common failure
> >>>>
> >>> =20
> >>> Since this commit my postfix, dovecot and nut fail to start at boot, and=
> >> =20
> >>> must be started by hand.
> >>> =20
> >>> =20
> >> I cannot reproduce, what failure do you have?=20
> >
> > It was a missing unset IFS and it's been fixed.
> >
> >
>
>
>
> Thank you for the fix and sorry about that!
No problem. IFS is easy to miss.
--
Cheers,
Cy Schubert <Cy.Schubert at cschubert.com>
FreeBSD UNIX: <cy at FreeBSD.org> Web: https://FreeBSD.org
NTP: <cy at nwtime.org> Web: https://nwtime.org
The need of the many outweighs the greed of the few.
More information about the dev-commits-src-all
mailing list