Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

read-cache: two small leak fixes #1801

Closed
wants to merge 1 commit into from

Conversation

derrickstolee
Copy link

@derrickstolee derrickstolee commented Sep 27, 2024

This v2 removes the duplicate patch and updates the commit message.

Thanks, -Stolee

cc: gitster@pobox.com
cc: peff@peff.net
cc: ps@pks.im

@derrickstolee
Copy link
Author

/submit

Copy link

gitgitgadget bot commented Sep 30, 2024

Submitted as pull.1801.git.1727696424.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-1801/derrickstolee/leaks-v1

To fetch this version to local tag pr-1801/derrickstolee/leaks-v1:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-1801/derrickstolee/leaks-v1

read-cache.c Outdated
@@ -3125,6 +3126,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,
free_hashfile(f);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Patrick Steinhardt wrote (reply to this):

On Mon, Sep 30, 2024 at 11:40:24AM +0000, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <stolee@gmail.com>
> 
> While writing an index, a 'git_hash_ctx' is allocated for hashing the
> file contents. This should be freed as the method exits.
> 
> Signed-off-by: Derrick Stolee <stolee@gmail.com>
> ---
>  read-cache.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/read-cache.c b/read-cache.c
> index 3c078afadbc..51845c2e611 100644
> --- a/read-cache.c
> +++ b/read-cache.c
> @@ -3126,6 +3126,7 @@ out:
>  		free_hashfile(f);
>  	strbuf_release(&sb);
>  	free(ieot);
> +	free(eoie_c);
>  	return ret;
>  }

Yup, this one looks correct. I've sent out an equivalent patch via [1] a
couple hours ago.

Patrick

[1]: https://lore.kernel.org/git/c51f40c5bd0c56967e348363e784222de7884b79.1727687410.git.ps@pks.im/

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Derrick Stolee wrote (reply to this):

On 9/30/24 8:32 AM, Patrick Steinhardt wrote:
> On Mon, Sep 30, 2024 at 11:40:24AM +0000, Derrick Stolee via GitGitGadget wrote:
>> From: Derrick Stolee <stolee@gmail.com>

>> diff --git a/read-cache.c b/read-cache.c
>> index 3c078afadbc..51845c2e611 100644
>> --- a/read-cache.c
>> +++ b/read-cache.c
>> @@ -3126,6 +3126,7 @@ out:
>>   		free_hashfile(f);
>>   	strbuf_release(&sb);
>>   	free(ieot);
>> +	free(eoie_c);
>>   	return ret;
>>   }
> > Yup, this one looks correct. I've sent out an equivalent patch via [1] a
> couple hours ago.
> > Patrick
> > [1]: https://lore.kernel.org/git/c51f40c5bd0c56967e348363e784222de7884b79.1727687410.git.ps@pks.im/

Sorry for the collision. I had checked when prepping the GGG PR on
Friday but forgot to check again before submitting. Your patch is
better in substance and context.

Thanks,
-Stolee

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Patrick Steinhardt wrote (reply to this):

On Tue, Oct 01, 2024 at 06:01:06AM -0400, Derrick Stolee wrote:
> On 9/30/24 8:32 AM, Patrick Steinhardt wrote:
> > On Mon, Sep 30, 2024 at 11:40:24AM +0000, Derrick Stolee via GitGitGadget wrote:
> > > From: Derrick Stolee <stolee@gmail.com>
> 
> > > diff --git a/read-cache.c b/read-cache.c
> > > index 3c078afadbc..51845c2e611 100644
> > > --- a/read-cache.c
> > > +++ b/read-cache.c
> > > @@ -3126,6 +3126,7 @@ out:
> > >   		free_hashfile(f);
> > >   	strbuf_release(&sb);
> > >   	free(ieot);
> > > +	free(eoie_c);
> > >   	return ret;
> > >   }
> > 
> > Yup, this one looks correct. I've sent out an equivalent patch via [1] a
> > couple hours ago.
> > 
> > Patrick
> > 
> > [1]: https://lore.kernel.org/git/c51f40c5bd0c56967e348363e784222de7884b79.1727687410.git.ps@pks.im/
> 
> Sorry for the collision. I had checked when prepping the GGG PR on
> Friday but forgot to check again before submitting. Your patch is
> better in substance and context.

Nothing to be sorry about, both series were sent out quite close to one
another. Quite on the contrary, thanks for fixing this leak :)

I don't mind much which of these versions lands in the tree, and the
resulting conflict is trivial to solve anyway.

Patrick

@@ -2188,6 +2188,7 @@ static unsigned long load_cache_entries_threaded(struct index_state *istate, con
if (err)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Patrick Steinhardt wrote (reply to this):

On Mon, Sep 30, 2024 at 11:40:23AM +0000, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <stolee@gmail.com>
> 
> In load_cache_entries_threaded(), each thread is allocated its own

s/allocated/allocating/

> memory pool. This pool needs to be cleaned up while closing the threads
> down, or it will be leaked.
> 
> Signed-off-by: Derrick Stolee <stolee@gmail.com>
> ---
>  read-cache.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/read-cache.c b/read-cache.c
> index 764fdfec465..3c078afadbc 100644
> --- a/read-cache.c
> +++ b/read-cache.c
> @@ -2188,6 +2188,7 @@ static unsigned long load_cache_entries_threaded(struct index_state *istate, con
>  		if (err)
>  			die(_("unable to join load_cache_entries thread: %s"), strerror(err));
>  		mem_pool_combine(istate->ce_mem_pool, p->ce_mem_pool);
> +		free(p->ce_mem_pool);
>  		consumed += p->consumed;
>  	}

Okay. We move over the contents of the pool, but forgot to free the pool
itself. As far as I can see the pool is always allocated and only used
in two functions, both of which assume that it is allocated. So I wonder
why it is allocated in the first place instead of making it a direct
member of `struct load_cache_entries_thread_data`.

Patrick

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Derrick Stolee wrote (reply to this):

On 9/30/24 8:32 AM, Patrick Steinhardt wrote:
> On Mon, Sep 30, 2024 at 11:40:23AM +0000, Derrick Stolee via GitGitGadget wrote:
>> From: Derrick Stolee <stolee@gmail.com>
>>
>> In load_cache_entries_threaded(), each thread is allocated its own
> > s/allocated/allocating/

You're right that the wording is awkward but I'm not thrilled with the
suggested alternative.

Perhaps "each thread allocates its own"

>> memory pool. This pool needs to be cleaned up while closing the threads
>> down, or it will be leaked.

> Okay. We move over the contents of the pool, but forgot to free the pool
> itself. As far as I can see the pool is always allocated and only used
> in two functions, both of which assume that it is allocated. So I wonder
> why it is allocated in the first place instead of making it a direct
> member of `struct load_cache_entries_thread_data`.

I took a look at what it would take to replace the pointer with an inline
struct but found complications with situations such as the find_mem_pool()
method. While we could replace some of the logic to recognize the new
type, the existing logic seems to depend on using the NULL pointer as an
indicator that the pool should be lazily initialized.

If we were to pull the struct inline, we would either need another boolean
to indicate initialization or lose lazy initialization.

I'm leaning towards the simpler leak fix over the disruption of that
change.

Thanks,
-Stolee

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the Git mailing list, Patrick Steinhardt wrote (reply to this):

On Tue, Oct 01, 2024 at 09:20:01AM -0400, Derrick Stolee wrote:
> On 9/30/24 8:32 AM, Patrick Steinhardt wrote:
> > On Mon, Sep 30, 2024 at 11:40:23AM +0000, Derrick Stolee via GitGitGadget wrote:
> > > From: Derrick Stolee <stolee@gmail.com>
> > > 
> > > In load_cache_entries_threaded(), each thread is allocated its own
> > 
> > s/allocated/allocating/
> 
> You're right that the wording is awkward but I'm not thrilled with the
> suggested alternative.
> 
> Perhaps "each thread allocates its own"

Sure, works for me :)

> > > memory pool. This pool needs to be cleaned up while closing the threads
> > > down, or it will be leaked.
> 
> > Okay. We move over the contents of the pool, but forgot to free the pool
> > itself. As far as I can see the pool is always allocated and only used
> > in two functions, both of which assume that it is allocated. So I wonder
> > why it is allocated in the first place instead of making it a direct
> > member of `struct load_cache_entries_thread_data`.
> 
> I took a look at what it would take to replace the pointer with an inline
> struct but found complications with situations such as the find_mem_pool()
> method. While we could replace some of the logic to recognize the new
> type, the existing logic seems to depend on using the NULL pointer as an
> indicator that the pool should be lazily initialized.
> 
> If we were to pull the struct inline, we would either need another boolean
> to indicate initialization or lose lazy initialization.
> 
> I'm leaning towards the simpler leak fix over the disruption of that
> change.

Fair enough, no complaint from my side. I thought it would've been easy,
but didn't dive deep. So if you say it is harder than I made it out to
be with my shallow understanding I'm going to trust your judgement.
After all, the leak fix is a strict improvement by itself.

Patrick

In load_cache_entries_threaded(), each thread allocates its own memory
pool. This pool needs to be cleaned up while closing the threads down,
or it will be leaked.

This ce_mem_pool pointer could theoretically be converted to an inline
copy of the struct, but the use of a pointer helps with existing lazy-
initialization logic. Adjusting that behavior only to avoid this pointer
would be a much bigger change.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
@derrickstolee
Copy link
Author

/submit

Copy link

gitgitgadget bot commented Oct 1, 2024

Submitted as pull.1801.v2.git.1727804265033.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-1801/derrickstolee/leaks-v2

To fetch this version to local tag pr-1801/derrickstolee/leaks-v2:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-1801/derrickstolee/leaks-v2

Copy link

gitgitgadget bot commented Oct 1, 2024

This patch series was integrated into seen via git@38d328a.

@gitgitgadget gitgitgadget bot added the seen label Oct 1, 2024
Copy link

gitgitgadget bot commented Oct 2, 2024

On the Git mailing list, Patrick Steinhardt wrote (reply to this):

On Tue, Oct 01, 2024 at 05:37:44PM +0000, Derrick Stolee via GitGitGadget wrote:
> From: Derrick Stolee <stolee@gmail.com>
> 
> In load_cache_entries_threaded(), each thread allocates its own memory
> pool. This pool needs to be cleaned up while closing the threads down,
> or it will be leaked.
> 
> This ce_mem_pool pointer could theoretically be converted to an inline
> copy of the struct, but the use of a pointer helps with existing lazy-
> initialization logic. Adjusting that behavior only to avoid this pointer
> would be a much bigger change.

Thanks, this looks good to me.

Patrick

Copy link

gitgitgadget bot commented Oct 2, 2024

This branch is now known as ds/read-cache-mempool-leakfix.

Copy link

gitgitgadget bot commented Oct 2, 2024

This patch series was integrated into seen via git@4887e21.

Copy link

gitgitgadget bot commented Oct 2, 2024

This patch series was integrated into next via git@c0eac89.

@gitgitgadget gitgitgadget bot added the next label Oct 2, 2024
Copy link

gitgitgadget bot commented Oct 2, 2024

There was a status update in the "New Topics" section about the branch ds/read-cache-mempool-leakfix on the Git mailing list:

Leakfix.

Will merge to 'master'.
source: <pull.1801.v2.git.1727804265033.gitgitgadget@gmail.com>

Copy link

gitgitgadget bot commented Oct 4, 2024

This patch series was integrated into seen via git@b4efdfe.

Copy link

gitgitgadget bot commented Oct 4, 2024

This patch series was integrated into master via git@b4efdfe.

Copy link

gitgitgadget bot commented Oct 4, 2024

This patch series was integrated into next via git@b4efdfe.

@gitgitgadget gitgitgadget bot added the master label Oct 4, 2024
Copy link

gitgitgadget bot commented Oct 4, 2024

Closed via b4efdfe.

@gitgitgadget gitgitgadget bot closed this Oct 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant