• M
    repack_without_ref(): silence errors for dangling packed refs · ab292bc4
    Michael Haggerty 提交于
    Stop emitting an error message when deleting a packed reference if we
    find another dangling packed reference that is overridden by a loose
    reference.  See the previous commit for a longer explanation of the
    issue.
    
    We have to be careful to make sure that the invalid packed reference
    really *is* overridden by a loose reference; otherwise what we have
    found is repository corruption, which we *should* report.
    
    Please note that this approach is vulnerable to a race condition
    similar to the race conditions already known to affect packed
    references [1]:
    
    * Process 1 tries to peel packed reference X as part of deleting
      another packed reference.  It discovers that X does not refer to a
      valid object (because the object that it referred to has been
      garbage collected).
    
    * Process 2 tries to delete reference X.  It starts by deleting the
      loose reference X.
    
    * Process 1 checks whether there is a loose reference X.  There is not
      (it has just been deleted by process 2), so process 1 reports a
      spurious error "X does not point to a valid object!"
    
    The worst case seems relatively harmless, and the fix is identical to
    the fix that will be needed for the other race conditions (namely
    holding a lock on the packed-refs file during *all* reference
    deletions), so we leave the cleaning up of all of them as a future
    project.
    
    [1] http://thread.gmane.org/gmane.comp.version-control.git/211956Signed-off-by: NMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    ab292bc4
refs.c 72.9 KB