[Unison-hackers] another way to produce path.ml assertion failure assertion failure, tested versions 2.40.65 and 2.48.3

Frederik Eaton frederik at ofb.net
Mon Jul 20 22:35:17 EDT 2015


Hi all,

I'm attaching another script for producing the same path.ml assertion
failure. This time no merging is involved, just initialize the
archive, then edit a file and type "f" for "follow" at the Unison
prompt. The only thing is that you need to set a "backup" preference
to generate the error. I also verified that this bug report and the
last one are both triggering the same behavior in the latest
subversion (provided I've run subversion correctly - it says "At
revision 545"). The error message is:

Uncaught exception File "/home/frederik/tmp/unison/trunk/src/path.ml", line 210, characters 4-10: Assertion failed

I'm wondering if this problem is due to a recent change in OCaml
libraries, since I don't think an obvious bug like this would have
persisted for 14 years? I don't know much about OCaml but it looks
like the 'unison' binary doesn't link any OCaml DLLs... OTOH a lot of
your String operations trigger deprecation warnings.

Thanks,

Frederick

On Fri, Jul 10, 2015 at 11:30:53AM -0700, Frederik Eaton wrote:
> 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 -----
> 

> #!/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

> _______________________________________________
> Unison-hackers mailing list
> Unison-hackers at lists.seas.upenn.edu
> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers

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

rm -rf unison-bug-test
mkdir unison-bug-test
cd unison-bug-test

F=foo
G=bar

touch $F
touch $G

export UNISON=.unison
mkdir $UNISON
echo "backup = Name *" >> $UNISON/default.prf

echo hi > $F

xvkbd -xsendevent -text " >y";
unison -debug all $F $G;

echo bye > $G

xvkbd -xsendevent -text "fy";
unison -debug all $F $G;

#rm -rf unison-bug-test


More information about the Unison-hackers mailing list