[bitbake-devel] Filename too long

Robert Yang liezhi.yang at windriver.com
Thu Jan 19 06:13:32 UTC 2017


Hi Mark,

We have a local patch to fix the problem, I had sent it to bitbake-devel
before, but not merged:

https://patchwork.openembedded.org/patch/61321/

Here is the updated patch in our bitbake:

commit ebb1190c01a15fc6e91c9810c46313c3b3fb305c
Author: Robert Yang <liezhi.yang at windriver.com>
Date:   Fri Nov 8 23:32:11 2013 +0800

     fetch2/git.py: fix the filename too long error

     When we use the PREMIRROR/MIRROR from the local disk, and if it is in a
     deep directory, for example, when len(path) > 255 (The NAME_MAX), we
     will get the "filename too long error".

     This is becuase we use ud.path.replace('/', '.') to change the path to
     the filename. We seldom see such a long url, but it is easy to produce
     it on the local machine.

     Another problem is that:

     file:///local/path

     will be converted into .local.path which is a hidden file by default.

     Don't convert the name when ud.proto == "file" will fix the problem.

     Signed-off-by: Robert Yang <liezhi.yang at windriver.com>

diff --git a/lib/bb/fetch2/git.py b/lib/bb/fetch2/git.py
index f7a0c01..cc17e5a 100644
--- a/lib/bb/fetch2/git.py
+++ b/lib/bb/fetch2/git.py
@@ -195,7 +195,10 @@ class Git(FetchMethod):
                      ud.unresolvedrev[name] = ud.revisions[name]
                  ud.revisions[name] = self.latest_revision(ud, d, name)

-        gitsrcname = '%s%s' % (ud.host.replace(':', '.'), ud.path.replace('/', 
'.').replace('*', '.'))
+        if ud.proto == "file":
+            gitsrcname = '%s%s' % ("file...", os.path.basename(ud.path))
+        else:
+            gitsrcname = '%s%s' % (ud.host.replace(':', '.'), 
ud.path.replace('/', '.').replace('*', '.'))
          if gitsrcname.startswith('.'):
              gitsrcname = gitsrcname[1:]


// Robert

On 01/19/2017 03:02 AM, Mark Hatle wrote:
> I found a problem today working through a problem report.
>
> We have a situation where we automatically add certain project directories as
> premirrors within the environment.
>
> During the fetch2 work, the system takes this long pathname, and then embeds it
> into ud.lockfile parameter, we end up with something like:
>
> The path to the build/download dir is about 250 characters... (abbreviated below)
>
> ud.lockfile =
> /my/really/log/path/to/my/project/build/download/git2/file....my.really.log.path.to.my.project.layers.wr-kernel.recipes-kernel.linux.......git.kernel-4.8.x.git.lock
>
> This triggers an exception, IOError with the errno '36', and error string of
> 'File name too long'.  (Note, this is the filename, NOT the path being too long!)
>
> In the bitbake/lib/bb/utils.py: def lockfile(name, shared=False, retry=True,
> block=False)
>
> The system tries to:
>
> while True:
>     try:
>         lf = open(name, 'a+')
>         ... more work here ...
>     except Exception:
>         ... close the file, if opened ...
>         pass
>     if not retry:
>         return None
>
> This triggers an endless loop if this happens.
>
> So at a minimum we probably need to extend the exception handling to look for
> file (or path) too long errors and return/stop.
>
> I'm wondering if, something like the following should be added:
>
>  exception IOError as e:
>      errno, strerror = e.args
>      logger.fatal("IOError on lock: [%s] %s" % (errno, strerror))
>      try:
>          lf.close()
>      except Exception:
>          pass
>      retry = False
>      pass
>
> (Is stopping on all IOErrors too broad of a check?)
>
>
> Second, I'm not sure where the lockfile name is determined, but should there be
> a way in there to shorten the lockfile to say the 'basename' instead of a full
> path (if specified)?
>
> Any suggestions would be appreciated.
>
> --Mark
>



More information about the bitbake-devel mailing list