[Unison-hackers] (resend) merge of single-file roots triggers assertion failure, tested versions 2.40.65 and 2.48.3

Frederik Eaton frederik at ofb.net
Fri Jul 10 14:30:53 EDT 2015


Hello Unison-Hackers,

I sent the following email to unison-users, but I don't think it got
through.

I'm trying to do something really simple with unison. I create two
empty files, synchronize them "unison foo bar" (so that an archive in
.unison is created for those roots), then make a change to one of them
and re-run unison with the same arguments. Instead of propagating the
change directly, I select 'merge'. At this point unison barfs
(uncaught assertion failure from path.ml). I am confused because I can
replicate the error even when using what seems to be a clean
configuration (e.g. new user account). I seem to remember that years
ago, I could use unison to accomplish simple operations like merging,
but even with version 2.40 I can replicate the bug. I tested on two
linux systems, running Arch (unison 2.48.3) and Debian (unison
2.40.65). This is a bug, is it not? Is there an easy fix?

Thank you,

Frederick


----- Forwarded message from Frederik Eaton <frederik at ofb.net> -----

Date: Tue, 7 Jul 2015 01:24:10 -0700
From: Frederik Eaton <frederik at ofb.net>
To: unison-users at yahoogroups.com
Subject: merge of single-file roots triggers assertion failure, tested versions 2.40.65 and 2.48.3
User-Agent: Mutt/1.5.21 (2010-09-15)

Hello Unison,

Merging changes to a single-file root doesn't appear to work.

I tested this on two systems, running unison versions 2.40.65 and 2.48.3.

In the older version, the last lines are:

[stasher] getRecentVersion of  in /home/frederik/unison-test/foo
Uncaught exception File "/build/buildd-unison_2.40.65-2-i386-T0rnEi/unison-2.40.65/path.ml", line 202, characters 4-10: Assertion failed

In the newer version, they are:

[stasher] getRecentVersion of  in /home/frederik/unison-test/foo
Uncaught exception File "/build/unison/src/unison-2.48.3/path.ml", line 210, characters 4-10: Assertion failed
Raised at file "/build/unison/src/unison-2.48.3/lwt/lwt.ml", line 126, characters 22-23
...

Is this a known bug?

I'm attaching a script to reproduce. Either run it in X, uncommenting
the xvkbd lines; or run it wherever and type SPACE-M-Y.

Thanks for your attention,

Frederick Eaton

#!/bin/zsh

mkdir unison-test
cd unison-test

touch foo
touch bar

#xvkbd -xsendevent -text " ";
UNISON=.unison unison -debug all foo bar;

echo hi > foo

#xvkbd -xsendevent -text "my";
UNISON=.unison unison -debug all foo bar;

#rm -rf unison-test

[startup] Preferences:
ui = graphic
host = 
server = false
prefsdocs = false
doc = 
version = false
silent = false
dumbtty = false
testserver = false
rest = bar
rest = foo
showprev = false
selftest = false
confirmmerge = false
retry = 0
repeat = 
contactquietly = false
key = 
label = 
expert = false
height = 15
auto = false
maxthreads = 0
maxsizethreshold = -1
prefer = 
force = 
sortnewfirst = false
sortbysize = false
keeptempfilesaftermerge = false
diff = diff -u CURRENT2 CURRENT1
copyonconflict = false
backupdir = 
maxbackups = 2
backups = false
backupsuffix = 
backupprefix = .bak.$VERSION.
backuploc = central
copymax = 1
copyquoterem = default
copythreshold = -1
copyprogrest = rsync --partial --append-verify --compress
copyprog = rsync --partial --inplace --compress
rsync = true
fastcheck = default
ignorelocks = false
dumparchives = false
showarchive = false
rootsName = 
ignorearchives = false
fastercheckUNSAFE = false
fat = false
allHostsAreRunningWindows = false
someHostIsRunningWindows = false
confirmbigdel = true
batch = false
root = bar
root = foo
killserver = false
halfduplex = false
stream = true
addversionno = false
servercmd = 
sshargs = 
rshargs = 
rshcmd = rsh
sshcmd = ssh
xferbycopying = true
sshversion = 
clientHostName = lot
ignoreinodenumbers = false
links-aux = true
links = default
times = false
group = false
owner = false
numericids = false
dontchmod = false
perms = 1023
watch = true
rsrc-aux = false
rsrc = default
maxerrors = 1
unicodeCS = false
unicodeEnc = false
unicode = default
someHostIsInsensitive = false
ignorecase = default
timers = false
terse = false
logfile = /home/frederik/unison.log
log = true
debugtimes = false
debug = all
addprefsto = 
Contacting server...
[globals] Checking path '' for expansions
[startup] Roots: 
        foo
        bar
  i.e. 
        foo
        bar
  i.e. (in canonical order)
       /home/frederik/unison-test/bar
       /home/frederik/unison-test/foo

[props] Setting permission mask to 1777 (1777 and 7777)
[stasher] initBackupsLocal
[stasher] d = /
[stasher] Prefix and suffix regexps for backup filenames have been updated
[stasher] initBackupsLocal
[stasher] d = /
[stasher] Prefix and suffix regexps for backup filenames have been updated
Looking for changes
[ui] temp: Globals.paths = 
[update] Loading archive from .unison/ar2d8f7a470ecfa50ef4addbc41a60379f
[update] Archive .unison/ar2d8f7a470ecfa50ef4addbc41a60379f not found
[update] Loading archive from .unison/arbea074476b2045f87d214607955fc245
[update] Archive .unison/arbea074476b2045f87d214607955fc245 not found
Warning: No archive files were found for these roots, whose canonical names are:
	/home/frederik/unison-test/foo
	/home/frederik/unison-test/bar
This can happen either
because this is the first time you have synchronized these roots, 
or because you have upgraded Unison to a new version with a different
archive format.  

Update detection may take a while on this run if the replicas are 
large.

Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.

If you see this message repeatedly, it may be because one of your machines
is getting its address from DHCP, which is causing its host name to change
between synchronizations.  See the documentation for the UNISONLOCALHOSTNAME
environment variable for advice on how to correct this.

Donations to the Unison project are gratefully accepted: 
http://www.cis.upenn.edu/~bcpierce/unison

Press return to continue.[<spc>]  [update] Loading archive from .unison/ar2d8f7a470ecfa50ef4addbc41a60379f
[update] Archive .unison/ar2d8f7a470ecfa50ef4addbc41a60379f not found
[update] Setting archive for //lot//home/frederik/unison-test/bar
[update] Loading archive from .unison/arbea074476b2045f87d214607955fc245
[update] Archive .unison/arbea074476b2045f87d214607955fc245 not found
[update] Setting archive for //lot//home/frederik/unison-test/foo
[update] findOnRoot /home/frederik/unison-test/bar
[update] findLocal /home/frederik/unison-test/bar ()
[fpcache] opening cache file .unison/fp2d8f7a470ecfa50ef4addbc41a60379f for input
[fpcache] could not open cache file .unison/fp2d8f7a470ecfa50ef4addbc41a60379f: .unison/fp2d8f7a470ecfa50ef4addbc41a60379f: No such file or directory
[fpcache] opening cache file .unison/fp2d8f7a470ecfa50ef4addbc41a60379f for output
[pred] ignore '' = false
[update] buildUpdateRec: /home/frederik/unison-test/bar
[update]   buildUpdate -> New file
[fpcache] cache miss for path 
[update] Setting archive for //lot//home/frederik/unison-test/bar
[update] findOnRoot /home/frederik/unison-test/foo
[update] findLocal /home/frederik/unison-test/foo ()
[fpcache] opening cache file .unison/fpbea074476b2045f87d214607955fc245 for input
[fpcache] could not open cache file .unison/fpbea074476b2045f87d214607955fc245: .unison/fpbea074476b2045f87d214607955fc245: No such file or directory
[fpcache] opening cache file .unison/fpbea074476b2045f87d214607955fc245 for output
[pred] ignore '' = false
[update] buildUpdateRec: /home/frederik/unison-test/foo
[update]   buildUpdate -> New file
[fpcache] cache miss for path 
[update] Setting archive for //lot//home/frederik/unison-test/foo
Reconciling changes
[recon] reconcileAll
[recon] reconcile: 0 results
[update] Marking 1 paths equal
[update] markEqualLocal /home/frederik/unison-test/bar 
[pred] backupcurr '' = false
[update] Setting archive for //lot//home/frederik/unison-test/bar
[update] markEqualLocal /home/frederik/unison-test/foo 
[pred] backupcurr '' = false
[update] Setting archive for //lot//home/frederik/unison-test/foo
[update] Updating archives
[update] Saving archive in .unison/sc2d8f7a470ecfa50ef4addbc41a60379f
[update] Saving archive in .unison/scbea074476b2045f87d214607955fc245
[update] Copying archive .unison/tm2d8f7a470ecfa50ef4addbc41a60379f to .unison/ar2d8f7a470ecfa50ef4addbc41a60379f
[update] Copying archive .unison/tmbea074476b2045f87d214607955fc245 to .unison/arbea074476b2045f87d214607955fc245
[update] Removing archive .unison/tm2d8f7a470ecfa50ef4addbc41a60379f
[update] Removing archive .unison/tmbea074476b2045f87d214607955fc245
Nothing to do: replicas have been changed only in identical ways since last sync.
[startup] Preferences:
ui = graphic
host = 
server = false
prefsdocs = false
doc = 
version = false
silent = false
dumbtty = false
testserver = false
rest = bar
rest = foo
showprev = false
selftest = false
confirmmerge = false
retry = 0
repeat = 
contactquietly = false
key = 
label = 
expert = false
height = 15
auto = false
maxthreads = 0
maxsizethreshold = -1
prefer = 
force = 
sortnewfirst = false
sortbysize = false
keeptempfilesaftermerge = false
diff = diff -u CURRENT2 CURRENT1
copyonconflict = false
backupdir = 
maxbackups = 2
backups = false
backupsuffix = 
backupprefix = .bak.$VERSION.
backuploc = central
copymax = 1
copyquoterem = default
copythreshold = -1
copyprogrest = rsync --partial --append-verify --compress
copyprog = rsync --partial --inplace --compress
rsync = true
fastcheck = default
ignorelocks = false
dumparchives = false
showarchive = false
rootsName = 
ignorearchives = false
fastercheckUNSAFE = false
fat = false
allHostsAreRunningWindows = false
someHostIsRunningWindows = false
confirmbigdel = true
batch = false
root = bar
root = foo
killserver = false
halfduplex = false
stream = true
addversionno = false
servercmd = 
sshargs = 
rshargs = 
rshcmd = rsh
sshcmd = ssh
xferbycopying = true
sshversion = 
clientHostName = lot
ignoreinodenumbers = false
links-aux = true
links = default
times = false
group = false
owner = false
numericids = false
dontchmod = false
perms = 1023
watch = true
rsrc-aux = false
rsrc = default
maxerrors = 1
unicodeCS = false
unicodeEnc = false
unicode = default
someHostIsInsensitive = false
ignorecase = default
timers = false
terse = false
logfile = /home/frederik/unison.log
log = true
debugtimes = false
debug = all
addprefsto = 
Contacting server...
[globals] Checking path '' for expansions
[startup] Roots: 
        foo
        bar
  i.e. 
        foo
        bar
  i.e. (in canonical order)
       /home/frederik/unison-test/bar
       /home/frederik/unison-test/foo

[props] Setting permission mask to 1777 (1777 and 7777)
[stasher] initBackupsLocal
[stasher] d = /
[stasher] Prefix and suffix regexps for backup filenames have been updated
[stasher] initBackupsLocal
[stasher] d = /
[stasher] Prefix and suffix regexps for backup filenames have been updated
Looking for changes
[ui] temp: Globals.paths = 
[update] Loading archive from .unison/ar2d8f7a470ecfa50ef4addbc41a60379f
[update] Setting archive for //lot//home/frederik/unison-test/bar
[update] Loading archive from .unison/arbea074476b2045f87d214607955fc245
[update] Setting archive for //lot//home/frederik/unison-test/foo
[update] findOnRoot /home/frederik/unison-test/bar
[update] findLocal /home/frederik/unison-test/bar ()
[fpcache] opening cache file .unison/fp2d8f7a470ecfa50ef4addbc41a60379f for input
[fpcache] read chunk of 1 files
[fpcache] opening cache file .unison/fp2d8f7a470ecfa50ef4addbc41a60379f for output
[pred] ignore '' = false
[update] buildUpdateRec: /home/frederik/unison-test/bar
[update] checkContentsChange: archStamp is inode (489993) / info.inode (489993) / times: 1436256685.000000 = 1436256685.000000... true / lengths: 0 - 0
[update] Setting archive for //lot//home/frederik/unison-test/bar
[update] findOnRoot /home/frederik/unison-test/foo
[update] findLocal /home/frederik/unison-test/foo ()
[fpcache] opening cache file .unison/fpbea074476b2045f87d214607955fc245 for input
[fpcache] read chunk of 1 files
[fpcache] opening cache file .unison/fpbea074476b2045f87d214607955fc245 for output
[pred] ignore '' = false
[update] buildUpdateRec: /home/frederik/unison-test/foo
[update] checkContentsChange: archStamp is inode (489992) / info.inode (489992) / times: 1436256685.000000 = 1436256686.000000... false / lengths: 0 - 3
[fpcache] cache miss for path 
[update]   archive digest = (d41d8cd98f00b204e9800998ecf8427e,)   current digest = (764efa883dda1e11db47671c4a3bbd9e,)
[update]   Updated file
[update] Setting archive for //lot//home/frederik/unison-test/foo
Reconciling changes
[recon] reconcileAll
[recon] reconcile: 1 results
[update] Marking 0 paths equal
[pred] forcepartial '' = false
[pred] preferpartial '' = false

foo            bar                
changed  ---->            /  [f] m
changed  <=M=>            /  

Proceed with propagating updates? [] y
Propagating updates


UNISON 2.48.3 started propagating changes at 01:11:27.41 on 07 Jul 2015
[files] merge path  between roots /home/frederik/unison-test/foo and /home/frederik/unison-test/bar
[pred] follow '' = false
[fspath] Os.findWorkingDir(/home/frederik/unison-test/foo,) = (/home/frederik/unison-test,foo)
[copy] copyRegFile(/home/frederik/unison-test/foo,) -> (/home/frederik/unison-test/foo,foo,/home/frederik/unison-test,.unison.merge1-foo,modified on 2015-07-07 at  1:11:26  size 3         rw-r--r--)
[copy] Copy.localFile /home/frederik/unison-test/foo /  to /home/frederik/unison-test / .unison.merge1-foo
[props] Setting permissions for /home/frederik/unison-test/.unison.merge1-foo to rw-r--r-- (644/1777)
[copy] copyRegFile(/home/frederik/unison-test/bar,) -> (/home/frederik/unison-test/foo,foo,/home/frederik/unison-test,.unison.merge2-foo,modified on 2015-07-07 at  1:11:25  size 0         rw-r--r--)
[copy] Copy.localFile /home/frederik/unison-test/bar /  to /home/frederik/unison-test / .unison.merge2-foo
[props] Setting permissions for /home/frederik/unison-test/.unison.merge2-foo to rw-r--r-- (644/1777)
[stasher] getRecentVersion of  in /home/frederik/unison-test/foo
Uncaught exception File "/build/unison/src/unison-2.48.3/path.ml", line 210, characters 4-10: Assertion failed
Raised at file "/build/unison/src/unison-2.48.3/lwt/lwt.ml", line 126, characters 22-23
Called from file "/build/unison/src/unison-2.48.3/lwt/generic/lwt_unix_impl.ml", line 102, characters 8-23
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 490, characters 2-113
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 556, characters 38-66
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 718, characters 6-47
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 788, characters 6-90
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 810, characters 19-66
Called from file "/build/unison/src/unison-2.48.3/uitext.ml", line 870, characters 21-43



----- End forwarded message -----

-------------- next part --------------
#!/bin/zsh

mkdir unison-test
cd unison-test

touch foo
touch bar

#xvkbd -xsendevent -text " ";
UNISON=.unison unison -debug all foo bar;

echo hi > foo

#xvkbd -xsendevent -text "my";
UNISON=.unison unison -debug all foo bar;

#rm -rf unison-test


More information about the Unison-hackers mailing list