1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-19 03:50:54 +01:00

Make HandlePool resistant to reentrant calls

Conpherence thread handles need to load other handles in order to load. Currently, HandlePool can loop when reentered. Instead, clear the on-deck list before querying so that reentering it will query for only new handles, not reissue queries for in-flight handles.

Auditors: btrahan
This commit is contained in:
epriestley 2015-05-09 13:46:42 -07:00
parent 8b7a4670f8
commit 347dabbbd6

View file

@ -61,12 +61,17 @@ final class PhabricatorHandlePool extends Phobject {
// If we need any handles, bulk load everything in the queue. // If we need any handles, bulk load everything in the queue.
if ($need) { if ($need) {
// Clear the list of PHIDs that need to be loaded before performing the
// actual fetch. This prevents us from looping if we need to reenter the
// HandlePool while loading handles.
$fetch_phids = array_keys($this->unloadedPHIDs);
$this->unloadedPHIDs = array();
$handles = id(new PhabricatorHandleQuery()) $handles = id(new PhabricatorHandleQuery())
->setViewer($this->getViewer()) ->setViewer($this->getViewer())
->withPHIDs(array_keys($this->unloadedPHIDs)) ->withPHIDs($fetch_phids)
->execute(); ->execute();
$this->handles += $handles; $this->handles += $handles;
$this->unloadedPHIDs = array();
} }
return array_select_keys($this->handles, $phids); return array_select_keys($this->handles, $phids);