Skip to content

Commit 6c26da1

Browse files
Fix fetching paginated results with a filter. (#4511)
Filters mean that pagination isn't handled for you.
1 parent e4b0136 commit 6c26da1

File tree

1 file changed

+29
-16
lines changed
  • src/clusterfuzz/_internal/google_cloud_utils

1 file changed

+29
-16
lines changed

src/clusterfuzz/_internal/google_cloud_utils/storage.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,6 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
240240

241241
client = _storage_client()
242242
bucket = client.bucket(bucket_name)
243-
properties = {}
244243

245244
if recursive:
246245
delimiter = None
@@ -252,23 +251,37 @@ def list_blobs(self, remote_path, recursive=True, names_only=False):
252251
else:
253252
fields = None
254253

255-
iterator = bucket.list_blobs(
256-
prefix=path, delimiter=delimiter, fields=fields)
257-
for blob in iterator:
258-
properties['bucket'] = bucket_name
259-
properties['name'] = blob.name
260-
properties['updated'] = blob.updated
261-
properties['size'] = blob.size
262-
263-
yield properties
264-
265-
if not recursive:
266-
# When doing delimiter listings, the "directories" will be in `prefixes`.
267-
for prefix in iterator.prefixes:
268-
properties['bucket'] = bucket_name
269-
properties['name'] = prefix
254+
iterations = 0
255+
while True:
256+
iterations += 1
257+
iterator = bucket.list_blobs(
258+
prefix=path, delimiter=delimiter, fields=fields)
259+
for blob in iterator:
260+
properties = {
261+
'bucket': bucket_name,
262+
'name': blob.name,
263+
'updated': blob.updated,
264+
'size': blob.size,
265+
}
266+
270267
yield properties
271268

269+
if not recursive:
270+
# When doing delimiter listings, the "directories" will be in
271+
# `prefixes`.
272+
for prefix in iterator.prefixes:
273+
properties = {
274+
'bucket': bucket_name,
275+
'name': prefix,
276+
}
277+
yield properties
278+
279+
next_page_token = iterator.next_page_token
280+
if next_page_token is None:
281+
break
282+
if iterations and iterations % 50 == 0:
283+
logs.error('Might be infinite looping.')
284+
272285
def copy_file_from(self, remote_path, local_path):
273286
"""Copy file from a remote path to a local path."""
274287
client = _storage_client()

0 commit comments

Comments
 (0)