From 9083beb41fbc0ab8bcbc5a57ded5dc25dfd96b46 Mon Sep 17 00:00:00 2001 From: Darrell Bishop <darrell@swiftstack.com> Date: Thu, 16 Aug 2012 21:39:00 -0700 Subject: [PATCH] Shuffle download order (of containers and objects) When downloading the same containers or objects with multiple invocations of the swift command-line client, you'll get better throughput and avoid "hot spots" if each client randomizes its download order. Note that the marker must be picked *before* shuffling the containers or objects. Change-Id: I7240eda57a80e1708c2483827c6329fd57d5fc51 --- bin/swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/swift b/bin/swift index 11f9553a..b1985940 100755 --- a/bin/swift +++ b/bin/swift @@ -22,6 +22,7 @@ from optparse import OptionParser from os import environ, listdir, makedirs, utime, _exit as os_exit from os.path import basename, dirname, getmtime, getsize, isdir, join from Queue import Empty, Queue +from random import shuffle from sys import argv, exc_info, exit, stderr, stdout from threading import current_thread, enumerate as threading_enumerate, Thread from time import sleep @@ -423,9 +424,10 @@ def st_download(parser, args, print_queue, error_queue): conn.get_container(container, marker=marker)[1]] if not objects: break + marker = objects[-1] + shuffle(objects) for obj in objects: object_queue.put((container, obj)) - marker = objects[-1] except ClientException, err: if err.http_status != 404: raise @@ -450,9 +452,10 @@ def st_download(parser, args, print_queue, error_queue): for c in conn.get_account(marker=marker)[1]] if not containers: break + marker = containers[-1] + shuffle(containers) for container in containers: container_queue.put(container) - marker = containers[-1] except ClientException, err: if err.http_status != 404: raise