mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-23 18:15:53 +03:00
Keep track of last access time for local media
This commit is contained in:
parent
3cb2dabaad
commit
05f98a2224
4 changed files with 65 additions and 11 deletions
|
@ -53,7 +53,7 @@ import urlparse
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
UPDATE_RECENTLY_ACCESSED_REMOTES_TS = 60 * 1000
|
UPDATE_RECENTLY_ACCESSED_TS = 60 * 1000
|
||||||
|
|
||||||
|
|
||||||
class MediaRepository(object):
|
class MediaRepository(object):
|
||||||
|
@ -75,6 +75,7 @@ class MediaRepository(object):
|
||||||
self.remote_media_linearizer = Linearizer(name="media_remote")
|
self.remote_media_linearizer = Linearizer(name="media_remote")
|
||||||
|
|
||||||
self.recently_accessed_remotes = set()
|
self.recently_accessed_remotes = set()
|
||||||
|
self.recently_accessed_locals = set()
|
||||||
|
|
||||||
# List of StorageProviders where we should search for media and
|
# List of StorageProviders where we should search for media and
|
||||||
# potentially upload to.
|
# potentially upload to.
|
||||||
|
@ -99,19 +100,34 @@ class MediaRepository(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.clock.looping_call(
|
self.clock.looping_call(
|
||||||
self._update_recently_accessed_remotes,
|
self._update_recently_accessed,
|
||||||
UPDATE_RECENTLY_ACCESSED_REMOTES_TS
|
UPDATE_RECENTLY_ACCESSED_TS,
|
||||||
)
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _update_recently_accessed_remotes(self):
|
def _update_recently_accessed(self):
|
||||||
media = self.recently_accessed_remotes
|
remote_media = self.recently_accessed_remotes
|
||||||
self.recently_accessed_remotes = set()
|
self.recently_accessed_remotes = set()
|
||||||
|
|
||||||
|
local_media = self.recently_accessed_locals
|
||||||
|
self.recently_accessed_locals = set()
|
||||||
|
|
||||||
yield self.store.update_cached_last_access_time(
|
yield self.store.update_cached_last_access_time(
|
||||||
media, self.clock.time_msec()
|
local_media, remote_media, self.clock.time_msec()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def mark_recently_accessed(self, server_name, media_id):
|
||||||
|
"""Mark the given media as recently accessed.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
server_name (str|None): Origin server of media, or None if local
|
||||||
|
media_id (str): The media ID of the content
|
||||||
|
"""
|
||||||
|
if server_name:
|
||||||
|
self.recently_accessed_remotes.add((server_name, media_id))
|
||||||
|
else:
|
||||||
|
self.recently_accessed_locals.add(media_id)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def create_content(self, media_type, upload_name, content, content_length,
|
def create_content(self, media_type, upload_name, content, content_length,
|
||||||
auth_user):
|
auth_user):
|
||||||
|
@ -173,6 +189,8 @@ class MediaRepository(object):
|
||||||
respond_404(request)
|
respond_404(request)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.mark_recently_accessed(None, media_id)
|
||||||
|
|
||||||
media_type = media_info["media_type"]
|
media_type = media_info["media_type"]
|
||||||
media_length = media_info["media_length"]
|
media_length = media_info["media_length"]
|
||||||
upload_name = name if name else media_info["upload_name"]
|
upload_name = name if name else media_info["upload_name"]
|
||||||
|
@ -204,7 +222,7 @@ class MediaRepository(object):
|
||||||
Deferred: Resolves once a response has successfully been written
|
Deferred: Resolves once a response has successfully been written
|
||||||
to request
|
to request
|
||||||
"""
|
"""
|
||||||
self.recently_accessed_remotes.add((server_name, media_id))
|
self.mark_recently_accessed(server_name, media_id)
|
||||||
|
|
||||||
# We linearize here to ensure that we don't try and download remote
|
# We linearize here to ensure that we don't try and download remote
|
||||||
# media multiple times concurrently
|
# media multiple times concurrently
|
||||||
|
|
|
@ -173,7 +173,14 @@ class MediaRepositoryStore(BackgroundUpdateStore):
|
||||||
desc="store_cached_remote_media",
|
desc="store_cached_remote_media",
|
||||||
)
|
)
|
||||||
|
|
||||||
def update_cached_last_access_time(self, origin_id_tuples, time_ts):
|
def update_cached_last_access_time(self, local_media, remote_media, time_ms):
|
||||||
|
"""Updates the last access time of the given media
|
||||||
|
|
||||||
|
Args:
|
||||||
|
local_media (iterable[str]): Set of media_ids
|
||||||
|
remote_media (iterable[(str, str)]): Set of (server_name, media_id)
|
||||||
|
time_ms: Current time in milliseconds
|
||||||
|
"""
|
||||||
def update_cache_txn(txn):
|
def update_cache_txn(txn):
|
||||||
sql = (
|
sql = (
|
||||||
"UPDATE remote_media_cache SET last_access_ts = ?"
|
"UPDATE remote_media_cache SET last_access_ts = ?"
|
||||||
|
@ -181,8 +188,18 @@ class MediaRepositoryStore(BackgroundUpdateStore):
|
||||||
)
|
)
|
||||||
|
|
||||||
txn.executemany(sql, (
|
txn.executemany(sql, (
|
||||||
(time_ts, media_origin, media_id)
|
(time_ms, media_origin, media_id)
|
||||||
for media_origin, media_id in origin_id_tuples
|
for media_origin, media_id in remote_media
|
||||||
|
))
|
||||||
|
|
||||||
|
sql = (
|
||||||
|
"UPDATE local_media_repository SET last_access_ts = ?"
|
||||||
|
" WHERE media_id = ?"
|
||||||
|
)
|
||||||
|
|
||||||
|
txn.executemany(sql, (
|
||||||
|
(time_ms, media_id)
|
||||||
|
for media_id in local_media
|
||||||
))
|
))
|
||||||
|
|
||||||
return self.runInteraction("update_cached_last_access_time", update_cache_txn)
|
return self.runInteraction("update_cached_last_access_time", update_cache_txn)
|
||||||
|
|
|
@ -25,7 +25,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Remember to update this number every time a change is made to database
|
# Remember to update this number every time a change is made to database
|
||||||
# schema files, so the users will be informed on server restarts.
|
# schema files, so the users will be informed on server restarts.
|
||||||
SCHEMA_VERSION = 46
|
SCHEMA_VERSION = 47
|
||||||
|
|
||||||
dir_path = os.path.abspath(os.path.dirname(__file__))
|
dir_path = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
|
19
synapse/storage/schema/delta/47/last_access_media.sql
Normal file
19
synapse/storage/schema/delta/47/last_access_media.sql
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/* Copyright 2018 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
-- drop the unique constraint on deleted_pushers so that we can just insert
|
||||||
|
-- into it rather than upserting.
|
||||||
|
|
||||||
|
ALTER TABLE local_media_repository ADD COLUMN last_access_ts BIGINT;
|
Loading…
Reference in a new issue