]> source.dussan.org Git - nextcloud-server.git/commitdiff
cache the verification of the share mountpoint 32075/head
authorRobin Appelman <robin@icewind.nl>
Thu, 21 Apr 2022 15:43:51 +0000 (17:43 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 22 Apr 2022 12:40:48 +0000 (12:40 +0000)
after the initial verification this can only really be invalidated by a system mount (external/group/etc) being created at the share target since any normal file/folder creation will already conflict with the share

Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/files_sharing/lib/MountProvider.php
apps/files_sharing/lib/SharedMount.php
apps/files_sharing/tests/MountProviderTest.php

index 27edf5074e1c878c2d204c2a1a095ead629d7895..bfb403876220361f680a417dadaf9907b9c132e9 100644 (file)
@@ -34,6 +34,7 @@ use OCA\Files_Sharing\Event\ShareMountedEvent;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\Config\IMountProvider;
 use OCP\Files\Storage\IStorageFactory;
+use OCP\ICacheFactory;
 use OCP\IConfig;
 use OCP\ILogger;
 use OCP\IUser;
@@ -59,6 +60,9 @@ class MountProvider implements IMountProvider {
        /** @var IEventDispatcher */
        protected $eventDispatcher;
 
+       /** @var ICacheFactory */
+       protected $cacheFactory;
+
        /**
         * @param \OCP\IConfig $config
         * @param IManager $shareManager
@@ -68,12 +72,14 @@ class MountProvider implements IMountProvider {
                IConfig $config,
                IManager $shareManager,
                ILogger $logger,
-               IEventDispatcher $eventDispatcher
+               IEventDispatcher $eventDispatcher,
+               ICacheFactory $cacheFactory
        ) {
                $this->config = $config;
                $this->shareManager = $shareManager;
                $this->logger = $logger;
                $this->eventDispatcher = $eventDispatcher;
+               $this->cacheFactory = $cacheFactory;
        }
 
 
@@ -136,7 +142,8 @@ class MountProvider implements IMountProvider {
                                        $view,
                                        $foldersExistCache,
                                        $this->eventDispatcher,
-                                       $user
+                                       $user,
+                                       $this->cacheFactory->createLocal('share-valid-mountpoint')
                                );
 
                                $event = new ShareMountedEvent($mount);
index 60361e25fd023b1db201b45f085c8dc4f30abcd8..398da5eaf23906a74d7864b92f8b8e4436730b8b 100644 (file)
@@ -26,6 +26,7 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>
  *
  */
+
 namespace OCA\Files_Sharing;
 
 use OC\Cache\CappedMemoryCache;
@@ -36,6 +37,7 @@ use OC\Files\View;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\Events\InvalidateMountCacheEvent;
 use OCP\Files\Storage\IStorageFactory;
+use OCP\ICache;
 use OCP\IUser;
 use OCP\Share\Events\VerifyMountPointEvent;
 
@@ -63,6 +65,8 @@ class SharedMount extends MountPoint implements MoveableMount {
 
        private IEventDispatcher $eventDispatcher;
 
+       private ICache $cache;
+
        public function __construct(
                $storage,
                array $mountpoints,
@@ -71,11 +75,13 @@ class SharedMount extends MountPoint implements MoveableMount {
                View $recipientView,
                CappedMemoryCache $folderExistCache,
                IEventDispatcher $eventDispatcher,
-               IUser $user
+               IUser $user,
+               ICache $cache
        ) {
                $this->user = $user;
                $this->recipientView = $recipientView;
                $this->eventDispatcher = $eventDispatcher;
+               $this->cache = $cache;
 
                $this->superShare = $arguments['superShare'];
                $this->groupedShares = $arguments['groupedShares'];
@@ -92,7 +98,17 @@ class SharedMount extends MountPoint implements MoveableMount {
         * @param SharedMount[] $mountpoints
         * @return string
         */
-       private function verifyMountPoint(\OCP\Share\IShare $share, array $mountpoints, CappedMemoryCache $folderExistCache) {
+       private function verifyMountPoint(
+               \OCP\Share\IShare $share,
+               array $mountpoints,
+               CappedMemoryCache $folderExistCache
+       ) {
+               $cacheKey = $this->user->getUID() . '/' . $share->getTarget();
+               $cached = $this->cache->get($cacheKey);
+               if ($cached !== null) {
+                       return $cached;
+               }
+
                $mountPoint = basename($share->getTarget());
                $parent = dirname($share->getTarget());
 
@@ -120,6 +136,8 @@ class SharedMount extends MountPoint implements MoveableMount {
                        $this->updateFileTarget($newMountPoint, $share);
                }
 
+               $this->cache->set($cacheKey, $newMountPoint, 60 * 60);
+
                return $newMountPoint;
        }
 
index 756c6f95d4252f10cfd7a03f1eb8fa811590b05b..00ae847eaac85901a1ab65a7aecae7eefd8b9888 100644 (file)
  */
 namespace OCA\Files_Sharing\Tests;
 
+use OC\Memcache\NullCache;
 use OCA\Files_Sharing\MountProvider;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\IRootFolder;
 use OCP\Files\Storage\IStorageFactory;
+use OCP\ICacheFactory;
 use OCP\IConfig;
 use OCP\ILogger;
 use OCP\IUser;
@@ -72,8 +74,11 @@ class MountProviderTest extends \Test\TestCase {
                $this->shareManager = $this->getMockBuilder(IManager::class)->getMock();
                $this->logger = $this->getMockBuilder(ILogger::class)->getMock();
                $eventDispatcher = $this->createMock(IEventDispatcher::class);
+               $cacheFactory = $this->createMock(ICacheFactory::class);
+               $cacheFactory->method('createLocal')
+                       ->willReturn(new NullCache());
 
-               $this->provider = new MountProvider($this->config, $this->shareManager, $this->logger, $eventDispatcher);
+               $this->provider = new MountProvider($this->config, $this->shareManager, $this->logger, $eventDispatcher, $cacheFactory);
        }
 
        private function makeMockShare($id, $nodeId, $owner = 'user2', $target = null, $permissions = 31) {