A few weeks ago, Andy asked me to try to reproduce this problem with older
versions of fossil.  The check-in
"41c2220934de8cb8d90126d5083df3e95e961b8c" is where the problem first
appears.  This also mirrors the findings in the "Merge failed with SQL
error" email in the fossil-users mailing list that states the problem seems
related to the "merge-renames" branch.

On Sat, Nov 12, 2016 at 1:56 AM, Andy Bradford <[email protected]>
wrote:

> Thus said Zakero on Sun, 16 Oct 2016 18:45:41 -0500:
>
> > Ran into an interesting problem yesterday when merging branches:
> >
> > SQLITE_CONSTRAINT: abort at 41 in [INSERT INTO
> > vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> > 21178,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=4735]:
> UNIQUE
> > constraint failed: vfile.pathname, vfile.
> > fossil: UNIQUE constraint failed: vfile.pathname, vfile.vid: {INSERT INTO
> > vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> > 21178,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=4735}
> > Rolling back prior filesystem changes...
>
> I have been  working with Zakero on  this problem, but so  far have been
> unable to provide a suitable fix, mostly because I'm not sure which part
> of the code is  actually the cause of the problem; that  and and lack of
> familiarity with the merge algorithm (is there one?) and code.
>
> I  have finally  been  able to  reproduce this  problem  with a  minimal
> test-case. I will include the output below that can trigger the problem.
>
> I've  added some  additional uncommitted  debug code  to Fossil  to help
> understand what's  happening; basically just  output the fv  table after
> each modification to it. I believe  the problem happens because the same
> file is  attempted to  be added  to the  vfile table  due to  failure to
> detect that there was a rename.
>
> In the  debug, you'll notice that  Fossil first adds in  renames for fn,
> and there are none,  so there is no output. Then it  adds in renames for
> fnp (Pivot) and  there are some but  none that get added to  fv. Then it
> adds in renames for fnm (Merge) and  finally there is an entry in the fv
> table for  a change from  the name pivot (N)  to the merge  version (M).
> afile is recorded as renamed to Afile due to the merge.
>
> Next, Fossil  starts adding in files  from the checkout version  (V) and
> another row  is added  to the fv  table for the  rename. Should  it have
> updated the existing entry in fv? Or  should it be handled later on with
> the rest of the code that checks for various renames?
>
> Moving on...
>
> After adding  files from V, both  row 1 and  row 2 in fv  that represent
> changes to  Afile. Adding  in files from  P updates both  rows 1  and 2.
> Adding in files from  M doesn't alter row 1 or 2, but  does update row 3
> (un unrelated file). No further modifications  are made to fv and in the
> end, when Fossil  begins updating the vfile table, it  ends up trying to
> insert the same filename twice but for different reasons.
>
> I've tried what I thought would be  an appropriate fix, but there were a
> handful of  failures in merge5,  merge_renames and one in  merge_exe, so
> either it was  the wrong fix, or the tests  are biased towards incorrect
> behavior.
>
> Here is the enhanced merge debug output:
>
> $ /tmp/fossil merge --debug away
> N=3 0e060d1e500398f692088acff2981a1ea57b1bde
> P=19 ed49365cd035e7eaadf99ba315bf211e75a915b6
> M=21 48a07754f9c0bcbe0d4408e9a83c976ae74c8b85
> V=19 ed49365cd035e7eaadf99ba315bf211e75a915b6
>
> add_renames for fn
>
> add_renames for fnp
> N->M at 14> 4386173c7f: 2[afile] -> 0[]
> N->M at 14> 4386173c7f: 2[afile] -> 3[Afile]
> N->M summary 2[afile] -> 3[Afile]
>
> add_renames for fnm
>   1: ridv=0    ridp=0    ridm=0    idv=0    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = []
>      fnp = []
>      fnm = [Afile]
>      fnn = [afile]
>
> add files found in V
>   1: ridv=0    ridp=0    ridm=0    idv=0    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [afile]
>      fnp = []
>      fnm = [Afile]
>      fnn = [afile]
>   2: ridv=12   ridp=0    ridm=0    idv=9    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [Afile]
>      fnp = []
>      fnm = []
>      fnn = []
>   3: ridv=18   ridp=0    ridm=0    idv=10   idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [file]
>      fnp = []
>      fnm = []
>      fnn = []
>
> add files found in P
>   1: ridv=0    ridp=0    ridm=0    idv=0    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [afile]
>      fnp = [afile]
>      fnm = [Afile]
>      fnn = [afile]
>   2: ridv=12   ridp=0    ridm=0    idv=9    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [Afile]
>      fnp = [Afile]
>      fnm = []
>      fnn = []
>   3: ridv=18   ridp=0    ridm=0    idv=10   idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [file]
>      fnp = [file]
>      fnm = []
>      fnn = []
>
> add files found in M
>   1: ridv=0    ridp=0    ridm=0    idv=0    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [afile]
>      fnp = [afile]
>      fnm = [Afile]
>      fnn = [afile]
>   2: ridv=12   ridp=0    ridm=0    idv=9    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [Afile]
>      fnp = [Afile]
>      fnm = []
>      fnn = []
>   3: ridv=18   ridp=0    ridm=0    idv=10   idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [file]
>      fnp = [file]
>      fnm = [file]
>      fnn = []
>
> compute file version ids for P and M
>   1: ridv=0    ridp=0    ridm=0    idv=0    idp=0    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [afile]
>      fnp = [afile]
>      fnm = [Afile]
>      fnn = [afile]
>   2: ridv=12   ridp=12   ridm=0    idv=9    idp=9    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [Afile]
>      fnp = [Afile]
>      fnm = []
>      fnn = []
>   3: ridv=18   ridp=18   ridm=0    idv=10   idp=10   idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [file]
>      fnp = [file]
>      fnm = [file]
>      fnn = []
>
> Final fv table
>   1: ridv=0    ridp=0    ridm=12   idv=0    idp=0    idm=11   chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [afile]
>      fnp = [afile]
>      fnm = [Afile]
>      fnn = [afile]
>   2: ridv=12   ridp=12   ridm=0    idv=9    idp=9    idm=0    chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [Afile]
>      fnp = [Afile]
>      fnm = []
>      fnn = []
>   3: ridv=18   ridp=18   ridm=20   idv=10   idp=10   idm=12   chnged=0
> isexe=0  islinkv=0 islinkm=0
>      fn  = [file]
>      fnp = [file]
>      fnm = [file]
>      fnn = []
> UPDATE file
> DELETE Afile
> SQLITE_CONSTRAINT: abort at 41 in [INSERT INTO
> vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 19,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=11]: UNIQUE
> constraint failed: vfile.pathname, vfile.vid
> /tmp/fossil: UNIQUE constraint failed: vfile.pathname, vfile.vid: {INSERT
> INTO vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 19,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=11}
> Rolling back prior filesystem changes...
> UNDO   file
> NEW    Afile
>
>
> Finally, here  is the actual  output which  generated that Fossil  and a
> link to a running copy of it:
>
> http://fossil.bradfords.org:8080/
>
> $ fossil new trial.fossil
> project-id: 9e366debcee01098f3222ac070f7d1a3405c7ede
> server-id:  4f97c2b2117caf2df2b5b74f013c35ce7947643f
> admin-user: amb (initial password is "eeffcc")
> $ mkdir trial; cd trial; fossil open ../trial.fossil
> project-name: <unnamed>
> repository:   /tmp/trial/../trial.fossil
> local-root:   /tmp/trial/
> config-db:    /home/amb/.fossil
> project-code: 9e366debcee01098f3222ac070f7d1a3405c7ede
> checkout:     ad537de4b083bbbd8b68f3f6e39a66b86f12569c 2016-11-08
> 06:01:57 UTC
> tags:         trunk
> comment:      initial empty check-in (user: amb)
> check-ins:    1
> $ echo $RANDOM > file
> $ fossil add file; fossil ci -m start
> ADDED  file
> New_Version: 0e060d1e500398f692088acff2981a1ea57b1bde
> $ echo $RANDOM > file
> $ fossil ci -m split --branch away
> New_Version: 9e5cf03ad3df7715e4b924748c684a2c7b211dfc
> $ echo $RANDOM >> file
> $ fossil ci -m ready
> New_Version: f79038314ef61389e4a835b33b9e66349775da10
> $ fossil up trunk
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   0e060d1e500398f692088acff2981a1ea57b1bde 2016-11-08
> 06:02:10 UTC
> tags:         trunk
> comment:      start (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ echo $RANDOM >> file
> $ fossil ci -m aim
> New_Version: b8b28ac61c2d99f2943a770bd226b3a06769b974
> $ fossil up away
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   f79038314ef61389e4a835b33b9e66349775da10 2016-11-08
> 06:02:24 UTC
> tags:         away
> comment:      ready (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge trunk
> MERGE file
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil ci -m fire
> New_Version: d8b1e949c521ca0eabe674426b772e4c805f9572
> $ echo $RANDOM > afile
> $ fossil add afile; fossil ci -m newfile
> ADDED  afile
> New_Version: 254f76f43e0f72ca6d26a3f02b707426228f700d
> $ fossil mv --hard afile Afile
> RENAME afile Afile
> MOVED_FILE /tmp/trial/afile
> $ fossil ci -m renamed
> New_Version: 4386173c7f2e2853d4dca7c10cc7e4c8e5a162ac
> $ fossil up trunk
> REMOVE Afile
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   b8b28ac61c2d99f2943a770bd226b3a06769b974 2016-11-08
> 06:02:34 UTC
> tags:         trunk
> comment:      aim (user: amb)
> changes:      2 files modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge away
> UPDATE file
> ADDED Afile
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil ci -m bring
> New_Version: ecce9dc98a30421c801783db7dd9ccf2f64b0927
> $ fossil up away
> ------------------------------------------------------------
> -------------------
> checkout:     4386173c7f2e2853d4dca7c10cc7e4c8e5a162ac 2016-11-08
> 06:03:02 UTC
> tags:         away
> comment:      renamed (user: amb)
> changes:      None. Already up-to-date
> $ ed -s file <<EOF
> > i
> > $RANDOM
> > .
> > w
> > q
> > EOF
> $ fossil ci -m forth
> New_Version: 8beed199505d4d5cd79ba841b641c71071f56694
> $ fossil up trunk
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   ecce9dc98a30421c801783db7dd9ccf2f64b0927 2016-11-08
> 06:03:24 UTC
> tags:         trunk
> comment:      bring (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ echo $RANDOM >> file
> $ fossil ci -m the
> New_Version: ed49365cd035e7eaadf99ba315bf211e75a915b6
> $ fossil up away
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   8beed199505d4d5cd79ba841b641c71071f56694 2016-11-08
> 06:04:46 UTC
> tags:         away
> comment:      forth (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge trunk
> MERGE file
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil ci -m rain
> New_Version: 48a07754f9c0bcbe0d4408e9a83c976ae74c8b85
> $ fossil up trunk
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   ed49365cd035e7eaadf99ba315bf211e75a915b6 2016-11-08
> 06:05:04 UTC
> tags:         trunk
> comment:      the (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge away
> UPDATE file
> DELETE Afile
> SQLITE_CONSTRAINT: abort at 41 in [INSERT INTO
> vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 19,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=17]: UNIQUE
> constraint failed: vfile.pathname, vfile.vid
> fossil: UNIQUE constraint failed: vfile.pathname, vfile.vid: {INSERT INTO
> vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 19,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=17}
> Rolling back prior filesystem changes...
> UNDO   file
> NEW    Afile
> $ fossil up ecce9dc98a30421c801783db7dd9ccf2f64b0927
> UPDATE file
> ------------------------------------------------------------
> -------------------
> updated-to:   ecce9dc98a30421c801783db7dd9ccf2f64b0927 2016-11-08
> 06:03:24 UTC
> tags:         trunk
> comment:      bring (user: amb)
> changes:      1 file modified.
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge 8beed199505d4d5cd79ba841b641c71071f56694
> UPDATE file
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil revert
> REVERT   file
>  "fossil undo" is available to undo changes to the working checkout.
> $ fossil merge away
> UPDATE file
> DELETE Afile
> SQLITE_CONSTRAINT: abort at 41 in [INSERT INTO
> vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 15,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=19]: UNIQUE
> constraint failed: vfile.pathname, vfile.vid
> fossil: UNIQUE constraint failed: vfile.pathname, vfile.vid: {INSERT INTO
> vfile(vid,chnged,deleted,rid,mrid,isexe,islink,pathname)  SELECT
> 15,3,0,rid,mrid,isexe,islink,pathname FROM vfile WHERE id=19}
> Rolling back prior filesystem changes...
> UNDO   file
> NEW    Afile
> $
>
> Thoughts?
>
> Thanks,
>
> Andy
> --
> TAI64 timestamp: 4000000058263ece
>
>
>
_______________________________________________
fossil-dev mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/fossil-dev

Reply via email to