git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 7/8] combine-diff: Fast changed-to-all-parents paths scanning

From
Kirill Smelkov <kirr@navytux.spb.ru>
Date
Feb 5, 2014, 19:14 UTC
Message-ID
<20140205191427.GA3923@mini.zxlink>
In-Reply-To
<xmqqfvnx5umg.fsf@gitster.dls.corp.google.com>
On Wed, Feb 05, 2014 at 09:36:55AM -0800, Junio C Hamano wrote:
Show 47 quoted lines
> Kirill Smelkov <kirr@mns.spb.ru> writes:
> 
> > Only, before I clean things up, I'd like to ask - would the following
> > patch be accepted
> >
> > ---- 8< ---
> > diff --git a/tree-walk.c b/tree-walk.c
> > index 79dba1d..4dc86c7 100644
> > --- a/tree-walk.c
> > +++ b/tree-walk.c
> > @@ -37,7 +37,7 @@ static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned
> >  
> >  	/* Initialize the descriptor entry */
> >  	desc->entry.path = path;
> > -	desc->entry.mode = mode;
> > +	desc->entry.mode = canon_mode(mode);
> >  	desc->entry.sha1 = (const unsigned char *)(path + len);
> >  }
> >  
> > diff --git a/tree-walk.h b/tree-walk.h
> > index ae04b64..ae7fb3a 100644
> > --- a/tree-walk.h
> > +++ b/tree-walk.h
> > @@ -16,7 +16,7 @@ struct tree_desc {
> >  static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
> >  {
> >  	*pathp = desc->entry.path;
> > -	*modep = canon_mode(desc->entry.mode);
> > +	*modep = desc->entry.mode;
> >  	return desc->entry.sha1;
> >  }
> > ---- 8< ---
> >  
> > ?
> 
> Doesn't desc point into and walks over the data we read from the
> tree object directly?
> 
> We try to keep (tree|commit)->buffer intact and that is done pretty
> deliberately.  While you are walking a tree or parsing a commit,
> somebody else, perhaps called indirectly by a helper function you
> call, may call lookup_object() for the same object, get the copy
> that has already been read and start using it.  This kind of change
> will introduce bugs that are hard to debug unless it is done very
> carefully (e.g. starting from making tree.buffer into a const pointer
> and propagating constness throughout the system), which might not be
> worth the pain.

I agree object data should be immutable for good. The only thing I'm talking about here is mode, which is parsed from a tree buffer and is stored in separate field:

        ---- 8< ---- tree-walk.h
        struct name_entry {
                const unsigned char *sha1;
                const char *path;
                unsigned int mode;              <---
        };
        struct tree_desc {
                const void *buffer;
                struct name_entry entry;
                unsigned int size;
        };
        ---- 8< ---- tree-walk.c
        const char *get_mode(const char *str, unsigned int *modep)
        { ... }     /* parses symbolic mode from tree buffer to uint */
        void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned long size)
        {
                const char *path;
                unsigned int mode, len;
                ...
                path = get_mode(buf, &mode);
                /* Initialize the descriptor entry */
                desc->entry.path = path;
                desc->entry.mode = mode;        <---
                desc->entry.sha1 = (const unsigned char *)(path + len);

so we are not talking about modifying object buffers here. All I'm asking is about canonicalizing _already_ parsed and copied mode on the fly.

Does that change anything?

Sorry, if I'm maybe misunderstanding something, and thanks, Kirill

Previous: Junio C HamanoNext: Junio C Hamano
Message 20 of 26 in “`log -c` speedup (part 2)”
  1. 0/8 `log -c` speedup (part 2)Kirill Smelkov, Feb 3, 2014
  2. 1/8 fixup! combine_diff: simplify intersect_paths() furtherKirill Smelkov, Feb 3, 2014
  3. Junio C HamanoFeb 3, 2014
  4. 2/8 tests: add checking that combine-diff emits only correct pathsKirill Smelkov, Feb 3, 2014
  5. Junio C HamanoFeb 3, 2014
  6. Kirill SmelkovFeb 5, 2014
  7. 3/8 tree-diff: no need to manually verify that there is no mode change for a pathKirill Smelkov, Feb 3, 2014
  8. Junio C HamanoFeb 3, 2014
  9. 4/8 tree-diff: no need to pass match to skip_uninteresting()Kirill Smelkov, Feb 3, 2014
  10. 5/8 combine-diff: move show_log_first logic/action out of paths scanningKirill Smelkov, Feb 3, 2014
  11. Junio C HamanoFeb 3, 2014
  12. 6/8 combine-diff: Move changed-paths scanning logic into its own functionKirill Smelkov, Feb 3, 2014
  13. 7/8 combine-diff: Fast changed-to-all-parents paths scanningKirill Smelkov, Feb 3, 2014
  14. Junio C HamanoFeb 3, 2014
  15. Junio C HamanoFeb 3, 2014
  16. Kirill SmelkovFeb 4, 2014
  17. Junio C HamanoFeb 4, 2014
  18. Kirill SmelkovFeb 5, 2014
  19. Junio C HamanoFeb 5, 2014
  20. Kirill SmelkovFeb 5, 2014
  21. Junio C HamanoFeb 5, 2014
  22. Kirill SmelkovFeb 5, 2014
  23. Junio C HamanoFeb 5, 2014
  24. Kirill SmelkovFeb 6, 2014
  25. Junio C HamanoFeb 4, 2014
  26. 8/8 combine-diff: bail out early, if num_paths=0Kirill Smelkov, Feb 3, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.