[OE-core] [PATCH v2] classes/reproducible_build: Move SDE deploy to another directory

Joshua Watt jpewhacker at gmail.com
Fri Sep 27 18:50:48 UTC 2019


On 9/27/19 1:03 PM, Alex Kiernan wrote:
> On Thu, Sep 26, 2019 at 6:58 PM Joshua Watt <jpewhacker at gmail.com> wrote:
>> The deployment of the source date epoch file had a race condition where
>> any task attempting to read from the file would race with creation of
>> the sstate archive for the do_deploy_source_date_epoch task. The
>> creation of the sstate archive requires moving the directory to a
>> temporary location, then moving it back. This means that the file
>> disappears for a short period of time, which will cause a failure if any
>> other task is running and trying to open the file to get the current
>> source date epoch.
>>
>> The solution is to copy the source date epoch file to a separate
>> directory when deploying so the file never disappears. When the file is
>> restored from sstate, it is moved to the correct location after being
>> extracted.
>>
>> [YOCTO #13501]
>>
>> Signed-off-by: Joshua Watt <JPEWhacker at gmail.com>
>> ---
>>   meta/classes/reproducible_build.bbclass | 12 ++++++++++--
>>   1 file changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/meta/classes/reproducible_build.bbclass b/meta/classes/reproducible_build.bbclass
>> index 8788ad7145c..99b749a9ee2 100644
>> --- a/meta/classes/reproducible_build.bbclass
>> +++ b/meta/classes/reproducible_build.bbclass
>> @@ -39,19 +39,27 @@ inherit ${@oe.utils.ifelse(d.getVar('BUILD_REPRODUCIBLE_BINARIES') == '1', 'repr
>>
>>   SDE_DIR ="${WORKDIR}/source-date-epoch"
>>   SDE_FILE = "${SDE_DIR}/__source_date_epoch.txt"
>> +SDE_DEPLOYDIR = "${WORKDIR}/deploy-source-date-epoch"
>>
>>   SSTATETASKS += "do_deploy_source_date_epoch"
>>
>>   do_deploy_source_date_epoch () {
>>       echo "Deploying SDE to ${SDE_DIR}."
>> +    mkdir -p ${SDE_DEPLOYDIR}
>> +    if [ -e ${SDE_FILE} ]; then
>> +        cp -p ${SDE_FILE} ${SDE_DEPLOYDIR}/__source_date_epoch.txt
>> +    fi
>>   }
>>
>>   python do_deploy_source_date_epoch_setscene () {
>>       sstate_setscene(d)
>> +    sde_file = os.path.join(d.getVar('SDE_DEPLOYDIR'), '__source_date_epoch.txt')
>> +    if os.path.exists(sde_file):
>> +        os.rename(sde_file, d.getVar('SDE_FILE'))
>>   }
>>
>> -do_deploy_source_date_epoch[dirs] = "${SDE_DIR}"
>> -do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DIR}"
>> +do_deploy_source_date_epoch[dirs] = "${SDE_DEPLOYDIR}"
>> +do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DEPLOYDIR}"
>>   addtask do_deploy_source_date_epoch_setscene
>>   addtask do_deploy_source_date_epoch before do_configure after do_patch
>>
> This seems to have broken builds with reproducible builds enabled and
> sstate downloaded from a mirror - I just get a blizzard of:
>
> ERROR: Logfile of failure stored in:
> /home/akiernan/nanohub/build/tmp/work/x86_64-linux/automake-native/1.16.1-r0/temp/log.do_deploy_source_date_epoch_setscene.113823
> WARNING: Setscene task
> (virtual:native:/home/akiernan/nanohub/build/../poky/meta/recipes-devtools/automake/automake_1.16.1.bb:do_deploy_source_date_epoch_setscene)
> failed with exit code '1' - real task will be run instead
> ERROR: autoconf-native-2.69-r11 do_deploy_source_date_epoch_setscene:
> Error executing a python function in exec_python_func() autogenerated:
>
> The stack trace of python calls that resulted in this exception/failure was:
> File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
>       0001:
>   *** 0002:do_deploy_source_date_epoch_setscene(d)
>       0003:
> File: '/home/akiernan/nanohub/build/../poky/meta/classes/reproducible_build.bbclass',
> lineno: 58, function: do_deploy_source_date_epoch_setscene
>       0054:python do_deploy_source_date_epoch_setscene () {
>       0055:    sstate_setscene(d)
>       0056:    sde_file = os.path.join(d.getVar('SDE_DEPLOYDIR'),
> '__source_date_epoch.txt')
>       0057:    if os.path.exists(sde_file):
>   *** 0058:        os.rename(sde_file, d.getVar('SDE_FILE'))
>       0059:}
>       0060:
>       0061:do_deploy_source_date_epoch[dirs] = "${SDE_DEPLOYDIR}"
>       0062:do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DEPLOYDIR}"
> Exception: FileNotFoundError: [Errno 2] No such file or directory:
> '/home/akiernan/nanohub/build/tmp/work/x86_64-linux/autoconf-native/2.69-r11/deploy-source-date-epoch/__source_date_epoch.txt'
> -> '/home/akiernan/nanohub/build/tmp/work/x86_64-linux/autoconf-native/2.69-r11/source-date-epoch/__source_date_epoch.txt'

Sorry about that. It looks like destination directory isn't getting 
created. You can try giving 
http://git.yoctoproject.org/cgit.cgi/poky-contrib/commit/?h=jpew/hash-equivalence&id=7177bb4c4c174f0852b984b9b2d2d23de92e70cd 
a try to see if it resolves the issue.


>
> ERROR: Logfile of failure stored in:
> /home/akiernan/nanohub/build/tmp/work/x86_64-linux/autoconf-native/2.69-r11/temp/log.do_deploy_source_date_epoch_setscene.113869
> WARNING: Setscene task
> (virtual:native:/home/akiernan/nanohub/build/../poky/meta/recipes-devtools/autoconf/autoconf_2.69.bb:do_deploy_source_date_epoch_setscene)
> failed with exit code '1' - real task will be run instead
> ERROR: m4-native-1.4.18-r0 do_deploy_source_date_epoch_setscene: Error
> executing a python function in exec_python_func() autogenerated:
>
> The stack trace of python calls that resulted in this exception/failure was:
> File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
>       0001:
>   *** 0002:do_deploy_source_date_epoch_setscene(d)
>       0003:
> File: '/home/akiernan/nanohub/build/../poky/meta/classes/reproducible_build.bbclass',
> lineno: 58, function: do_deploy_source_date_epoch_setscene
>       0054:python do_deploy_source_date_epoch_setscene () {
>       0055:    sstate_setscene(d)
>       0056:    sde_file = os.path.join(d.getVar('SDE_DEPLOYDIR'),
> '__source_date_epoch.txt')
>       0057:    if os.path.exists(sde_file):
>   *** 0058:        os.rename(sde_file, d.getVar('SDE_FILE'))
>       0059:}
>       0060:
>       0061:do_deploy_source_date_epoch[dirs] = "${SDE_DEPLOYDIR}"
>       0062:do_deploy_source_date_epoch[sstate-plaindirs] = "${SDE_DEPLOYDIR}"
> Exception: FileNotFoundError: [Errno 2] No such file or directory:
> '/home/akiernan/nanohub/build/tmp/work/x86_64-linux/m4-native/1.4.18-r0/deploy-source-date-epoch/__source_date_epoch.txt'
> -> '/home/akiernan/nanohub/build/tmp/work/x86_64-linux/m4-native/1.4.18-r0/source-date-epoch/__source_date_epoch.txt'
>
> ERROR: Logfile of failure stored in:
> /home/akiernan/nanohub/build/tmp/work/x86_64-linux/m4-native/1.4.18-r0/temp/log.do_deploy_source_date_epoch_setscene.113897
>
>


More information about the Openembedded-core mailing list