Skip to content

Commit 22ef74d

Browse files
committed
perf: don't needlessly call getFirstNodeById for every file during a propfind
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent 5fd50ab commit 22ef74d

2 files changed

Lines changed: 24 additions & 21 deletions

File tree

lib/DAV/LockPlugin.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ public function customProperties(PropFind $propFind, INode $node) {
103103

104104
$nodeId = $node->getId();
105105

106-
$propFind->handle(Application::DAV_PROPERTY_LOCK, function () use ($nodeId) {
107-
$lock = $this->lockService->getLockForNodeId($nodeId);
106+
$propFind->handle(Application::DAV_PROPERTY_LOCK, function () use ($nodeId, $node) {
107+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
108108
return $lock instanceof FileLock;
109109
});
110110

111-
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER, function () use ($nodeId) {
112-
$lock = $this->lockService->getLockForNodeId($nodeId);
111+
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER, function () use ($nodeId, $node) {
112+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
113113

114114
if ($lock === false) {
115115
return null;
@@ -122,8 +122,8 @@ public function customProperties(PropFind $propFind, INode $node) {
122122
return $lock->getOwner();
123123
});
124124

125-
$propFind->handle(Application::DAV_PROPERTY_LOCK_TIME, function () use ($nodeId) {
126-
$lock = $this->lockService->getLockForNodeId($nodeId);
125+
$propFind->handle(Application::DAV_PROPERTY_LOCK_TIME, function () use ($nodeId, $node) {
126+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
127127

128128
if ($lock === false) {
129129
return null;
@@ -132,8 +132,8 @@ public function customProperties(PropFind $propFind, INode $node) {
132132
return $lock->getCreatedAt();
133133
});
134134

135-
$propFind->handle(Application::DAV_PROPERTY_LOCK_TIMEOUT, function () use ($nodeId) {
136-
$lock = $this->lockService->getLockForNodeId($nodeId);
135+
$propFind->handle(Application::DAV_PROPERTY_LOCK_TIMEOUT, function () use ($nodeId, $node) {
136+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
137137

138138
if ($lock === false) {
139139
return null;
@@ -142,8 +142,8 @@ public function customProperties(PropFind $propFind, INode $node) {
142142
return $lock->getTimeout();
143143
});
144144

145-
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_DISPLAYNAME, function () use ($nodeId) {
146-
$lock = $this->lockService->getLockForNodeId($nodeId);
145+
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_DISPLAYNAME, function () use ($nodeId, $node) {
146+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
147147

148148
if ($lock === false) {
149149
return null;
@@ -154,8 +154,8 @@ public function customProperties(PropFind $propFind, INode $node) {
154154
return $lock->getDisplayName();
155155
});
156156

157-
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_TYPE, function () use ($nodeId) {
158-
$lock = $this->lockService->getLockForNodeId($nodeId);
157+
$propFind->handle(Application::DAV_PROPERTY_LOCK_OWNER_TYPE, function () use ($nodeId, $node) {
158+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
159159

160160
if ($lock === false) {
161161
return null;
@@ -164,17 +164,17 @@ public function customProperties(PropFind $propFind, INode $node) {
164164
return $lock->getType();
165165
});
166166

167-
$propFind->handle(Application::DAV_PROPERTY_LOCK_EDITOR, function () use ($nodeId) {
168-
$lock = $this->lockService->getLockForNodeId($nodeId);
167+
$propFind->handle(Application::DAV_PROPERTY_LOCK_EDITOR, function () use ($nodeId, $node) {
168+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
169169
if ($lock === false || $lock->getType() !== ILock::TYPE_APP) {
170170
return null;
171171
}
172172

173173
return $lock->getOwner();
174174
});
175175

176-
$propFind->handle(Application::DAV_PROPERTY_LOCK_TOKEN, function () use ($nodeId) {
177-
$lock = $this->lockService->getLockForNodeId($nodeId);
176+
$propFind->handle(Application::DAV_PROPERTY_LOCK_TOKEN, function () use ($nodeId, $node) {
177+
$lock = $this->lockService->getLockForNodeId($nodeId, $node->getNode());
178178
if ($lock === false) {
179179
return null;
180180
}

lib/Service/LockService.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use OCP\Files\Lock\ILock;
2727
use OCP\Files\Lock\LockContext;
2828
use OCP\Files\Lock\OwnerLockedException;
29+
use OCP\Files\Node;
2930
use OCP\Files\NotFoundException;
3031
use OCP\IL10N;
3132
use OCP\IRequest;
@@ -88,15 +89,15 @@ public function __construct(
8889
*
8990
* @return FileLock|bool
9091
*/
91-
public function getLockForNodeId(int $nodeId) {
92+
public function getLockForNodeId(int $nodeId, ?Node $node = null) {
9293
if (array_key_exists($nodeId, $this->lockCache) && $this->lockCache[$nodeId] !== null) {
9394
return $this->lockCache[$nodeId];
9495
}
9596

9697
try {
9798
$this->lockCache[$nodeId] = $this->getLockFromFileId($nodeId);
9899
} catch (LockNotFoundException) {
99-
$remoteLock = $this->getRemoteLockFromDav($nodeId);
100+
$remoteLock = $this->getRemoteLockFromDav($nodeId, $node);
100101
$this->lockCache[$nodeId] = $remoteLock ?: false;
101102
}
102103

@@ -399,15 +400,17 @@ function (FileLock $lock) {
399400
$this->locksRequest->removeIds($ids);
400401
}
401402

402-
public function getRemoteLockFromDav(int $nodeId): ?FileLock {
403+
public function getRemoteLockFromDav(int $nodeId, ?Node $node = null): ?FileLock {
403404
try {
404405
$user = $this->userSession->getUser();
405406
if (!$user) {
406407
return null;
407408
}
408409

409-
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
410-
$node = $userFolder->getFirstNodeById($nodeId);
410+
if (!$node) {
411+
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
412+
$node = $userFolder->getFirstNodeById($nodeId);
413+
}
411414
if (empty($node)) {
412415
return null;
413416
}

0 commit comments

Comments
 (0)