24
24
25
25
import twisted .internet .error
26
26
import twisted .web .http
27
- from twisted .internet import defer
28
27
from twisted .web .resource import Resource
29
28
30
29
from synapse .api .errors import (
@@ -114,15 +113,14 @@ def _start_update_recently_accessed(self):
114
113
"update_recently_accessed_media" , self ._update_recently_accessed
115
114
)
116
115
117
- @defer .inlineCallbacks
118
- def _update_recently_accessed (self ):
116
+ async def _update_recently_accessed (self ):
119
117
remote_media = self .recently_accessed_remotes
120
118
self .recently_accessed_remotes = set ()
121
119
122
120
local_media = self .recently_accessed_locals
123
121
self .recently_accessed_locals = set ()
124
122
125
- yield self .store .update_cached_last_access_time (
123
+ await self .store .update_cached_last_access_time (
126
124
local_media , remote_media , self .clock .time_msec ()
127
125
)
128
126
@@ -138,8 +136,7 @@ def mark_recently_accessed(self, server_name, media_id):
138
136
else :
139
137
self .recently_accessed_locals .add (media_id )
140
138
141
- @defer .inlineCallbacks
142
- def create_content (
139
+ async def create_content (
143
140
self , media_type , upload_name , content , content_length , auth_user
144
141
):
145
142
"""Store uploaded content for a local user and return the mxc URL
@@ -158,11 +155,11 @@ def create_content(
158
155
159
156
file_info = FileInfo (server_name = None , file_id = media_id )
160
157
161
- fname = yield self .media_storage .store_file (content , file_info )
158
+ fname = await self .media_storage .store_file (content , file_info )
162
159
163
160
logger .info ("Stored local media in file %r" , fname )
164
161
165
- yield self .store .store_local_media (
162
+ await self .store .store_local_media (
166
163
media_id = media_id ,
167
164
media_type = media_type ,
168
165
time_now_ms = self .clock .time_msec (),
@@ -171,12 +168,11 @@ def create_content(
171
168
user_id = auth_user ,
172
169
)
173
170
174
- yield self ._generate_thumbnails (None , media_id , media_id , media_type )
171
+ await self ._generate_thumbnails (None , media_id , media_id , media_type )
175
172
176
173
return "mxc://%s/%s" % (self .server_name , media_id )
177
174
178
- @defer .inlineCallbacks
179
- def get_local_media (self , request , media_id , name ):
175
+ async def get_local_media (self , request , media_id , name ):
180
176
"""Responds to reqests for local media, if exists, or returns 404.
181
177
182
178
Args:
@@ -190,7 +186,7 @@ def get_local_media(self, request, media_id, name):
190
186
Deferred: Resolves once a response has successfully been written
191
187
to request
192
188
"""
193
- media_info = yield self .store .get_local_media (media_id )
189
+ media_info = await self .store .get_local_media (media_id )
194
190
if not media_info or media_info ["quarantined_by" ]:
195
191
respond_404 (request )
196
192
return
@@ -204,13 +200,12 @@ def get_local_media(self, request, media_id, name):
204
200
205
201
file_info = FileInfo (None , media_id , url_cache = url_cache )
206
202
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 (
209
205
request , responder , media_type , media_length , upload_name
210
206
)
211
207
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 ):
214
209
"""Respond to requests for remote media.
215
210
216
211
Args:
@@ -236,8 +231,8 @@ def get_remote_media(self, request, server_name, media_id, name):
236
231
# We linearize here to ensure that we don't try and download remote
237
232
# media multiple times concurrently
238
233
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 (
241
236
server_name , media_id
242
237
)
243
238
@@ -246,14 +241,13 @@ def get_remote_media(self, request, server_name, media_id, name):
246
241
media_type = media_info ["media_type" ]
247
242
media_length = media_info ["media_length" ]
248
243
upload_name = name if name else media_info ["upload_name" ]
249
- yield respond_with_responder (
244
+ await respond_with_responder (
250
245
request , responder , media_type , media_length , upload_name
251
246
)
252
247
else :
253
248
respond_404 (request )
254
249
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 ):
257
251
"""Gets the media info associated with the remote file, downloading
258
252
if necessary.
259
253
@@ -274,8 +268,8 @@ def get_remote_media_info(self, server_name, media_id):
274
268
# We linearize here to ensure that we don't try and download remote
275
269
# media multiple times concurrently
276
270
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 (
279
273
server_name , media_id
280
274
)
281
275
@@ -286,8 +280,7 @@ def get_remote_media_info(self, server_name, media_id):
286
280
287
281
return media_info
288
282
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 ):
291
284
"""Looks for media in local cache, if not there then attempt to
292
285
download from remote server.
293
286
@@ -299,7 +292,7 @@ def _get_remote_media_impl(self, server_name, media_id):
299
292
Returns:
300
293
Deferred[(Responder, media_info)]
301
294
"""
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 )
303
296
304
297
# file_id is the ID we use to track the file locally. If we've already
305
298
# 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):
317
310
logger .info ("Media is quarantined" )
318
311
raise NotFoundError ()
319
312
320
- responder = yield self .media_storage .fetch_media (file_info )
313
+ responder = await self .media_storage .fetch_media (file_info )
321
314
if responder :
322
315
return responder , media_info
323
316
324
317
# Failed to find the file anywhere, lets download it.
325
318
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 )
327
320
328
- responder = yield self .media_storage .fetch_media (file_info )
321
+ responder = await self .media_storage .fetch_media (file_info )
329
322
return responder , media_info
330
323
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 ):
333
325
"""Attempt to download the remote file from the given server name,
334
326
using the given file_id as the local id.
335
327
@@ -351,7 +343,7 @@ def _download_remote_file(self, server_name, media_id, file_id):
351
343
("/_matrix/media/v1/download" , server_name , media_id )
352
344
)
353
345
try :
354
- length , headers = yield self .client .get_file (
346
+ length , headers = await self .client .get_file (
355
347
server_name ,
356
348
request_path ,
357
349
output_stream = f ,
@@ -397,15 +389,15 @@ def _download_remote_file(self, server_name, media_id, file_id):
397
389
)
398
390
raise SynapseError (502 , "Failed to fetch remote media" )
399
391
400
- yield finish ()
392
+ await finish ()
401
393
402
394
media_type = headers [b"Content-Type" ][0 ].decode ("ascii" )
403
395
upload_name = get_filename_from_headers (headers )
404
396
time_now_ms = self .clock .time_msec ()
405
397
406
398
logger .info ("Stored remote media in file %r" , fname )
407
399
408
- yield self .store .store_cached_remote_media (
400
+ await self .store .store_cached_remote_media (
409
401
origin = server_name ,
410
402
media_id = media_id ,
411
403
media_type = media_type ,
@@ -423,7 +415,7 @@ def _download_remote_file(self, server_name, media_id, file_id):
423
415
"filesystem_id" : file_id ,
424
416
}
425
417
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 )
427
419
428
420
return media_info
429
421
@@ -458,16 +450,15 @@ def _generate_thumbnail(self, thumbnailer, t_width, t_height, t_method, t_type):
458
450
459
451
return t_byte_source
460
452
461
- @defer .inlineCallbacks
462
- def generate_local_exact_thumbnail (
453
+ async def generate_local_exact_thumbnail (
463
454
self , media_id , t_width , t_height , t_method , t_type , url_cache
464
455
):
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 (
466
457
FileInfo (None , media_id , url_cache = url_cache )
467
458
)
468
459
469
460
thumbnailer = Thumbnailer (input_path )
470
- t_byte_source = yield defer_to_thread (
461
+ t_byte_source = await defer_to_thread (
471
462
self .hs .get_reactor (),
472
463
self ._generate_thumbnail ,
473
464
thumbnailer ,
@@ -490,7 +481,7 @@ def generate_local_exact_thumbnail(
490
481
thumbnail_type = t_type ,
491
482
)
492
483
493
- output_path = yield self .media_storage .store_file (
484
+ output_path = await self .media_storage .store_file (
494
485
t_byte_source , file_info
495
486
)
496
487
finally :
@@ -500,22 +491,21 @@ def generate_local_exact_thumbnail(
500
491
501
492
t_len = os .path .getsize (output_path )
502
493
503
- yield self .store .store_local_thumbnail (
494
+ await self .store .store_local_thumbnail (
504
495
media_id , t_width , t_height , t_type , t_method , t_len
505
496
)
506
497
507
498
return output_path
508
499
509
- @defer .inlineCallbacks
510
- def generate_remote_exact_thumbnail (
500
+ async def generate_remote_exact_thumbnail (
511
501
self , server_name , file_id , media_id , t_width , t_height , t_method , t_type
512
502
):
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 (
514
504
FileInfo (server_name , file_id , url_cache = False )
515
505
)
516
506
517
507
thumbnailer = Thumbnailer (input_path )
518
- t_byte_source = yield defer_to_thread (
508
+ t_byte_source = await defer_to_thread (
519
509
self .hs .get_reactor (),
520
510
self ._generate_thumbnail ,
521
511
thumbnailer ,
@@ -537,7 +527,7 @@ def generate_remote_exact_thumbnail(
537
527
thumbnail_type = t_type ,
538
528
)
539
529
540
- output_path = yield self .media_storage .store_file (
530
+ output_path = await self .media_storage .store_file (
541
531
t_byte_source , file_info
542
532
)
543
533
finally :
@@ -547,7 +537,7 @@ def generate_remote_exact_thumbnail(
547
537
548
538
t_len = os .path .getsize (output_path )
549
539
550
- yield self .store .store_remote_media_thumbnail (
540
+ await self .store .store_remote_media_thumbnail (
551
541
server_name ,
552
542
media_id ,
553
543
file_id ,
@@ -560,8 +550,7 @@ def generate_remote_exact_thumbnail(
560
550
561
551
return output_path
562
552
563
- @defer .inlineCallbacks
564
- def _generate_thumbnails (
553
+ async def _generate_thumbnails (
565
554
self , server_name , media_id , file_id , media_type , url_cache = False
566
555
):
567
556
"""Generate and store thumbnails for an image.
@@ -582,7 +571,7 @@ def _generate_thumbnails(
582
571
if not requirements :
583
572
return
584
573
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 (
586
575
FileInfo (server_name , file_id , url_cache = url_cache )
587
576
)
588
577
@@ -600,7 +589,7 @@ def _generate_thumbnails(
600
589
return
601
590
602
591
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 (
604
593
self .hs .get_reactor (), thumbnailer .transpose
605
594
)
606
595
@@ -620,11 +609,11 @@ def _generate_thumbnails(
620
609
for (t_width , t_height , t_type ), t_method in iteritems (thumbnails ):
621
610
# Generate the thumbnail
622
611
if t_method == "crop" :
623
- t_byte_source = yield defer_to_thread (
612
+ t_byte_source = await defer_to_thread (
624
613
self .hs .get_reactor (), thumbnailer .crop , t_width , t_height , t_type
625
614
)
626
615
elif t_method == "scale" :
627
- t_byte_source = yield defer_to_thread (
616
+ t_byte_source = await defer_to_thread (
628
617
self .hs .get_reactor (), thumbnailer .scale , t_width , t_height , t_type
629
618
)
630
619
else :
@@ -646,7 +635,7 @@ def _generate_thumbnails(
646
635
url_cache = url_cache ,
647
636
)
648
637
649
- output_path = yield self .media_storage .store_file (
638
+ output_path = await self .media_storage .store_file (
650
639
t_byte_source , file_info
651
640
)
652
641
finally :
@@ -656,7 +645,7 @@ def _generate_thumbnails(
656
645
657
646
# Write to database
658
647
if server_name :
659
- yield self .store .store_remote_media_thumbnail (
648
+ await self .store .store_remote_media_thumbnail (
660
649
server_name ,
661
650
media_id ,
662
651
file_id ,
@@ -667,15 +656,14 @@ def _generate_thumbnails(
667
656
t_len ,
668
657
)
669
658
else :
670
- yield self .store .store_local_thumbnail (
659
+ await self .store .store_local_thumbnail (
671
660
media_id , t_width , t_height , t_type , t_method , t_len
672
661
)
673
662
674
663
return {"width" : m_width , "height" : m_height }
675
664
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 )
679
667
680
668
deleted = 0
681
669
@@ -689,7 +677,7 @@ def delete_old_remote_media(self, before_ts):
689
677
690
678
# TODO: Should we delete from the backup store
691
679
692
- with (yield self .remote_media_linearizer .queue (key )):
680
+ with (await self .remote_media_linearizer .queue (key )):
693
681
full_path = self .filepaths .remote_media_filepath (origin , file_id )
694
682
try :
695
683
os .remove (full_path )
@@ -705,7 +693,7 @@ def delete_old_remote_media(self, before_ts):
705
693
)
706
694
shutil .rmtree (thumbnail_dir , ignore_errors = True )
707
695
708
- yield self .store .delete_remote_media (origin , media_id )
696
+ await self .store .delete_remote_media (origin , media_id )
709
697
deleted += 1
710
698
711
699
return {"deleted" : deleted }
0 commit comments