diff --git a/core/services/lakefs/src/core.rs b/core/services/lakefs/src/core.rs index 579f2be07f67..b16ccb26e844 100644 --- a/core/services/lakefs/src/core.rs +++ b/core/services/lakefs/src/core.rs @@ -144,7 +144,7 @@ impl LakefsCore { } if let Some(after) = after { - url.push_str(&format!("&after={after}")); + url.push_str(&format!("&after={}", percent_encode_path(&after))); } let mut req = Request::get(&url); diff --git a/core/services/lakefs/src/lister.rs b/core/services/lakefs/src/lister.rs index c4e27f4ef354..51077a1ca3f7 100644 --- a/core/services/lakefs/src/lister.rs +++ b/core/services/lakefs/src/lister.rs @@ -64,11 +64,12 @@ impl oio::PageList for LakefsLister { &self.path, self.delimiter, &self.amount, - // start after should only be set for the first page. + // start_after applies to the first page; later pages resume from the + // cursor the previous response returned. if ctx.token.is_empty() { self.after.clone() } else { - None + Some(ctx.token.clone()) }, ) .await?; @@ -84,7 +85,9 @@ impl oio::PageList for LakefsLister { let decoded_response: LakefsListResponse = serde_json::from_reader(bytes.reader()).map_err(new_json_deserialize_error)?; - ctx.done = true; + let pagination = decoded_response.pagination; + ctx.done = !pagination.has_more; + ctx.token = pagination.next_offset; for status in decoded_response.results { let entry_type = match status.path_type.as_str() {