Compare commits

..

No commits in common. "1e89141c18410a1ed37b694463a90a47d4a0acde" and "91b06a8be0c68f7d1dd26f40599132a930f2ac7f" have entirely different histories.

6 changed files with 27 additions and 46 deletions

@ -65,12 +65,12 @@ class DeleteOrphanedFilesTest extends TestCase {
return $query->executeQuery()->fetchAllAssociative();
}
protected function getMountsCount(int $storageId): int {
protected function getMounts(int $storageId): array {
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->count('*'))
$query->select('*')
->from('mounts')
->where($query->expr()->eq('storage_id', $query->createNamedParameter($storageId)));
return $query->executeQuery()->fetchOne();
return $query->executeQuery()->fetchAllAssociative();
}
/**
@ -96,12 +96,12 @@ class DeleteOrphanedFilesTest extends TestCase {
$numericStorageId = $fileInfo->getStorage()->getStorageCache()->getNumericId();
$this->assertCount(1, $this->getFile($fileInfo->getId()), 'Asserts that file is available');
$this->assertEquals(1, $this->getMountsCount($numericStorageId), 'Asserts that mount is available');
$this->assertCount(1, $this->getMounts($numericStorageId), 'Asserts that mount is available');
$this->command->execute($input, $output);
$this->assertCount(1, $this->getFile($fileInfo->getId()), 'Asserts that file is still available');
$this->assertEquals(1, $this->getMountsCount($numericStorageId), 'Asserts that mount is still available');
$this->assertCount(1, $this->getMounts($numericStorageId), 'Asserts that mount is still available');
$deletedRows = $this->connection->executeUpdate('DELETE FROM `*PREFIX*storages` WHERE `id` = ?', [$storageId]);
@ -125,7 +125,7 @@ class DeleteOrphanedFilesTest extends TestCase {
$this->command->execute($input, $output);
$this->assertCount(0, $this->getFile($fileInfo->getId()), 'Asserts that file gets cleaned up');
$this->assertEquals(0, $this->getMountsCount($numericStorageId), 'Asserts that mount gets cleaned up');
$this->assertCount(0, $this->getMounts($numericStorageId), 'Asserts that mount gets cleaned up');
// Rescan folder to add back to cache before deleting
$rootFolder->getUserFolder($this->user1)->getStorage()->getScanner()->scan('');

@ -186,6 +186,12 @@ class AddMissingIndicesListener implements IEventListener {
'mounts_class_index',
['mount_provider_class']
);
$event->addMissingIndex(
'mounts',
'mounts_user_root_path_index',
['user_id', 'root_id', 'mount_point'],
['lengths' => [null, null, 128]]
);
$event->addMissingIndex(
'systemtag_object_mapping',

@ -467,8 +467,16 @@ class UserMountCache implements IUserMountCache {
public function getUsedSpaceForUsers(array $users) {
$builder = $this->connection->getQueryBuilder();
$mountPointHashes = array_map(static fn (IUser $user) => hash('xxh128', '/' . $user->getUID() . '/'), $users);
$userIds = array_map(static fn (IUser $user) => $user->getUID(), $users);
$slash = $builder->createNamedParameter('/');
$mountPoint = $builder->func()->concat(
$builder->func()->concat($slash, 'user_id'),
$slash
);
$userIds = array_map(function (IUser $user) {
return $user->getUID();
}, $users);
$query = $builder->select('m.user_id', 'f.size')
->from('mounts', 'm')
@ -477,7 +485,7 @@ class UserMountCache implements IUserMountCache {
$builder->expr()->eq('m.storage_id', 'f.storage'),
$builder->expr()->eq('f.path_hash', $builder->createNamedParameter(md5('files')))
))
->where($builder->expr()->in('m.mount_point_hash', $builder->createNamedParameter($mountPointHashes, IQueryBuilder::PARAM_STR_ARRAY)))
->where($builder->expr()->eq('m.mount_point', $mountPoint))
->andWhere($builder->expr()->in('m.user_id', $builder->createNamedParameter($userIds, IQueryBuilder::PARAM_STR_ARRAY)));
$result = $query->executeQuery();

@ -22,7 +22,6 @@ use OC\DB\SchemaWrapper;
use OC\Migration\MetadataManager;
use OCP\App\AppPathNotFoundException;
use OCP\App\IAppManager;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\Migration\Attributes\AddColumn;
use OCP\Migration\Attributes\AddIndex;
@ -114,17 +113,6 @@ class MigrationsTest extends \Test\TestCase {
$this->db->expects($this->once())
->method('migrateToSchema');
$qb = $this->createMock(IQueryBuilder::class);
$qb
->expects($this->once())
->method('insert')
->willReturn($qb);
$this->db
->expects($this->once())
->method('getQueryBuilder')
->willReturn($qb);
$wrappedSchema = $this->createMock(Schema::class);
$wrappedSchema->expects($this->exactly(2))
->method('getTables')
@ -168,17 +156,6 @@ class MigrationsTest extends \Test\TestCase {
$this->db->expects($this->never())
->method('migrateToSchema');
$qb = $this->createMock(IQueryBuilder::class);
$qb
->expects($this->once())
->method('insert')
->willReturn($qb);
$this->db
->expects($this->once())
->method('getQueryBuilder')
->willReturn($qb);
$step = $this->createMock(IMigrationStep::class);
$step->expects($this->once())
->method('preSchemaChange');

@ -90,7 +90,6 @@ class PartitionedQueryBuilderTest extends TestCase {
'storage_id' => $query->createNamedParameter(1001001, IQueryBuilder::PARAM_INT),
'user_id' => $query->createNamedParameter('partitioned_test'),
'mount_point' => $query->createNamedParameter('/mount/point'),
'mount_point_hash' => $query->createNamedParameter(hash('xxh128', '/mount/point')),
'mount_provider_class' => $query->createNamedParameter('test'),
'root_id' => $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT),
]);
@ -139,7 +138,7 @@ class PartitionedQueryBuilderTest extends TestCase {
$builder->addPartition(new PartitionSplit('filecache', ['filecache']));
// query borrowed from UserMountCache
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_point_hash', 'mount_id', 'f.path', 'mount_provider_class')
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class')
->from('mounts', 'm')
->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid'))
->where($builder->expr()->eq('storage_id', $builder->createNamedParameter(1001001, IQueryBuilder::PARAM_INT)));
@ -152,7 +151,6 @@ class PartitionedQueryBuilderTest extends TestCase {
$this->assertCount(1, $results);
$this->assertEquals($results[0]['user_id'], 'partitioned_test');
$this->assertEquals($results[0]['mount_point'], '/mount/point');
$this->assertEquals($results[0]['mount_point_hash'], hash('xxh128', '/mount/point'));
$this->assertEquals($results[0]['mount_provider_class'], 'test');
$this->assertEquals($results[0]['path'], 'file1');
}
@ -161,7 +159,7 @@ class PartitionedQueryBuilderTest extends TestCase {
$builder = $this->getQueryBuilder();
$builder->addPartition(new PartitionSplit('filecache', ['filecache', 'filecache_extended']));
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_point_hash', 'mount_id', 'f.path', 'mount_provider_class', 'fe.upload_time')
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class', 'fe.upload_time')
->from('mounts', 'm')
->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid'))
->innerJoin('f', 'filecache_extended', 'fe', $builder->expr()->eq('f.fileid', 'fe.fileid'))
@ -175,7 +173,6 @@ class PartitionedQueryBuilderTest extends TestCase {
$this->assertCount(1, $results);
$this->assertEquals($results[0]['user_id'], 'partitioned_test');
$this->assertEquals($results[0]['mount_point'], '/mount/point');
$this->assertEquals($results[0]['mount_point_hash'], hash('xxh128', '/mount/point'));
$this->assertEquals($results[0]['mount_provider_class'], 'test');
$this->assertEquals($results[0]['path'], 'file1');
$this->assertEquals($results[0]['upload_time'], 1234);
@ -185,7 +182,7 @@ class PartitionedQueryBuilderTest extends TestCase {
$builder = $this->getQueryBuilder();
$builder->addPartition(new PartitionSplit('filecache', ['filecache']));
$query = $builder->select('storage', 'm.root_id', 'm.user_id', 'm.mount_point', 'm.mount_point_hash', 'm.mount_id', 'path', 'm.mount_provider_class')
$query = $builder->select('storage', 'm.root_id', 'm.user_id', 'm.mount_point', 'm.mount_id', 'path', 'm.mount_provider_class')
->from('filecache', 'f')
->innerJoin('f', 'mounts', 'm', $builder->expr()->eq('m.root_id', 'f.fileid'));
$query->where($builder->expr()->eq('storage', $builder->createNamedParameter(1001001, IQueryBuilder::PARAM_INT)));
@ -198,7 +195,6 @@ class PartitionedQueryBuilderTest extends TestCase {
$this->assertCount(1, $results);
$this->assertEquals($results[0]['user_id'], 'partitioned_test');
$this->assertEquals($results[0]['mount_point'], '/mount/point');
$this->assertEquals($results[0]['mount_point_hash'], hash('xxh128', '/mount/point'));
$this->assertEquals($results[0]['mount_provider_class'], 'test');
$this->assertEquals($results[0]['path'], 'file1');
}
@ -208,7 +204,7 @@ class PartitionedQueryBuilderTest extends TestCase {
$builder->addPartition(new PartitionSplit('filecache', ['filecache']));
// query borrowed from UserMountCache
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_point_hash', 'mount_id', 'f.path', 'mount_provider_class')
$query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point', 'mount_id', 'f.path', 'mount_provider_class')
->selectAlias('s.id', 'storage_string_id')
->from('mounts', 'm')
->innerJoin('m', 'filecache', 'f', $builder->expr()->eq('m.root_id', 'f.fileid'))
@ -223,7 +219,6 @@ class PartitionedQueryBuilderTest extends TestCase {
$this->assertCount(1, $results);
$this->assertEquals($results[0]['user_id'], 'partitioned_test');
$this->assertEquals($results[0]['mount_point'], '/mount/point');
$this->assertEquals($results[0]['mount_point_hash'], hash('xxh128', '/mount/point'));
$this->assertEquals($results[0]['mount_provider_class'], 'test');
$this->assertEquals($results[0]['path'], 'file1');
$this->assertEquals($results[0]['storage_string_id'], 'test1');

@ -62,7 +62,6 @@ class FileAccessTest extends TestCase {
'root_id' => $queryBuilder->createNamedParameter(10, IQueryBuilder::PARAM_INT),
'mount_provider_class' => $queryBuilder->createNamedParameter('TestProviderClass1'),
'mount_point' => $queryBuilder->createNamedParameter('/files'),
'mount_point_hash' => $queryBuilder->createNamedParameter(hash('xxh128', '/files')),
'user_id' => $queryBuilder->createNamedParameter('test'),
])
->executeStatement();
@ -73,7 +72,6 @@ class FileAccessTest extends TestCase {
'root_id' => $queryBuilder->createNamedParameter(30, IQueryBuilder::PARAM_INT),
'mount_provider_class' => $queryBuilder->createNamedParameter('TestProviderClass1'),
'mount_point' => $queryBuilder->createNamedParameter('/documents'),
'mount_point_hash' => $queryBuilder->createNamedParameter(hash('xxh128', '/documents')),
'user_id' => $queryBuilder->createNamedParameter('test'),
])
->executeStatement();
@ -84,7 +82,6 @@ class FileAccessTest extends TestCase {
'root_id' => $queryBuilder->createNamedParameter(31, IQueryBuilder::PARAM_INT),
'mount_provider_class' => $queryBuilder->createNamedParameter('TestProviderClass2'),
'mount_point' => $queryBuilder->createNamedParameter('/foobar'),
'mount_point_hash' => $queryBuilder->createNamedParameter(hash('xxh128', '/foobar')),
'user_id' => $queryBuilder->createNamedParameter('test'),
])
->executeStatement();
@ -150,7 +147,6 @@ class FileAccessTest extends TestCase {
'root_id' => $queryBuilder->createNamedParameter(40, IQueryBuilder::PARAM_INT),
'mount_provider_class' => $queryBuilder->createNamedParameter(LocalHomeMountProvider::class),
'mount_point' => $queryBuilder->createNamedParameter('/home/user'),
'mount_point_hash' => $queryBuilder->createNamedParameter(hash('xxh128', '/home/user')),
'user_id' => $queryBuilder->createNamedParameter('test'),
])
->executeStatement();
@ -163,7 +159,6 @@ class FileAccessTest extends TestCase {
'root_id' => $queryBuilder->createNamedParameter(41, IQueryBuilder::PARAM_INT),
'mount_provider_class' => $queryBuilder->createNamedParameter('TestMountProvider3'),
'mount_point' => $queryBuilder->createNamedParameter('/test/files/foobar'),
'mount_point_hash' => $queryBuilder->createNamedParameter(hash('xxh128', '/test/files/foobar')),
'user_id' => $queryBuilder->createNamedParameter('test'),
])
->executeStatement();