Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
die_coolen_jungs
our_own_cloud_project
Commits
106b9eb5
Commit
106b9eb5
authored
Oct 29, 2014
by
Vincent Petry
Browse files
Merge pull request #11409 from owncloud/watcher-reuse
Pass the cached data to the filesystem watcher
parents
7d10ec41
16cfca6a
Changes
5
Hide whitespace changes
Inline
Side-by-side
apps/files_sharing/lib/cache.php
View file @
106b9eb5
...
...
@@ -145,26 +145,23 @@ class Shared_Cache extends Cache {
/**
* get the metadata of all files stored in $folder
*
* @param string $folder
* @param string $folder
Id
* @return array
*/
public
function
getFolderContents
(
$folder
)
{
if
(
$folder
===
false
)
{
$folder
=
''
;
}
$dir
=
(
$folder
!==
''
)
?
$folder
.
'/'
:
''
;
$cache
=
$this
->
getSourceCache
(
$folder
);
public
function
getFolderContentsById
(
$folderId
)
{
$cache
=
$this
->
getSourceCache
(
''
);
if
(
$cache
)
{
$parent
=
$this
->
storage
->
getFile
(
$folder
);
$sourceFolderContent
=
$cache
->
getFolderContents
(
$this
->
files
[
$folder
]);
foreach
(
$sourceFolderContent
as
$key
=>
$c
)
{
$sourceFolderContent
[
$key
][
'path'
]
=
$dir
.
$c
[
'name'
];
$sourceFolderContent
[
$key
][
'uid_owner'
]
=
$parent
[
'uid_owner'
];
$sourceFolderContent
[
$key
][
'displayname_owner'
]
=
\
OC_User
::
getDisplayName
(
$parent
[
'uid_owner'
]);
$sourceFolderContent
[
$key
][
'permissions'
]
=
$sourceFolderContent
[
$key
][
'permissions'
]
&
$this
->
storage
->
getPermissions
(
$dir
.
$c
[
'name'
]);
$owner
=
$this
->
storage
->
getSharedFrom
();
$parentPath
=
$this
->
getPathById
(
$folderId
);
if
(
$parentPath
!==
''
)
{
$parentPath
.
=
'/'
;
}
$sourceFolderContent
=
$cache
->
getFolderContentsById
(
$folderId
);
foreach
(
$sourceFolderContent
as
&
$c
)
{
$c
[
'path'
]
=
ltrim
(
$parentPath
.
$c
[
'name'
],
'/'
);
$c
[
'uid_owner'
]
=
$owner
;
$c
[
'displayname_owner'
]
=
\
OC_User
::
getDisplayName
(
$owner
);
$c
[
'permissions'
]
=
$c
[
'permissions'
]
&
$this
->
storage
->
getPermissions
(
false
);
}
return
$sourceFolderContent
;
...
...
apps/files_sharing/lib/watcher.php
View file @
106b9eb5
...
...
@@ -30,9 +30,11 @@ class Shared_Watcher extends Watcher {
* check $path for updates
*
* @param string $path
* @param array $cachedEntry
* @return boolean true if path was updated
*/
public
function
checkUpdate
(
$path
)
{
if
(
parent
::
checkUpdate
(
$path
)
===
true
)
{
public
function
checkUpdate
(
$path
,
$cachedEntry
=
null
)
{
if
(
parent
::
checkUpdate
(
$path
,
$cachedEntry
)
===
true
)
{
// since checkUpdate() has already updated the size of the subdirs,
// only apply the update to the owner's parent dirs
...
...
lib/private/files/cache/watcher.php
View file @
106b9eb5
...
...
@@ -55,11 +55,14 @@ class Watcher {
* check $path for updates
*
* @param string $path
* @return boolean|array true if path was updated, otherwise the cached data is returned
* @param array $cachedEntry
* @return boolean true if path was updated
*/
public
function
checkUpdate
(
$path
)
{
public
function
checkUpdate
(
$path
,
$cachedEntry
=
null
)
{
if
(
$this
->
watchPolicy
===
self
::
CHECK_ALWAYS
or
(
$this
->
watchPolicy
===
self
::
CHECK_ONCE
and
array_search
(
$path
,
$this
->
checkedPaths
)
===
false
))
{
$cachedEntry
=
$this
->
cache
->
get
(
$path
);
if
(
is_null
(
$cachedEntry
))
{
$cachedEntry
=
$this
->
cache
->
get
(
$path
);
}
$this
->
checkedPaths
[]
=
$path
;
if
(
$this
->
storage
->
hasUpdated
(
$path
,
$cachedEntry
[
'storage_mtime'
]))
{
if
(
$this
->
storage
->
is_dir
(
$path
))
{
...
...
@@ -73,7 +76,7 @@ class Watcher {
$this
->
cache
->
correctFolderSize
(
$path
);
return
true
;
}
return
$cachedEntry
;
return
false
;
}
else
{
return
false
;
}
...
...
lib/private/files/view.php
View file @
106b9eb5
...
...
@@ -313,7 +313,7 @@ class View {
if
(
!
$result
)
{
// If create file fails because of permissions on external storage like SMB folders,
// check file exists and return false if not.
if
(
!
$this
->
file_exists
(
$path
)){
if
(
!
$this
->
file_exists
(
$path
))
{
return
false
;
}
if
(
is_null
(
$mtime
))
{
...
...
@@ -891,22 +891,23 @@ class View {
if
(
$storage
)
{
$cache
=
$storage
->
getCache
(
$internalPath
);
if
(
!
$cache
->
inCache
(
$internalPath
))
{
$data
=
$cache
->
get
(
$internalPath
);
$watcher
=
$storage
->
getWatcher
(
$internalPath
);
// if the file is not in the cache or needs to be updated, trigger the scanner and reload the data
if
(
!
$data
)
{
if
(
!
$storage
->
file_exists
(
$internalPath
))
{
return
false
;
}
$scanner
=
$storage
->
getScanner
(
$internalPath
);
$scanner
->
scan
(
$internalPath
,
Cache\Scanner
::
SCAN_SHALLOW
);
}
else
{
$watcher
=
$storage
->
getWatcher
(
$internalPath
);
$data
=
$watcher
->
checkUpdate
(
$internalPath
);
}
if
(
!
is_array
(
$data
))
{
$data
=
$cache
->
get
(
$internalPath
);
}
else
if
(
$watcher
->
checkUpdate
(
$internalPath
,
$data
))
{
$data
=
$cache
->
get
(
$internalPath
);
}
if
(
$data
and
isset
(
$data
[
'fileid'
]))
{
// upgrades from oc6 or lower might not have the permissions set in the file cache
if
(
$data
[
'permissions'
]
===
0
)
{
$data
[
'permissions'
]
=
$storage
->
getPermissions
(
$data
[
'path'
]);
$cache
->
update
(
$data
[
'fileid'
],
array
(
'permissions'
=>
$data
[
'permissions'
]));
...
...
@@ -956,26 +957,32 @@ class View {
if
(
!
Filesystem
::
isValidPath
(
$directory
))
{
return
$result
;
}
$path
=
Filesystem
::
normalizePath
(
$this
->
fakeRoot
.
'/'
.
$directory
);
list
(
$storage
,
$internalPath
)
=
Filesystem
::
resolvePath
(
$path
);
$path
=
$this
->
getAbsolutePath
(
$directory
);
/** @var \OC\Files\Storage\Storage $storage */
list
(
$storage
,
$internalPath
)
=
$this
->
resolvePath
(
$directory
);
if
(
$storage
)
{
$cache
=
$storage
->
getCache
(
$internalPath
);
$user
=
\
OC_User
::
getUser
();
if
(
$cache
->
getStatus
(
$internalPath
)
<
Cache\Cache
::
COMPLETE
)
{
$data
=
$cache
->
get
(
$internalPath
);
$watcher
=
$storage
->
getWatcher
(
$internalPath
);
if
(
!
$data
or
$data
[
'size'
]
===
-
1
)
{
if
(
!
$storage
->
file_exists
(
$internalPath
))
{
return
array
();
}
$scanner
=
$storage
->
getScanner
(
$internalPath
);
$scanner
->
scan
(
$internalPath
,
Cache\Scanner
::
SCAN_SHALLOW
);
}
else
{
$watcher
=
$storage
->
getWatcher
(
$internalPath
);
$
w
atche
r
->
checkUpdate
(
$internalPath
);
$data
=
$cache
->
get
(
$internalPath
);
}
else
if
(
$watcher
->
checkUpdate
(
$internalPath
,
$data
))
{
$
d
at
a
=
$ca
che
->
get
(
$internalPath
);
}
$folderId
=
$
cache
->
getId
(
$internalPath
)
;
$folderId
=
$
data
[
'fileid'
]
;
/**
* @var \OC\Files\FileInfo[] $files
*/
$files
=
array
();
$contents
=
$cache
->
getFolderContents
(
$internalPath
,
$folderId
);
//TODO: mimetype_filter
$contents
=
$cache
->
getFolderContents
ById
(
$folderId
);
//TODO: mimetype_filter
foreach
(
$contents
as
$content
)
{
if
(
$content
[
'permissions'
]
===
0
)
{
$content
[
'permissions'
]
=
$storage
->
getPermissions
(
$content
[
'path'
]);
...
...
@@ -1032,7 +1039,7 @@ class View {
break
;
}
}
$rootEntry
[
'path'
]
=
substr
(
$path
.
'/'
.
$rootEntry
[
'name'
],
strlen
(
$user
)
+
2
);
// full path without /$user/
$rootEntry
[
'path'
]
=
substr
(
Filesystem
::
normalizePath
(
$path
.
'/'
.
$rootEntry
[
'name'
]
)
,
strlen
(
$user
)
+
2
);
// full path without /$user/
// if sharing was disabled for the user we remove the share permissions
if
(
\
OCP\Util
::
isSharingDisabledForUser
())
{
...
...
@@ -1213,7 +1220,7 @@ class View {
* @return string|null
*/
public
function
getPath
(
$id
)
{
$id
=
(
int
)
$id
;
$id
=
(
int
)
$id
;
$manager
=
Filesystem
::
getMountManager
();
$mounts
=
$manager
->
findIn
(
$this
->
fakeRoot
);
$mounts
[]
=
$manager
->
find
(
$this
->
fakeRoot
);
...
...
tests/lib/files/view.php
View file @
106b9eb5
...
...
@@ -177,8 +177,9 @@ class View extends \PHPUnit_Framework_TestCase {
function
testCacheIncompleteFolder
()
{
$storage1
=
$this
->
getTestStorage
(
false
);
\
OC\Files\Filesystem
::
mount
(
$storage1
,
array
(),
'/'
);
$rootView
=
new
\
OC\Files\View
(
''
);
\
OC\Files\Filesystem
::
clearMounts
();
\
OC\Files\Filesystem
::
mount
(
$storage1
,
array
(),
'/incomplete'
);
$rootView
=
new
\
OC\Files\View
(
'/incomplete'
);
$entries
=
$rootView
->
getDirectoryContent
(
'/'
);
$this
->
assertEquals
(
3
,
count
(
$entries
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment