D6867: transaction: detect an attempt to truncate-to-extend on playback, raise error

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

D6867: transaction: detect an attempt to truncate-to-extend on playback, raise error

martinvonz (Martin von Zweigbergk)
spectral created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  On some networked filesystems, writes can have delayed finalization/confirmation
  and write races can occur such that a remote modification will "win" and
  modifications will be lost. There is no functionality for providing this
  feedback to userspace programs (in fact, there's not even functionality for
  providing this information to the Linux kernel...), so these programs may see
  the files suddenly change.
 
  We've noticed that there have been cases where Mercurial has detected something
  has gone wrong and attempts to abort (rolling back the transaction), which is
  good. However, when rolling back the transaction, for the append-only files,
  we attempt to "truncate" the file back to the size it was in before the hg
  transaction started, but end up *extending* it. This may be harmless, but if
  this happens to the 00changelog.i file, we get a bunch of nulls on the end of
  the file and this causes hg to become *really* confused. :)
 
  If we detect that some modification of the file outside of this Mercurial
  process has caused the file to be smaller than the size we are attempting to
  truncate to, let's just exit and stop trying to clean up the repository -
  continuing will likely just cause more damage.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6867

AFFECTED FILES
  mercurial/transaction.py

CHANGE DETAILS

diff --git a/mercurial/transaction.py b/mercurial/transaction.py
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -54,6 +54,10 @@
             checkambig = checkambigfiles and (f, '') in checkambigfiles
             try:
                 fp = opener(f, 'a', checkambig=checkambig)
+                if fp.tell() < o:
+                    raise error.Abort(_(
+                            "attempted to truncate %s to %d bytes, but it was "
+                            "already %d bytes\n") % (f, o, fp.tell()))
                 fp.truncate(o)
                 fp.close()
             except IOError:



To: spectral, #hg-reviewers
Cc: mercurial-devel
_______________________________________________
Mercurial-devel mailing list
[hidden email]
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Reply | Threaded
Open this post in threaded view
|

D6867: transaction: detect an attempt to truncate-to-extend on playback, raise error

martinvonz (Martin von Zweigbergk)
durin42 added a comment.


  I feel like there's room for doing better, but it'll require very careful reasoning and may not be worthwhile.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6867/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6867

To: spectral, #hg-reviewers
Cc: durin42, mercurial-devel
_______________________________________________
Mercurial-devel mailing list
[hidden email]
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Reply | Threaded
Open this post in threaded view
|

D6867: transaction: detect an attempt to truncate-to-extend on playback, raise error

martinvonz (Martin von Zweigbergk)
In reply to this post by martinvonz (Martin von Zweigbergk)
Closed by commit rHG8502f76dbfd7: transaction: detect an attempt to truncate-to-extend on playback, raise error (authored by spectral).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6867?vs=16578&id=16592

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6867/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D6867

AFFECTED FILES
  mercurial/transaction.py

CHANGE DETAILS

diff --git a/mercurial/transaction.py b/mercurial/transaction.py
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -54,6 +54,10 @@
             checkambig = checkambigfiles and (f, '') in checkambigfiles
             try:
                 fp = opener(f, 'a', checkambig=checkambig)
+                if fp.tell() < o:
+                    raise error.Abort(_(
+                            "attempted to truncate %s to %d bytes, but it was "
+                            "already %d bytes\n") % (f, o, fp.tell()))
                 fp.truncate(o)
                 fp.close()
             except IOError:



To: spectral, #hg-reviewers
Cc: durin42, mercurial-devel
_______________________________________________
Mercurial-devel mailing list
[hidden email]
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel