6
6
import time
7
7
8
8
import flask
9
+ import gevent
9
10
10
11
from docker_registry .core import compat
11
12
from docker_registry .core import exceptions
@@ -65,15 +66,18 @@ def get_properties(namespace, repository):
65
66
66
67
def get_tags (namespace , repository ):
67
68
tag_path = store .tag_path (namespace , repository )
69
+ greenlets = {}
68
70
for fname in store .list_directory (tag_path ):
69
71
full_tag_name = fname .split ('/' ).pop ()
70
72
if not full_tag_name .startswith ('tag_' ):
71
73
continue
72
74
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 ),
75
78
)
76
- yield (tag_name , tag_content )
79
+ gevent .joinall (greenlets .values ())
80
+ return dict ((k , g .value ) for (k , g ) in greenlets .items ())
77
81
78
82
79
83
@app .route ('/v1/repositories/<path:repository>/tags' , methods = ['GET' ])
@@ -84,9 +88,7 @@ def _get_tags(namespace, repository):
84
88
logger .debug ("[get_tags] namespace={0}; repository={1}" .format (namespace ,
85
89
repository ))
86
90
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 )
90
92
except exceptions .FileNotFoundError :
91
93
return toolkit .api_error ('Repository not found' , 404 )
92
94
return toolkit .response (data )
@@ -255,7 +257,7 @@ def delete_repository(namespace, repository):
255
257
namespace , repository ))
256
258
try :
257
259
for tag_name , tag_content in get_tags (
258
- namespace = namespace , repository = repository ):
260
+ namespace = namespace , repository = repository ). items () :
259
261
delete_tag (
260
262
namespace = namespace , repository = repository , tag = tag_name )
261
263
# TODO(wking): remove images, but may need refcounting
0 commit comments