On Mon, 2010-09-13 at 23:38 -0700, Don Armstrong wrote:
> Can you try this with a more recent version of gnucash (at least
> 2.2.9-6), and also with --debug on? (You should see output like
> "unlink lock file: blah", etc.)

This has remained quite reproducible for me with 2.2.9-7~squeeze1. The
trick is to let a few backup/log files accumulate over a few days, then
save the account file.

I did so with --debug bug saw no output other than the usual message
about binreloc relocation support.

The last time I tried to debug this I used strace and got the following
output while saving the account file:

        write(22, "\n</gnc:book>\n</gnc-v2>\n\n<!-- Loc"..., 102) = 102
        close(22)                               = 0
        munmap(0x7f0f4698d000, 4096)            = 0
        stat("/home/sam/Documents/Gnucash/gnucash.xac", {st_mode=S_IFREG|0644, 
st_size=269995, ...}) = 0
        chmod("/home/sam/Documents/Gnucash/gnucash.xac.tmp-In7J7h", 0100644) = 0
        chown("/home/sam/Documents/Gnucash/gnucash.xac.tmp-In7J7h", 4294967295, 
1000) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac") = 0
        link("/home/sam/Documents/Gnucash/gnucash.xac.tmp-In7J7h", 
"/home/sam/Documents/Gnucash/gnucash.xac") = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.tmp-In7J7h") = 0
        stat("/home/sam/Documents/Gnucash/gnucash.xac.LCK", {st_mode=S_IFREG, 
st_size=0, ...}) = 0
        open("/home/sam/Documents/Gnucash", 
O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 21
        getdents(21, /* 35 entries */, 32768)   = 1752
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232718.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221224556.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221230758.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221233939.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221233938.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232023.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091220143217.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221224556.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232700.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232837.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232022.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221224518.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232329.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232139.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091220143755.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232719.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221230758.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221233845.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221231905.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221233846.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232837.log") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232138.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232659.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221231904.xac") = 0
        stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3661, ...}) = 0
        unlink("/home/sam/Documents/Gnucash/gnucash.xac.20091221232329.log") = 0
        getdents(21, /* 0 entries */, 32768)    = 0
        close(21)                               = 0

As far as I can tell from that output, Gnucash is doing the right thing:
writing to temporary file, unlinking destination file, linking temporary
file to destination file (successfully!) and finally deleting the
temporary file. And yet, the result is that gnucash.xac is deleted.

> I've looked through the code in question, and unless something is
> going very weird, I don't see how it'd be unlinking like you're
> seeing. (Basically, strptime would have to return a non-zero result
> even though it didn't actually manage to match anything, and a few
> other things would have to fall into place.)

Next time I'll try ltrace to see what strptime returns.

-- 
Sam Morris <https://robots.org.uk/>
3412 EA18 1277 354B 991B  C869 B219 7FDB 5EA0 1078

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to