Re: fact-import: failed to apply delta

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 10 Feb 2009, Shawn O. Pearce wrote:

> Daniel Barkalow <barkalow@xxxxxxxxxxxx> wrote:
> > On Tue, 10 Feb 2009, Shawn O. Pearce wrote:
> > > 
> > > We should dump the cached_objects table in sha1_file.c during
> > > a checkpoint in fast-import.
> > 
> > No, that one's keyed by sha1, and doesn't get collisions; it's the 
> > delta_base_cache that's the issue; it's keyed by struct packed_git * and 
> > offset.
> 
> Uh, yea, I realize that after I sent the message.  Does this patch
> fix it for you?

Aside from the trivial typo, yes. (Although I can't be 100% sure it didn't 
just happen to change things leading to needing a different test case; I 
can say for sure that it got past the previous code's MTBF, which is a 
good sign.)

> --8<--
> Clear the delta base cache during fast-import checkpoint
> 
> Otherwise we may reuse the same memory address for a totally
> different "struct packed_git", and a previously cached object from
> the prior occupant might be returned when trying to unpack an object
> from the new pack.
> 
> Found-by: Daniel Barkalow <barkalow@xxxxxxxxxxxx>
> Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
> ---
>  cache.h       |    1 +
>  fast-import.c |    1 +
>  sha1_file.c   |    7 +++++++
>  3 files changed, 9 insertions(+), 0 deletions(-)
> 
> diff --git a/cache.h b/cache.h
> index 8dcc53c..7f1a6e8 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -830,6 +830,7 @@ extern unsigned char* use_pack(struct packed_git *, struct pack_window **, off_t
>  extern void close_pack_windows(struct packed_git *);
>  extern void unuse_pack(struct pack_window **);
>  extern void free_pack_by_name(const char *);
> +extern void clear_delta_base_cache(void);
>  extern struct packed_git *add_packed_git(const char *, int, int);
>  extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t);
>  extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t);
> diff --git a/fast-import.c b/fast-import.c
> index 1935206..03b13e0 100644
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -945,6 +945,7 @@ static void end_packfile(void)
>  {
>  	struct packed_git *old_p = pack_data, *new_p;
>  
> +	clear_delta_base_cache();
>  	if (object_count) {
>  		char *idx_name;
>  		int i;
> diff --git a/sha1_file.c b/sha1_file.c
> index 8868b80..d2dbc96 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -1663,6 +1663,13 @@ static inline void release_delta_base_cache(struct delta_base_cache_entry *ent)
>  	}
>  }
>  
> +void clear_delta_base_cache(void)
> +{
> +	unsigned long p;
> +	for (p = 0; p < MAX_DELTA_CACHE; p++)
> +		release_delta_base_cache(&delta_base_cache[p])
> +}
> +
>  static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
>  	void *base, unsigned long base_size, enum object_type type)
>  {
> -- 
> 1.6.2.rc0.186.g417c
> 
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux