[PATCH 2/2] dim: handle conflicts when updating the rerere-cache

Daniel Vetter daniel.vetter at ffwll.ch
Fri Dec 15 15:34:50 UTC 2017


Ever since we implemented the explicit garbage-collection logic for
the rr-cache/ entries there's been reports by committers that the git
pull in drm-rerere failed. I think I've seen that now enough times to
distill at least 2 patters:

- Race with someone else hitting the same conflict, or at least a
  conflict with the same conflict-sha1. Then you have locally preimage
  (and perhaps other files) which conflict. Because those files are
  numbered it's pretty hard to merge them automatically, so best to
  just throw away the local stuff.

- git gc removed a bunch of rr-cache/ entries. We've never figured out
  how exactly the gc logic for rr-cache entries works, except it seems
  to be atime based and extremely erratic. Again best option is to
  just reset and let dim gc rr-cache/ entries explicitly (and in a
  much more consistent way).

I think the only risk in this patch is if 2 people resolved the exact
same conflict in drm-tip, but then maybe they should start talking
with each another on irc instead of just looking at dim output.
Throwing away the 2nd conflict resolution shouldn't result in much
harm at least.

Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
---
 dim | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/dim b/dim
index ab58ceedc7aa..7da988aa710a 100755
--- a/dim
+++ b/dim
@@ -517,12 +517,23 @@ function pull_rerere_cache
 	fi
 
 	if ! git pull -q ; then
-		echoerr "Failed to update the rerere cache."
-		echoerr "Please manually run"
-		echoerr "	$ cd $DIM_PREFIX/drm-rerere ; git pull"
-		echoerr "and fixup any issues."
+		# We raced with someone else hitting the same conflict, or the
+		# erratic git gc for rr-cache entries nuke a few entries we
+		# still want to keep. Clean up and try, but only when the
+		# initial pull fails since otherwise there's no way to keep new
+		# resolutions around.
+		echo "Conflict in the rr-cache, cleaning up"
+		git clean -fdx rr-cache/
+		git checkout -f ':(glob)rr-cache/**'
+
+		if ! git pull -q ; then
+			echoerr "Failed to update the rerere cache."
+			echoerr "Please manually run"
+			echoerr "	$ cd $DIM_PREFIX/drm-rerere ; git pull"
+			echoerr "and fixup any issues."
 
-		return 1
+			return 1
+		fi
 	fi
 	cd - > /dev/null
 }
-- 
2.15.1



More information about the dim-tools mailing list