@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Prevent interruption by the PHP "set_time_limit()" mechanism while holding the durable write lock

Summary:
Ref T13590. By default, PHP kills execution after web scripts run for 30 seconds. If this occurs in the locked section of a repository write while we're holding the durable write lock, the lock will get stuck.

Use "set_time_limit(0)" to prevent this mechanism from interrupting execution while the durable lock is held.

Test Plan:
- Added "set_time_limit(1)" before the lock and "while (1);" in the critical section of the lock.
- Pushed, got the lock stuck.
- Cleared the lock, applied this patch, pushed.
- Got an infinite hang instead. (Normally, we expect the script to take more than 30 seconds to execute because there is a large push that executes in finite time, not because there's an infinte loop.)

Maniphest Tasks: T13590

Differential Revision: https://secure.phabricator.com/D21526

+5
+5
src/applications/diffusion/protocol/DiffusionRepositoryClusterEngine.php
··· 318 318 'Acquiring write lock for repository "%s"...', 319 319 $repository->getDisplayName())); 320 320 321 + // See T13590. On the HTTP pathway, it's possible for us to hit the script 322 + // time limit while holding the durable write lock if a user makes a big 323 + // push. Remove the time limit before we acquire the durable lock. 324 + set_time_limit(0); 325 + 321 326 $lock_wait = phutil_units('2 minutes in seconds'); 322 327 try { 323 328 $write_wait_start = microtime(true);