66import time
77
88import flask
9+ import gevent
910
1011from docker_registry .core import compat
1112from docker_registry .core import exceptions
@@ -65,15 +66,18 @@ def get_properties(namespace, repository):
6566
6667def get_tags (namespace , repository ):
6768 tag_path = store .tag_path (namespace , repository )
69+ greenlets = {}
6870 for fname in store .list_directory (tag_path ):
6971 full_tag_name = fname .split ('/' ).pop ()
7072 if not full_tag_name .startswith ('tag_' ):
7173 continue
7274 tag_name = full_tag_name [4 :]
73- tag_content = store .get_content (
74- store .tag_path (namespace , repository , tag_name )
75+ greenlets [tag_name ] = gevent .spawn (
76+ store .get_content ,
77+ store .tag_path (namespace , repository , tag_name ),
7578 )
76- yield (tag_name , tag_content )
79+ gevent .joinall (greenlets .values ())
80+ return dict ((k , g .value ) for (k , g ) in greenlets .items ())
7781
7882
7983@app .route ('/v1/repositories/<path:repository>/tags' , methods = ['GET' ])
@@ -84,9 +88,7 @@ def _get_tags(namespace, repository):
8488 logger .debug ("[get_tags] namespace={0}; repository={1}" .format (namespace ,
8589 repository ))
8690 try :
87- data = dict ((tag_name , tag_content )
88- for tag_name , tag_content
89- in get_tags (namespace = namespace , repository = repository ))
91+ data = get_tags (namespace = namespace , repository = repository )
9092 except exceptions .FileNotFoundError :
9193 return toolkit .api_error ('Repository not found' , 404 )
9294 return toolkit .response (data )
@@ -255,7 +257,7 @@ def delete_repository(namespace, repository):
255257 namespace , repository ))
256258 try :
257259 for tag_name , tag_content in get_tags (
258- namespace = namespace , repository = repository ):
260+ namespace = namespace , repository = repository ). items () :
259261 delete_tag (
260262 namespace = namespace , repository = repository , tag = tag_name )
261263 # TODO(wking): remove images, but may need refcounting
0 commit comments