Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit caec7d4

Browse files
authored
Convert some of the media REST code to async/await (#7110)
1 parent c2db659 commit caec7d4

File tree

4 files changed

+91
-111
lines changed

4 files changed

+91
-111
lines changed

changelog.d/7110.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Convert some of synapse.rest.media to async/await.

synapse/rest/media/v1/media_repository.py

Lines changed: 49 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import twisted.internet.error
2626
import twisted.web.http
27-
from twisted.internet import defer
2827
from twisted.web.resource import Resource
2928

3029
from synapse.api.errors import (
@@ -114,15 +113,14 @@ def _start_update_recently_accessed(self):
114113
"update_recently_accessed_media", self._update_recently_accessed
115114
)
116115

117-
@defer.inlineCallbacks
118-
def _update_recently_accessed(self):
116+
async def _update_recently_accessed(self):
119117
remote_media = self.recently_accessed_remotes
120118
self.recently_accessed_remotes = set()
121119

122120
local_media = self.recently_accessed_locals
123121
self.recently_accessed_locals = set()
124122

125-
yield self.store.update_cached_last_access_time(
123+
await self.store.update_cached_last_access_time(
126124
local_media, remote_media, self.clock.time_msec()
127125
)
128126

@@ -138,8 +136,7 @@ def mark_recently_accessed(self, server_name, media_id):
138136
else:
139137
self.recently_accessed_locals.add(media_id)
140138

141-
@defer.inlineCallbacks
142-
def create_content(
139+
async def create_content(
143140
self, media_type, upload_name, content, content_length, auth_user
144141
):
145142
"""Store uploaded content for a local user and return the mxc URL
@@ -158,11 +155,11 @@ def create_content(
158155

159156
file_info = FileInfo(server_name=None, file_id=media_id)
160157

161-
fname = yield self.media_storage.store_file(content, file_info)
158+
fname = await self.media_storage.store_file(content, file_info)
162159

163160
logger.info("Stored local media in file %r", fname)
164161

165-
yield self.store.store_local_media(
162+
await self.store.store_local_media(
166163
media_id=media_id,
167164
media_type=media_type,
168165
time_now_ms=self.clock.time_msec(),
@@ -171,12 +168,11 @@ def create_content(
171168
user_id=auth_user,
172169
)
173170

174-
yield self._generate_thumbnails(None, media_id, media_id, media_type)
171+
await self._generate_thumbnails(None, media_id, media_id, media_type)
175172

176173
return "mxc://%s/%s" % (self.server_name, media_id)
177174

178-
@defer.inlineCallbacks
179-
def get_local_media(self, request, media_id, name):
175+
async def get_local_media(self, request, media_id, name):
180176
"""Responds to reqests for local media, if exists, or returns 404.
181177
182178
Args:
@@ -190,7 +186,7 @@ def get_local_media(self, request, media_id, name):
190186
Deferred: Resolves once a response has successfully been written
191187
to request
192188
"""
193-
media_info = yield self.store.get_local_media(media_id)
189+
media_info = await self.store.get_local_media(media_id)
194190
if not media_info or media_info["quarantined_by"]:
195191
respond_404(request)
196192
return
@@ -204,13 +200,12 @@ def get_local_media(self, request, media_id, name):
204200

205201
file_info = FileInfo(None, media_id, url_cache=url_cache)
206202

207-
responder = yield self.media_storage.fetch_media(file_info)
208-
yield respond_with_responder(
203+
responder = await self.media_storage.fetch_media(file_info)
204+
await respond_with_responder(
209205
request, responder, media_type, media_length, upload_name
210206
)
211207

212-
@defer.inlineCallbacks
213-
def get_remote_media(self, request, server_name, media_id, name):
208+
async def get_remote_media(self, request, server_name, media_id, name):
214209
"""Respond to requests for remote media.
215210
216211
Args:
@@ -236,8 +231,8 @@ def get_remote_media(self, request, server_name, media_id, name):
236231
# We linearize here to ensure that we don't try and download remote
237232
# media multiple times concurrently
238233
key = (server_name, media_id)
239-
with (yield self.remote_media_linearizer.queue(key)):
240-
responder, media_info = yield self._get_remote_media_impl(
234+
with (await self.remote_media_linearizer.queue(key)):
235+
responder, media_info = await self._get_remote_media_impl(
241236
server_name, media_id
242237
)
243238

@@ -246,14 +241,13 @@ def get_remote_media(self, request, server_name, media_id, name):
246241
media_type = media_info["media_type"]
247242
media_length = media_info["media_length"]
248243
upload_name = name if name else media_info["upload_name"]
249-
yield respond_with_responder(
244+
await respond_with_responder(
250245
request, responder, media_type, media_length, upload_name
251246
)
252247
else:
253248
respond_404(request)
254249

255-
@defer.inlineCallbacks
256-
def get_remote_media_info(self, server_name, media_id):
250+
async def get_remote_media_info(self, server_name, media_id):
257251
"""Gets the media info associated with the remote file, downloading
258252
if necessary.
259253
@@ -274,8 +268,8 @@ def get_remote_media_info(self, server_name, media_id):
274268
# We linearize here to ensure that we don't try and download remote
275269
# media multiple times concurrently
276270
key = (server_name, media_id)
277-
with (yield self.remote_media_linearizer.queue(key)):
278-
responder, media_info = yield self._get_remote_media_impl(
271+
with (await self.remote_media_linearizer.queue(key)):
272+
responder, media_info = await self._get_remote_media_impl(
279273
server_name, media_id
280274
)
281275

@@ -286,8 +280,7 @@ def get_remote_media_info(self, server_name, media_id):
286280

287281
return media_info
288282

289-
@defer.inlineCallbacks
290-
def _get_remote_media_impl(self, server_name, media_id):
283+
async def _get_remote_media_impl(self, server_name, media_id):
291284
"""Looks for media in local cache, if not there then attempt to
292285
download from remote server.
293286
@@ -299,7 +292,7 @@ def _get_remote_media_impl(self, server_name, media_id):
299292
Returns:
300293
Deferred[(Responder, media_info)]
301294
"""
302-
media_info = yield self.store.get_cached_remote_media(server_name, media_id)
295+
media_info = await self.store.get_cached_remote_media(server_name, media_id)
303296

304297
# file_id is the ID we use to track the file locally. If we've already
305298
# seen the file then reuse the existing ID, otherwise genereate a new
@@ -317,19 +310,18 @@ def _get_remote_media_impl(self, server_name, media_id):
317310
logger.info("Media is quarantined")
318311
raise NotFoundError()
319312

320-
responder = yield self.media_storage.fetch_media(file_info)
313+
responder = await self.media_storage.fetch_media(file_info)
321314
if responder:
322315
return responder, media_info
323316

324317
# Failed to find the file anywhere, lets download it.
325318

326-
media_info = yield self._download_remote_file(server_name, media_id, file_id)
319+
media_info = await self._download_remote_file(server_name, media_id, file_id)
327320

328-
responder = yield self.media_storage.fetch_media(file_info)
321+
responder = await self.media_storage.fetch_media(file_info)
329322
return responder, media_info
330323

331-
@defer.inlineCallbacks
332-
def _download_remote_file(self, server_name, media_id, file_id):
324+
async def _download_remote_file(self, server_name, media_id, file_id):
333325
"""Attempt to download the remote file from the given server name,
334326
using the given file_id as the local id.
335327
@@ -351,7 +343,7 @@ def _download_remote_file(self, server_name, media_id, file_id):
351343
("/_matrix/media/v1/download", server_name, media_id)
352344
)
353345
try:
354-
length, headers = yield self.client.get_file(
346+
length, headers = await self.client.get_file(
355347
server_name,
356348
request_path,
357349
output_stream=f,
@@ -397,15 +389,15 @@ def _download_remote_file(self, server_name, media_id, file_id):
397389
)
398390
raise SynapseError(502, "Failed to fetch remote media")
399391

400-
yield finish()
392+
await finish()
401393

402394
media_type = headers[b"Content-Type"][0].decode("ascii")
403395
upload_name = get_filename_from_headers(headers)
404396
time_now_ms = self.clock.time_msec()
405397

406398
logger.info("Stored remote media in file %r", fname)
407399

408-
yield self.store.store_cached_remote_media(
400+
await self.store.store_cached_remote_media(
409401
origin=server_name,
410402
media_id=media_id,
411403
media_type=media_type,
@@ -423,7 +415,7 @@ def _download_remote_file(self, server_name, media_id, file_id):
423415
"filesystem_id": file_id,
424416
}
425417

426-
yield self._generate_thumbnails(server_name, media_id, file_id, media_type)
418+
await self._generate_thumbnails(server_name, media_id, file_id, media_type)
427419

428420
return media_info
429421

@@ -458,16 +450,15 @@ def _generate_thumbnail(self, thumbnailer, t_width, t_height, t_method, t_type):
458450

459451
return t_byte_source
460452

461-
@defer.inlineCallbacks
462-
def generate_local_exact_thumbnail(
453+
async def generate_local_exact_thumbnail(
463454
self, media_id, t_width, t_height, t_method, t_type, url_cache
464455
):
465-
input_path = yield self.media_storage.ensure_media_is_in_local_cache(
456+
input_path = await self.media_storage.ensure_media_is_in_local_cache(
466457
FileInfo(None, media_id, url_cache=url_cache)
467458
)
468459

469460
thumbnailer = Thumbnailer(input_path)
470-
t_byte_source = yield defer_to_thread(
461+
t_byte_source = await defer_to_thread(
471462
self.hs.get_reactor(),
472463
self._generate_thumbnail,
473464
thumbnailer,
@@ -490,7 +481,7 @@ def generate_local_exact_thumbnail(
490481
thumbnail_type=t_type,
491482
)
492483

493-
output_path = yield self.media_storage.store_file(
484+
output_path = await self.media_storage.store_file(
494485
t_byte_source, file_info
495486
)
496487
finally:
@@ -500,22 +491,21 @@ def generate_local_exact_thumbnail(
500491

501492
t_len = os.path.getsize(output_path)
502493

503-
yield self.store.store_local_thumbnail(
494+
await self.store.store_local_thumbnail(
504495
media_id, t_width, t_height, t_type, t_method, t_len
505496
)
506497

507498
return output_path
508499

509-
@defer.inlineCallbacks
510-
def generate_remote_exact_thumbnail(
500+
async def generate_remote_exact_thumbnail(
511501
self, server_name, file_id, media_id, t_width, t_height, t_method, t_type
512502
):
513-
input_path = yield self.media_storage.ensure_media_is_in_local_cache(
503+
input_path = await self.media_storage.ensure_media_is_in_local_cache(
514504
FileInfo(server_name, file_id, url_cache=False)
515505
)
516506

517507
thumbnailer = Thumbnailer(input_path)
518-
t_byte_source = yield defer_to_thread(
508+
t_byte_source = await defer_to_thread(
519509
self.hs.get_reactor(),
520510
self._generate_thumbnail,
521511
thumbnailer,
@@ -537,7 +527,7 @@ def generate_remote_exact_thumbnail(
537527
thumbnail_type=t_type,
538528
)
539529

540-
output_path = yield self.media_storage.store_file(
530+
output_path = await self.media_storage.store_file(
541531
t_byte_source, file_info
542532
)
543533
finally:
@@ -547,7 +537,7 @@ def generate_remote_exact_thumbnail(
547537

548538
t_len = os.path.getsize(output_path)
549539

550-
yield self.store.store_remote_media_thumbnail(
540+
await self.store.store_remote_media_thumbnail(
551541
server_name,
552542
media_id,
553543
file_id,
@@ -560,8 +550,7 @@ def generate_remote_exact_thumbnail(
560550

561551
return output_path
562552

563-
@defer.inlineCallbacks
564-
def _generate_thumbnails(
553+
async def _generate_thumbnails(
565554
self, server_name, media_id, file_id, media_type, url_cache=False
566555
):
567556
"""Generate and store thumbnails for an image.
@@ -582,7 +571,7 @@ def _generate_thumbnails(
582571
if not requirements:
583572
return
584573

585-
input_path = yield self.media_storage.ensure_media_is_in_local_cache(
574+
input_path = await self.media_storage.ensure_media_is_in_local_cache(
586575
FileInfo(server_name, file_id, url_cache=url_cache)
587576
)
588577

@@ -600,7 +589,7 @@ def _generate_thumbnails(
600589
return
601590

602591
if thumbnailer.transpose_method is not None:
603-
m_width, m_height = yield defer_to_thread(
592+
m_width, m_height = await defer_to_thread(
604593
self.hs.get_reactor(), thumbnailer.transpose
605594
)
606595

@@ -620,11 +609,11 @@ def _generate_thumbnails(
620609
for (t_width, t_height, t_type), t_method in iteritems(thumbnails):
621610
# Generate the thumbnail
622611
if t_method == "crop":
623-
t_byte_source = yield defer_to_thread(
612+
t_byte_source = await defer_to_thread(
624613
self.hs.get_reactor(), thumbnailer.crop, t_width, t_height, t_type
625614
)
626615
elif t_method == "scale":
627-
t_byte_source = yield defer_to_thread(
616+
t_byte_source = await defer_to_thread(
628617
self.hs.get_reactor(), thumbnailer.scale, t_width, t_height, t_type
629618
)
630619
else:
@@ -646,7 +635,7 @@ def _generate_thumbnails(
646635
url_cache=url_cache,
647636
)
648637

649-
output_path = yield self.media_storage.store_file(
638+
output_path = await self.media_storage.store_file(
650639
t_byte_source, file_info
651640
)
652641
finally:
@@ -656,7 +645,7 @@ def _generate_thumbnails(
656645

657646
# Write to database
658647
if server_name:
659-
yield self.store.store_remote_media_thumbnail(
648+
await self.store.store_remote_media_thumbnail(
660649
server_name,
661650
media_id,
662651
file_id,
@@ -667,15 +656,14 @@ def _generate_thumbnails(
667656
t_len,
668657
)
669658
else:
670-
yield self.store.store_local_thumbnail(
659+
await self.store.store_local_thumbnail(
671660
media_id, t_width, t_height, t_type, t_method, t_len
672661
)
673662

674663
return {"width": m_width, "height": m_height}
675664

676-
@defer.inlineCallbacks
677-
def delete_old_remote_media(self, before_ts):
678-
old_media = yield self.store.get_remote_media_before(before_ts)
665+
async def delete_old_remote_media(self, before_ts):
666+
old_media = await self.store.get_remote_media_before(before_ts)
679667

680668
deleted = 0
681669

@@ -689,7 +677,7 @@ def delete_old_remote_media(self, before_ts):
689677

690678
# TODO: Should we delete from the backup store
691679

692-
with (yield self.remote_media_linearizer.queue(key)):
680+
with (await self.remote_media_linearizer.queue(key)):
693681
full_path = self.filepaths.remote_media_filepath(origin, file_id)
694682
try:
695683
os.remove(full_path)
@@ -705,7 +693,7 @@ def delete_old_remote_media(self, before_ts):
705693
)
706694
shutil.rmtree(thumbnail_dir, ignore_errors=True)
707695

708-
yield self.store.delete_remote_media(origin, media_id)
696+
await self.store.delete_remote_media(origin, media_id)
709697
deleted += 1
710698

711699
return {"deleted": deleted}

0 commit comments

Comments
 (0)