Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Commit 747fe18

Browse files
committed
Merge pull request #644 from bshi/gevent-get-tags
Use gevent to parallelize storage operations in get_tags
2 parents d76dee2 + 3962264 commit 747fe18

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

docker_registry/tags.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import time
77

88
import flask
9+
import gevent
910

1011
from docker_registry.core import compat
1112
from docker_registry.core import exceptions
@@ -65,15 +66,18 @@ def get_properties(namespace, repository):
6566

6667
def 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

Comments
 (0)