diff mbox series

ref-manual: tasks: do_cleanall: mention it is not allowed with a shared DL_DIR

Message ID 20240219155513.76738-1-luca.ceresoli@bootlin.com
State New
Headers show
Series ref-manual: tasks: do_cleanall: mention it is not allowed with a shared DL_DIR | expand

Commit Message

Luca Ceresoli Feb. 19, 2024, 3:55 p.m. UTC
do_cleanall can produce failures if using a shared download directory. This
is why it is forbidden when writing tests that will run on the autobuilders
(https://docs.yoctoproject.org/test-manual/intro.html?highlight=cleanall#considerations-when-writing-tests).

Reported-by: Sam Liddicott
Link: https://bootlin.com/blog/yocto-sharing-the-sstate-cache-and-download-directories/#comment-2650335
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
 documentation/ref-manual/tasks.rst | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

Quentin Schulz Feb. 19, 2024, 4:12 p.m. UTC | #1
Hi Luca,

On 2/19/24 16:55, Luca Ceresoli via lists.yoctoproject.org wrote:
> [You don't often get email from luca.ceresoli=bootlin.com@lists.yoctoproject.org. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> do_cleanall can produce failures if using a shared download directory. This
> is why it is forbidden when writing tests that will run on the autobuilders
> (https://docs.yoctoproject.org/test-manual/intro.html?highlight=cleanall#considerations-when-writing-tests).
> 
> Reported-by: Sam Liddicott
> Link: https://bootlin.com/blog/yocto-sharing-the-sstate-cache-and-download-directories/#comment-2650335
> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> ---
>   documentation/ref-manual/tasks.rst | 13 +++++++++++++
>   1 file changed, 13 insertions(+)
> 
> diff --git a/documentation/ref-manual/tasks.rst b/documentation/ref-manual/tasks.rst
> index 0db960b22f80..c754eb15514b 100644
> --- a/documentation/ref-manual/tasks.rst
> +++ b/documentation/ref-manual/tasks.rst
> @@ -474,6 +474,19 @@ Typically, you would not normally use the :ref:`ref-tasks-cleanall` task. Do so
>   if you want to start fresh with the :ref:`ref-tasks-fetch`
>   task.
> 
> +.. note::
> +
> +   Never run the :ref:`ref-tasks-cleanall` task if your :term:`DL_DIR` is

This also applies if SSTATE_DIR is shared I believe?

> +   shared. This would break in this scenario::
> +
> +      dir1$ bitbake <recipe> -c fetch
> +      dir2$ bitbake <recipe> -c cleanall
> +      dir1$ bitbake <recipe> -c unpack
> +
> +   because before step 3 in dir1 there is a stamp file for the
> +   :ref:`ref-tasks-fetch` task, so the unpack task will try to extract the
> +   downloaded archive and fail as it has been deleted in step 2.
> +
>   .. _ref-tasks-cleansstate:
> 
>   ``do_cleansstate``

We would need the same warning here for a shared SSTATE_DIR I believe.

Cheers,
Quentin
Luca Ceresoli Feb. 20, 2024, 7:58 a.m. UTC | #2
Hi Quentin,

On Mon, 19 Feb 2024 17:12:46 +0100
Quentin Schulz <quentin.schulz@theobroma-systems.com> wrote:

> Hi Luca,
> 
> On 2/19/24 16:55, Luca Ceresoli via lists.yoctoproject.org wrote:
> > [You don't often get email from luca.ceresoli=bootlin.com@lists.yoctoproject.org. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> > 
> > do_cleanall can produce failures if using a shared download directory. This
> > is why it is forbidden when writing tests that will run on the autobuilders
> > (https://docs.yoctoproject.org/test-manual/intro.html?highlight=cleanall#considerations-when-writing-tests).
> > 
> > Reported-by: Sam Liddicott
> > Link: https://bootlin.com/blog/yocto-sharing-the-sstate-cache-and-download-directories/#comment-2650335
> > Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> > ---
> >   documentation/ref-manual/tasks.rst | 13 +++++++++++++
> >   1 file changed, 13 insertions(+)
> > 
> > diff --git a/documentation/ref-manual/tasks.rst b/documentation/ref-manual/tasks.rst
> > index 0db960b22f80..c754eb15514b 100644
> > --- a/documentation/ref-manual/tasks.rst
> > +++ b/documentation/ref-manual/tasks.rst
> > @@ -474,6 +474,19 @@ Typically, you would not normally use the :ref:`ref-tasks-cleanall` task. Do so
> >   if you want to start fresh with the :ref:`ref-tasks-fetch`
> >   task.
> > 
> > +.. note::
> > +
> > +   Never run the :ref:`ref-tasks-cleanall` task if your :term:`DL_DIR` is  
> 
> This also applies if SSTATE_DIR is shared I believe?

I don't think so. As far as I understand the sstate cache, a cache
entry is either found or not found, while for the downloads there is
the strange state of having a do_fetch stamp but no downloaded archive.

However I may be wrong. Do you have an example command sequence where
do_cleansstate can create a build failure?

Luca
Richard Purdie Feb. 20, 2024, 9:01 a.m. UTC | #3
On Tue, 2024-02-20 at 08:58 +0100, Luca Ceresoli via
lists.yoctoproject.org wrote:
> Hi Quentin,
> 
> On Mon, 19 Feb 2024 17:12:46 +0100
> Quentin Schulz <quentin.schulz@theobroma-systems.com> wrote:
> 
> > Hi Luca,
> > 
> > On 2/19/24 16:55, Luca Ceresoli via lists.yoctoproject.org wrote:
> > > [You don't often get email from
> > > luca.ceresoli=bootlin.com@lists.yoctoproject.org. Learn why this
> > > is important at https://aka.ms/LearnAboutSenderIdentification ]
> > > 
> > > do_cleanall can produce failures if using a shared download
> > > directory. This
> > > is why it is forbidden when writing tests that will run on the
> > > autobuilders
> > > (
> > > https://docs.yoctoproject.org/test-manual/intro.html?highlight=cle
> > > anall#considerations-when-writing-tests).
> > > 
> > > Reported-by: Sam Liddicott
> > > Link:
> > > https://bootlin.com/blog/yocto-sharing-the-sstate-cache-and-download-directories/#comment-2650335
> > > Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
> > > ---
> > >   documentation/ref-manual/tasks.rst | 13 +++++++++++++
> > >   1 file changed, 13 insertions(+)
> > > 
> > > diff --git a/documentation/ref-manual/tasks.rst
> > > b/documentation/ref-manual/tasks.rst
> > > index 0db960b22f80..c754eb15514b 100644
> > > --- a/documentation/ref-manual/tasks.rst
> > > +++ b/documentation/ref-manual/tasks.rst
> > > @@ -474,6 +474,19 @@ Typically, you would not normally use the
> > > :ref:`ref-tasks-cleanall` task. Do so
> > >   if you want to start fresh with the :ref:`ref-tasks-fetch`
> > >   task.
> > > 
> > > +.. note::
> > > +
> > > +   Never run the :ref:`ref-tasks-cleanall` task if your
> > > :term:`DL_DIR` is  
> > 
> > This also applies if SSTATE_DIR is shared I believe?
> 
> I don't think so. As far as I understand the sstate cache, a cache
> entry is either found or not found, while for the downloads there is
> the strange state of having a do_fetch stamp but no downloaded
> archive.
> 
> However I may be wrong. Do you have an example command sequence where
> do_cleansstate can create a build failure?

The builds check sstate "up front" then download later so it if is
deleted in the meantime, it will cause an error but not a total failure
as it will rebuild it.

We therefore don't recommend cleansstate on a shared sstate directory.
Instead you can use -f to invalidate a task.

Cheers,

Richard
Quentin Schulz Feb. 20, 2024, 10:20 a.m. UTC | #4
Hi all,

On 2/20/24 10:01, Richard Purdie wrote:
> On Tue, 2024-02-20 at 08:58 +0100, Luca Ceresoli via
> lists.yoctoproject.org wrote:
>> Hi Quentin,
>>
>> On Mon, 19 Feb 2024 17:12:46 +0100
>> Quentin Schulz <quentin.schulz@theobroma-systems.com> wrote:
>>
>>> Hi Luca,
>>>
>>> On 2/19/24 16:55, Luca Ceresoli via lists.yoctoproject.org wrote:
>>>> [You don't often get email from
>>>> luca.ceresoli=bootlin.com@lists.yoctoproject.org. Learn why this
>>>> is important at https://aka.ms/LearnAboutSenderIdentification ]
>>>>
>>>> do_cleanall can produce failures if using a shared download
>>>> directory. This
>>>> is why it is forbidden when writing tests that will run on the
>>>> autobuilders
>>>> (
>>>> https://docs.yoctoproject.org/test-manual/intro.html?highlight=cle
>>>> anall#considerations-when-writing-tests).
>>>>
>>>> Reported-by: Sam Liddicott
>>>> Link:
>>>> https://bootlin.com/blog/yocto-sharing-the-sstate-cache-and-download-directories/#comment-2650335
>>>> Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
>>>> ---
>>>>    documentation/ref-manual/tasks.rst | 13 +++++++++++++
>>>>    1 file changed, 13 insertions(+)
>>>>
>>>> diff --git a/documentation/ref-manual/tasks.rst
>>>> b/documentation/ref-manual/tasks.rst
>>>> index 0db960b22f80..c754eb15514b 100644
>>>> --- a/documentation/ref-manual/tasks.rst
>>>> +++ b/documentation/ref-manual/tasks.rst
>>>> @@ -474,6 +474,19 @@ Typically, you would not normally use the
>>>> :ref:`ref-tasks-cleanall` task. Do so
>>>>    if you want to start fresh with the :ref:`ref-tasks-fetch`
>>>>    task.
>>>>
>>>> +.. note::
>>>> +
>>>> +   Never run the :ref:`ref-tasks-cleanall` task if your
>>>> :term:`DL_DIR` is
>>>
>>> This also applies if SSTATE_DIR is shared I believe?
>>
>> I don't think so. As far as I understand the sstate cache, a cache
>> entry is either found or not found, while for the downloads there is
>> the strange state of having a do_fetch stamp but no downloaded
>> archive.
>>
>> However I may be wrong. Do you have an example command sequence where
>> do_cleansstate can create a build failure?
> 
> The builds check sstate "up front" then download later so it if is
> deleted in the meantime, it will cause an error but not a total failure
> as it will rebuild it.
> 
> We therefore don't recommend cleansstate on a shared sstate directory.
> Instead you can use -f to invalidate a task.
> 

And considering that cleanall also calls cleansstate (or at least does 
the same), it applies and we should document it :)

Cheers,
Quentin
diff mbox series

Patch

diff --git a/documentation/ref-manual/tasks.rst b/documentation/ref-manual/tasks.rst
index 0db960b22f80..c754eb15514b 100644
--- a/documentation/ref-manual/tasks.rst
+++ b/documentation/ref-manual/tasks.rst
@@ -474,6 +474,19 @@  Typically, you would not normally use the :ref:`ref-tasks-cleanall` task. Do so
 if you want to start fresh with the :ref:`ref-tasks-fetch`
 task.
 
+.. note::
+
+   Never run the :ref:`ref-tasks-cleanall` task if your :term:`DL_DIR` is
+   shared. This would break in this scenario::
+
+      dir1$ bitbake <recipe> -c fetch
+      dir2$ bitbake <recipe> -c cleanall
+      dir1$ bitbake <recipe> -c unpack
+
+   because before step 3 in dir1 there is a stamp file for the
+   :ref:`ref-tasks-fetch` task, so the unpack task will try to extract the
+   downloaded archive and fail as it has been deleted in step 2.
+
 .. _ref-tasks-cleansstate:
 
 ``do_cleansstate``