{"record":{"id":"1c40d959928cccf1","repo":"phacility/phabricator","slug":"another-process-is-currently-updating-repository","errorCode":null,"errorMessage":"Another process is currently updating repository \"%s\", skipping pull.","messagePattern":"Another process is currently updating repository \"(.+?)\", skipping pull\\.","errorType":"exception","errorClass":"DiffusionDaemonLockException","httpStatus":null,"severity":"warning","filePath":"src/applications/repository/engine/PhabricatorRepositoryPullEngine.php","lineNumber":32,"sourceCode":" * @task svn      Pulling Subversion Working Copies\n * @task internal Internals\n */\nfinal class PhabricatorRepositoryPullEngine\n  extends PhabricatorRepositoryEngine {\n\n\n/* -(  Pulling Working Copies  )--------------------------------------------- */\n\n\n  public function pullRepository() {\n    $repository = $this->getRepository();\n\n    $lock = $this->newRepositoryLock($repository, 'repo.pull', true);\n\n    try {\n      $lock->lock();\n    } catch (PhutilLockException $ex) {\n      throw new DiffusionDaemonLockException(\n        pht(\n          'Another process is currently updating repository \"%s\", '.\n          'skipping pull.',\n          $repository->getDisplayName()));\n    }\n\n    try {\n      $result = $this->pullRepositoryWithLock();\n    } catch (Exception $ex) {\n      $lock->unlock();\n      throw $ex;\n    }\n\n    $lock->unlock();\n\n    return $result;\n  }\n","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/phacility/phabricator/blob/5720a38cfe95b00ca4be5016dd0d2f3195f4fa04/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php#L14-L50","documentation":"Thrown by PhabricatorRepositoryPullEngine::pullRepository() when the per-repository repo.pull lock cannot be acquired because another process is already pulling this repository. Pulls are serialized per repository so two processes never write the same working copy concurrently; on contention the engine throws DiffusionDaemonLockException so the caller (pull daemon or task worker) skips this round and retries later.","triggerScenarios":"A pull task for the repository still in flight when another task for the same repository starts; manual 'bin/repository pull' racing the daemon; slow pulls on large repos or high-latency networks widening the overlap window; stale lock from a killed pull process.","commonSituations":"Very large repositories whose pulls outlast the scheduling interval; administrators manually pulling to debug while daemons run; lingering worker processes after a phd restart.","solutions":["Treat as transient in daemon logs; the next pull cycle retries automatically","Check 'phd status' and running processes for a pull of the same repository that is still active or hung","If a pull is hung (large repo, slow network), let it finish or terminate it cleanly, then retry","Restart daemons with 'phd restart' if a stale lock is suspected"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  id(new PhabricatorRepositoryPullEngine())\n    ->setRepository($repository)\n    ->pullRepository();\n} catch (DiffusionDaemonLockException $ex) {\n  // repo.pull held elsewhere; skip and let the next cycle retry\n  return;\n}","preventionTips":["Avoid manual 'bin/repository pull' while pull daemons run","For very large repos, expect long pull windows and tolerate lock skips","Use 'phd restart' after killing workers to clear stale pull locks"],"tags":["phabricator","repository","pull","lock","daemon"],"backgroundTag":"lock-contention","analyzedSha":"5720a38cfe95b00ca4be5016dd0d2f3195f4fa04","analyzedAt":"2026-08-21T05:07:25.672Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}