[pacman-dev] [PATCH 1/2] Revert "makepkg: calculate exact total file size"

Dave Reisner d at falconindy.com
Wed Mar 14 20:50:22 EDT 2012


On Wed, Mar 14, 2012 at 07:48:06PM -0400, Dave Reisner wrote:
> On Thu, Mar 15, 2012 at 07:11:07AM +1000, Allan McRae wrote:
> > On 15/03/12 06:41, Dave Reisner wrote:
> > > btrfs's cow snapshots seem to do very strange things, causing du to not
> > > count data still in filesystem buffers. Repackaging the same build of
> > > handbrake within a chroot on brynhild, I witnessed (via bash xtrace) du
> > > reporting a different $pkgdir size every time the write_pkginfo()
> > > function ran.
> > > 
> > > Unfortunately, replacing du with stat has its own slew of problems,
> > > mostly due to hard links (e.g. git, with 106 hardlinks to the same
> > > file). Working around this is neither fun, nor practical.
> > > 
> > > As it turns out, all we needed here all along was a simple call to sync
> > > to flush writes to disk before calling du.
> > > 
> > > This reverts commit b264fb9e9ddcc31dc8782390309421965e507383.
> > > 
> > > Signed-off-by: Dave Reisner <dreisner at archlinux.org>
> > 
> > Argh...   look at the commit message in 14474a32...
> > 
> > That sync results in the Arch buildserver stalling for minutes.
> > 
> > Allan
> > 
> 
> Ok fine. Back to the trenches I go...
> 
> Some careful changes to makepkg and a simple stack trace catches du in
> the act of being broken. It receives a statbuf with the correct size of
> /usr/bin/ghb:
> 
>   newfstatat(AT_FDCWD, "usr/bin/ghb", {st_mode=S_IFREG|0755,
>   st_size=16037808, ...}, AT_SYMLINK_NOFOLLOW) = 0
> 
> And then it writes the size completely wrong:
> 
>   write(1, "3456\tusr/bin/ghb\n", 17)     = 17
> 
> I have no idea what's going on, but I'll keep digging.
> 
> d

Replying to myself, because I've been having an monologue with myself
all goddamn day over this. It seems that while the stat buffer reports
the size properly, there's a measureable delay of a half second or so
before the st_blocks member is populated.

I can stick a 'sleep 1' into makepkg before the du call, and everything
works. I hacked up du and added some lovely printf calls (since you can't
use gdb for this...)

without the delay...

sb->st_size=16037808, sb->st_blocks=0 <- ghb

^ that's when we see problems, because du is measuring size based on
(st_blkcnt*st_blocksize).

With a 1 second delay...

sb->st_size=16037808, sb->st_blocks=31328 <- ghb

Yay!

d


More information about the pacman-dev mailing list