mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-25 08:12:40 +01:00
Fix a slow memory leak in long-lived FutureIterator objects, as used by FuturePool
Summary: See T13572. FutureIterator does not release futures, so long-lived iterators (like the one that FuturePool may build) can end up leaking memory. This affects the FuturePool used by the daemon overseer. See T13572 for more discussion. Test Plan: - Ran the simple FutureIterator script from T13572. Before: memory held during iteration, script grows without bound. After: memory released, script uses stable memory. - Ran the overseer with memory logging and an immediate wakeup from hibernation. Before: saw memory usage grow without bound at a rate of ~300MB/day. After: saw memory usage stable. Differential Revision: https://secure.phabricator.com/D21466
This commit is contained in:
parent
de209ec064
commit
8e5e49984d
1 changed files with 8 additions and 1 deletions
|
@ -194,7 +194,14 @@ final class FutureIterator
|
||||||
* @task iterator
|
* @task iterator
|
||||||
*/
|
*/
|
||||||
public function next() {
|
public function next() {
|
||||||
$this->key = null;
|
// See T13572. If we preivously resolved and returned a Future, release
|
||||||
|
// it now. This prevents us from holding Futures indefinitely when callers
|
||||||
|
// like FuturePool build long-lived iterators and keep adding new Futures
|
||||||
|
// to them.
|
||||||
|
if ($this->key !== null) {
|
||||||
|
unset($this->futures[$this->key]);
|
||||||
|
$this->key = null;
|
||||||
|
}
|
||||||
|
|
||||||
$this->updateWorkingSet();
|
$this->updateWorkingSet();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue