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

memory leak & high CPU usage on windows 10 #4256

Closed
0xffff00 opened this issue Dec 20, 2017 · 22 comments · Fixed by #5487
Closed

memory leak & high CPU usage on windows 10 #4256

0xffff00 opened this issue Dec 20, 2017 · 22 comments · Fixed by #5487
Labels
Milestone

Comments

@0xffff00
Copy link

0xffff00 commented Dec 20, 2017

Do you want to request a feature or report a bug?
bug

What is the current behavior?
A memory leak & high CPU usage always happens to me. it causes nearly 100% memory usage & 100% single-thread CPU usage.

I have closed console window, it happens also.
I have tryed an older version - 2.49, it happens also.

snipaste_20171220_104610
snipaste_20171220_104544
I am sure that git bash has no problem. If I only use git bash, it works fine and memory used will never exceed 2M.
Here is a comparation:

  • processes of git.exe launched by gitextensions:
    snipaste_20171220_111031
  • a process of plain git bash:
    snipaste_20171220_111907

20171221 Updated
A error dialog will be displayed in v2.49(may be fixed already ,i don't know) :
snipaste_20171221_110456

Message:
Exception of type 'System.OutOfMemoryException' was thrown.

Target Site:
Byte[] ReadByte(System.IO.Stream) @ GitCommands.SynchronizedProcessReader

Stacktrace:
at GitCommands.SynchronizedProcessReader.ReadByte(Stream stream)
at GitCommands.SynchronizedProcessReader.<>c__DisplayClass19_0.b__0(Object _)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)

HResult:
-2147024882

If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem.

  1. open gitextensions with an existed git repository.
  2. after 10 minutes, it causes 100% memory usage & 100% single-thread CPU usage

Environment you encounter the issue:

  • GitExtensions version: 2.50.02/2.49
  • GIT version: 2.15.1.windows.2
  • OS version: windows 10 x64 professional edition (zh-CN language)
  • hardware: Intel i5-6200U(2core,4threads), 8GB memory

Did this work in previous version of GitExtensions (which)?
no

@RussKie
Copy link
Member

RussKie commented Dec 20, 2017

I'm very much inclined to think this is an environmental or git issue than GE-specific.
I'm running GE on several machines if not 24x7 but very close to that.
The command log doesn't show anything unexpected or out of the norm...

We've had a number of issues of slowness on W10 but most were related to either W10 components (like speech recognition #3292) or some antivirus (#2907) or bad configs (#3968).

@gerhardol
Copy link
Member

Also related to #4069 (I have a patch for that, awaiting #4209). The workaround for that is deactivating counter in Commit button.

What is the longest running command in the log?

@0xffff00
Copy link
Author

0xffff00 commented Dec 21, 2017

@RussKie
I found this problem may be related to huge file amount of local git repo.
Now I have a git repo of a front-end web project using NodeJS.
It contains <100 files and 'node_modules/*' is written in .gitignore
But after running npm install, the file amount will increased to 19000+ files.
Here is my actions:

  1. clone a git repository to local by git bash.
  2. run command in git bash: npm install.
    when done you can see a directory node_modules with about 20000 files is created and git status is clean since they are all git-igonored.
  3. open this local repo by gitextenstions (both 2.49 & 2.50.02 tried).
  4. open Windows Task Manager, watch for several minutes.

If I skip step 2, gitextenstions works fine. no any 'git.exe' will be stuck and leaks memory.
However, if no above steps skipped, this problem will be reproduced.

  • at v2.49,a error dialog will be displayed:
    a OutOfMemoryException will be thrown by GitCommands.SynchronizedProcessReader.ReadByte(Stream stream)
  • at v2.50.02, memory leaks and 100% cpu usage still. But i haven't verify that the OutOfMemoryException dialog will be popuped or not.

Besides, I tried to all issues you mentioned.
I have disabled speech reocgnition ,disabled firewall and windows defender, run 'net use * /delete' to clear remote share folder links. All these do not work.

@0xffff00 0xffff00 changed the title memory leak & high CPU usage in windows 10 memory leak & high CPU usage on windows 10 Dec 21, 2017
@0xffff00
Copy link
Author

@gerhardo you mean the command log taking longest time?
all logs take < 200ms, here is the longest:
2017-12-21T11:19:20.3845810+08:00 "C:\Program Files\Git\bin\git.exe" log -z --pretty=format:"<(__BEGIN_COMMIT__)>%n%H%n%P%n%T%n%aN%n%aE%n%at%n%cN%n%cE%n%ct%n%e%x00%s%x00%B%x00" --date-order --all --boundary --not --glob=notes --not --max-count="100000" -- #(took 171 ms)

@RussKie
Copy link
Member

RussKie commented Dec 21, 2017 via email

@0xffff00
Copy link
Author

0xffff00 commented Dec 21, 2017

@RussKie
Yes, all npm packages are public. Here is a demo git repo.
just run:

cd gitextensions-issues-4256-reprod
npm install

then, GitExt Browse it.
gitextensions-issues-4256-reprod.zip

@RussKie
Copy link
Member

RussKie commented Dec 21, 2017 via email

@0xffff00
Copy link
Author

@RussKie xmas
no, just GitExt, Window Task Manager, git bash

@gerhardol
Copy link
Member

As there were no other long running commands, this should be a git command that is started but never finished. Check the command line argument to the running git processes.

https://superuser.com/questions/415360/how-do-i-find-out-command-line-arguments-of-a-running-program

@0xffff00
Copy link
Author

0xffff00 commented Dec 22, 2017

@gerhardol thanks for help
With Process Explorer, I found the jammed command :
git.exe ls-files -o -i --exclude-standard
according to git documentation, I guess “-i -o” causes bad performance.
Besides, I tried git bash to run command without GitExt:
git.exe ls-files -o
also reproduces the same problem if the git repo contains too many files.

@gerhardol
Copy link
Member

Turn of update of commit button to get rid of this:
image

related to the issues I mentioned. This case with these long running times will not solve the issue though.
If you want the count, the command must execute...
It will be a little complex to warn the user if the scanning take too long time.

@0xffff00
Copy link
Author

@gerhardol thanks for your suggestion to avoid this issue.
I tried more commands.
There will be stuck for long running time:

git ls-files -o -i --exclude-standard
git ls-files -o

But these are quite fast, may be useful to fetch count for commit button:

#list some ignored files
git ls-files -i --exclude-standard 
#list untracked files
git ls-files -o --exclude-standard

@RussKie
Copy link
Member

RussKie commented Dec 23, 2017 via email

@0xffff00
Copy link
Author

@RussKie
snipaste_20171223_212118

@gerhardol
Copy link
Member

gerhardol commented Dec 23, 2017

I assume the settings were changed after the problem was reported?

GE uses the list of ignored files to ignore changes that the file system reports.
The list is updated at startup and when the global ignore file is changed.
So normally, the load is only a one time shot, not requiring much resources.

Without the filtering "git status" would run more often that normally would give a lot more load.
Maybe there can be some other way to do the filtering.

Edit: I do not find a better way for the normal case where ignored files are 'static'. The include/exclude rules are complex to reimplement in the tool.
git-check-ignore could be used for Git >= 2.3, but there will be many calls when creating 'ignored' files.

So deactivating Commit count is probably the sane solution.

gerhardol added a commit to gerhardol/gitextensions that referenced this issue Dec 31, 2017
Reported in gitextensions#4069
Based on changes in gitextensions#4209
GE can in some situations  use a lot of CPU and disk load, as it runs "git status --untracked-files" at changes in the filesystem
If a status command is not done before next update is detaected, the next start immediately after. "git status" can therefore run continuously.
(This is more visible with certain viruses like Symantec and McAfee.)

This PR limits the checks in two ways:
 * First run is started after 1000 ms + timer (average 250ms) instead of 500+timer, to collect more changes (probably not essential)
 * Next command is started minimum 5000ms after the previous command.
So normal one shot changes are detected about the same as now, but continuous changes are not updating so frequently.

A few other changes like that the "next run" time could be overwritten by a time in the future and that retrieved "git status" data were not used if more file system changes were detected.

If "git status" requires more than 5s to run, the behavior is not improved. The counter in the Commit button should not be used then. Configurable time could improve (like longest of 5s and twice the time to run git status), configurable time is not going to be used.

There are situations where the "ignored files detection" is insufficient. See gitextensions#4256 for a discussion.
@gerhardol
Copy link
Member

I still propose no change, but summarize some more findings.

The current "ignore files" detection is insufficient in this situation. But I see no better solution than to deactivate commit count.

A consequence of the current detection of ignored files is that GE may be slower if starting up in a clean repo (without ignored), then building. When ignored is refreshed after 10 min, the number of git status decreases too.

Parsing the git ignore rules is probably not an option, there are too many specific rules.

Instead of using "ls-files -o -i --exclude-standard" to detect all ignored files, "git status --ignored" could be used to detect directories, so new ignored files can be ignored and memory usage decreases. The parsing of a file the OS reports is changed will have to be redone, but the list will be smaller as directories are listed. But the "startup" problem remains, as well as a part of git exclusion rules in git ignore (this last part can probably be ignored).

I also have to mention "git check-ignore -v", to check each and every file (not realistic).

@0xffff00 Can you try git status --ignored?
For me, "ls-files -o -i --exclude-standard" is faster than git status, but it seem to hang. Can you try again?

gerhardol added a commit to gerhardol/gitextensions that referenced this issue Jan 2, 2018
Reported in gitextensions#4069
Based on changes in gitextensions#4209
GE can in some situations  use a lot of CPU and disk load, as it runs "git status --untracked-files" at changes in the filesystem
If a status command is not done before next update is detaected, the next start immediately after. "git status" can therefore run continuously.
(This is more visible with certain viruses like Symantec and McAfee.)

This PR limits the checks in two ways:
 * First run is started after 1000 ms + timer (average 250ms) instead of 500+timer, to collect more changes (probably not essential)
 * Next command is started minimum 5000ms after the previous command.
So normal one shot changes are detected about the same as now, but continuous changes are not updating so frequently.

A few other changes like that the "next run" time could be overwritten by a time in the future and that retrieved "git status" data were not used if more file system changes were detected.

If "git status" requires more than 5s to run, the behavior is not improved. The counter in the Commit button should not be used then. Configurable time could improve (like longest of 5s and twice the time to run git status), configurable time is not going to be used.

There are situations where the "ignored files detection" is insufficient. See gitextensions#4256 for a discussion.
@0xffff00
Copy link
Author

0xffff00 commented Jan 5, 2018

@gerhardol
git ls-files -o -i --exclude-standard will hang.
git status --ignored will be fine & instantaneous.
commands above were tested under a git repo containing 20,000+ ignored files

gerhardol added a commit to gerhardol/gitextensions that referenced this issue Jan 7, 2018
Reported in gitextensions#4069
GE can in some situations  use a lot of CPU and disk load, as it runs "git status --untracked-files" at changes in the filesystem
If a status command is not done before next update is detected, the next start immediately after. "git status" can therefore run continuously.
(This is more visible with certain viruses like Symantec and McAfee.)

This PR limits the checks in two ways:
 * First run is started after 1000ms + timer (fires every 500ms so adds on average 250ms) instead of 500ms +timer, to collect more changes (probably not essential)
 * Next command is started minimum 3000ms after the previous command. If 3*time to run the status update is longer than 3000ms, the interval time is dynamically increased.
So normal one shot changes are detected about the same as now, but continuous changes are not updating so frequently, "git status" should not run continuously.

A few other changes like that the "next run" time could be overwritten by a time in the future and that retrieved "git status" data were not used if more file system changes were detected.

If "git status" requires more than 5s to run, the behavior is not improved. The counter in the Commit button should not be used then. Configurable time could improve (like longest of 5s and twice the time to run git status), configurable time is not going to be used.

There are situations where the "ignored files detection" is insufficient. See gitextensions#4256 for a discussion.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Jan 7, 2018
Issue gitextensions#4256
Listing ignored files with a separate "ls-files -o -i --exclude-standard" seem to never exit in some situations, see gitextensions#4256
This reuses the git-status call with --ignored as an option to get the ignored files. (The option is only added when ls-files were called previously.) This call did not seem to hang with many ignored files and the command runtime does not increase much.

The solution is not optional though. It still lists all ignored files in memory. The time to find ignored files is faster, but a lot of memory is needed. gitextensions#4256 has some discussions.
Also, processing all output to GitStatusItem first before creating the HashSet will require some more memory (temporary) than required.
@gerhardol
Copy link
Member

Please test that changes I propose is working better
https://ci.appveyor.com/api/buildjobs/ijckfmmxxvndi3sa/artifacts/GitExtensions-2.50.90.1384-Mono.zip

gerhardol added a commit to gerhardol/gitextensions that referenced this issue Jan 7, 2018
Issue gitextensions#4256
Listing ignored files with a separate "ls-files -o -i --exclude-standard" seem to never exit in some situations, see gitextensions#4256
This reuses the git-status call with --ignored as an option to get the ignored files. (The option is only added when ls-files were called previously.) This call did not seem to hang with many ignored files and the command runtime does not increase much.

The solution is not optional though. It still lists all ignored files in memory. The time to find ignored files is faster, but a lot of memory is needed. gitextensions#4256 has some discussions.
Also, processing all output to GitStatusItem first before creating the HashSet will require some more memory (temporary) than required.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Jan 31, 2018
Reported in gitextensions#4069
GE can in some situations  use a lot of CPU and disk load, as it runs "git status --untracked-files" at changes in the filesystem
If a status command is not done before next update is detected, the next start immediately after. "git status" can therefore run continuously.
(This is more visible with certain viruses like Symantec and McAfee.)

This PR limits the checks in two ways:
 * First run is started after 1000ms + timer (fires every 500ms so adds on average 250ms) instead of 500ms +timer, to collect more changes (probably not essential)
 * Next command is started minimum 3000ms after the previous command. If 3*time to run the status update is longer than 3000ms, the interval time is dynamically increased.
So normal one shot changes are detected about the same as now, but continuous changes are not updating so frequently, "git status" should not run continuously.

A few other changes like that the "next run" time could be overwritten by a time in the future and that retrieved "git status" data were not used if more file system changes were detected.

If "git status" requires more than 5s to run, the behavior is not improved. The counter in the Commit button should not be used then. Configurable time could improve (like longest of 5s and twice the time to run git status), configurable time is not going to be used.

There are situations where the "ignored files detection" is insufficient. See gitextensions#4256 for a discussion.
RussKie pushed a commit that referenced this issue Feb 1, 2018
* Limit how often GitStatus polls for changes

Reported in #4069
GE can in some situations  use a lot of CPU and disk load, as it runs "git status --untracked-files" at changes in the filesystem
If a status command is not done before next update is detected, the next start immediately after. "git status" can therefore run continuously.
(This is more visible with certain viruses like Symantec and McAfee.)

This PR limits the checks in two ways:
 * First run is started after 1000ms + timer (fires every 500ms so adds on average 250ms) instead of 500ms +timer, to collect more changes (probably not essential)
 * Next command is started minimum 3000ms after the previous command. If 3*time to run the status update is longer than 3000ms, the interval time is dynamically increased.
So normal one shot changes are detected about the same as now, but continuous changes are not updating so frequently, "git status" should not run continuously.

A few other changes like that the "next run" time could be overwritten by a time in the future and that retrieved "git status" data were not used if more file system changes were detected.

If "git status" requires more than 5s to run, the behavior is not improved. The counter in the Commit button should not be used then. Configurable time could improve (like longest of 5s and twice the time to run git status), configurable time is not going to be used.

There are situations where the "ignored files detection" is insufficient. See #4256 for a discussion.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Feb 1, 2018
Issue gitextensions#4256
Listing ignored files with a separate "ls-files -o -i --exclude-standard" seem to never exit in some situations, see gitextensions#4256
This reuses the git-status call with --ignored as an option to get the ignored files. (The option is only added when ls-files were called previously.) This call did not seem to hang with many ignored files and the command runtime does not increase much.

The solution is not optional though. It still lists all ignored files in memory. The time to find ignored files is faster, but a lot of memory is needed. gitextensions#4256 has some discussions.
Also, processing all output to GitStatusItem first before creating the HashSet will require some more memory (temporary) than required.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Feb 6, 2018
Issue gitextensions#4256
Listing ignored files with a separate "ls-files -o -i --exclude-standard" seem to never exit in some situations, see gitextensions#4256
This reuses the git-status call with --ignored as an option to get the ignored files. (The option is only added when ls-files were called previously.) This call did not seem to hang with many ignored files and the command runtime does not increase much.

The solution is not optional though. It still lists all ignored files in memory. The time to find ignored files is faster, but a lot of memory is needed. gitextensions#4256 has some discussions.
Also, processing all output to GitStatusItem first before creating the HashSet will require some more memory (temporary) than required.
drewnoakes added a commit to drewnoakes/gitextensions that referenced this issue Jul 25, 2018
Motivated by issue reported in gitextensions#4256. Relates to gitextensions#4753.
drewnoakes added a commit to drewnoakes/gitextensions that referenced this issue Jul 26, 2018
Motivated by issue reported in gitextensions#4256. Relates to gitextensions#4753.
@RussKie RussKie added the area: w10 Windows 10 specific label Sep 25, 2018
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Sep 26, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, do not check if update is required if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored takes longer times. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Sep 26, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, do not check if update is required if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored can takes significant time. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Sep 27, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, do not check if update is required if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored can takes significant time. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Sep 30, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, do not check if update is required if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored can takes significant time. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Oct 3, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, do not check if update is required if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored can takes significant time. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
gerhardol added a commit to gerhardol/gitextensions that referenced this issue Oct 5, 2018
fixes gitextensions#5439
fixes gitextensions#4256

partly based on gitextensions#5429
The handling was improved in gitextensions#4327, gitextensions#4328, fixing the regression
Those PRs limited the max load for git-status

Changes:
React faster on changing directory (1.0s->0.2s)
Some tweaks to the checks, disable file system monitoring temporary if an update is already scheduled

Do not read ignored files due to two problems:
 * Reading ignored can takes significant time. Since this was done the first time, the first update was delayed.
   (Reading ignored could be done later, but this will still delay the next update).
 * Saving all seen ignored files require substantial memory, see gitextensions#4256.
   The list could be limited (see the issue), but that will increase the test time for ignored files

As ignored files will now always trigger git-status may cause some more runs.
However, the ignored file list was never complete, the list was better over time,
so GE must be able to handle this load anyway.
@RussKie RussKie added this to the 3.00-beta2 milestone Oct 6, 2018
@dzmitry-lahoda
Copy link

I have similar issue on:

- Git Extensions 3.5.4.12724
- Build 65f01f39982ccb121c4df7d4b00b506939553958
- Git 2.34.1.windows.1
- Microsoft Windows NT 10.0.22000.0
- .NET Framework 4.8.4470.0
- DPI 144dpi (150% scaling)

i feel like issues happens when i have this issue https://stackoverflow.com/questions/26046698/git-refname-origin-master-is-ambiguous/26047558 . and I have seen it first time ever at same time I start getting above.

not sure if that is enough to create new issue. so I see status [status: more info requested](https://github.com/gitextensions/gitextensions/labels/status%3A%20more%20info%20requested) l

@RussKie
Copy link
Member

RussKie commented Feb 6, 2022

Please open a new issue with a repro. Though if it's something user-originated via the command line (like the referenced SO issue) I'm not sure what we can do...

@gerhardol
Copy link
Member

This is updated in master, in some situations where git-status was slow several parallel instances could start running. You would see several running git processes.

@dzmitry-lahoda
Copy link

yes, i did weird things with cli before trying to fix these with gitext. will try to get repro. i have seen enough gits running slowing down my PC with 16 physical theads.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants