@@ -225,61 +225,63 @@ public Response get(
225225 }
226226 String lastKey = null ;
227227 int count = 0 ;
228- while (ozoneKeyIterator != null && ozoneKeyIterator .hasNext ()) {
229- OzoneKey next = ozoneKeyIterator .next ();
230- if (bucket != null && bucket .getBucketLayout ().isFileSystemOptimized () &&
231- StringUtils .isNotEmpty (prefix ) &&
232- !next .getName ().startsWith (prefix )) {
233- // prefix has delimiter but key don't have
234- // example prefix: dir1/ key: dir123
235- continue ;
236- }
237- if (startAfter != null && count == 0 && Objects .equals (startAfter , next .getName ())) {
238- continue ;
239- }
240- String relativeKeyName = next .getName ().substring (prefix .length ());
241-
242- int depth = StringUtils .countMatches (relativeKeyName , delimiter );
243- if (!StringUtils .isEmpty (delimiter )) {
244- if (depth > 0 ) {
245- // means key has multiple delimiters in its value.
246- // ex: dir/dir1/dir2, where delimiter is "/" and prefix is dir/
247- String dirName = relativeKeyName .substring (0 , relativeKeyName
248- .indexOf (delimiter ));
249- if (!dirName .equals (prevDir )) {
250- response .addPrefix (EncodingTypeObject .createNullable (
251- prefix + dirName + delimiter , encodingType ));
252- prevDir = dirName ;
228+ if (maxKeys > 0 ) {
229+ while (ozoneKeyIterator != null && ozoneKeyIterator .hasNext ()) {
230+ OzoneKey next = ozoneKeyIterator .next ();
231+ if (bucket != null && bucket .getBucketLayout ().isFileSystemOptimized () &&
232+ StringUtils .isNotEmpty (prefix ) &&
233+ !next .getName ().startsWith (prefix )) {
234+ // prefix has delimiter but key don't have
235+ // example prefix: dir1/ key: dir123
236+ continue ;
237+ }
238+ if (startAfter != null && count == 0 && Objects .equals (startAfter , next .getName ())) {
239+ continue ;
240+ }
241+ String relativeKeyName = next .getName ().substring (prefix .length ());
242+
243+ int depth = StringUtils .countMatches (relativeKeyName , delimiter );
244+ if (!StringUtils .isEmpty (delimiter )) {
245+ if (depth > 0 ) {
246+ // means key has multiple delimiters in its value.
247+ // ex: dir/dir1/dir2, where delimiter is "/" and prefix is dir/
248+ String dirName = relativeKeyName .substring (0 , relativeKeyName
249+ .indexOf (delimiter ));
250+ if (!dirName .equals (prevDir )) {
251+ response .addPrefix (EncodingTypeObject .createNullable (
252+ prefix + dirName + delimiter , encodingType ));
253+ prevDir = dirName ;
254+ count ++;
255+ }
256+ } else if (relativeKeyName .endsWith (delimiter )) {
257+ // means or key is same as prefix with delimiter at end and ends with
258+ // delimiter. ex: dir/, where prefix is dir and delimiter is /
259+ response .addPrefix (
260+ EncodingTypeObject .createNullable (relativeKeyName , encodingType ));
261+ count ++;
262+ } else {
263+ // means our key is matched with prefix if prefix is given and it
264+ // does not have any common prefix.
265+ addKey (response , next );
253266 count ++;
254267 }
255- } else if (relativeKeyName .endsWith (delimiter )) {
256- // means or key is same as prefix with delimiter at end and ends with
257- // delimiter. ex: dir/, where prefix is dir and delimiter is /
258- response .addPrefix (
259- EncodingTypeObject .createNullable (relativeKeyName , encodingType ));
260- count ++;
261268 } else {
262- // means our key is matched with prefix if prefix is given and it
263- // does not have any common prefix.
264269 addKey (response , next );
265270 count ++;
266271 }
267- } else {
268- addKey (response , next );
269- count ++;
270- }
271272
272- if (count == maxKeys ) {
273- lastKey = next .getName ();
274- break ;
273+ if (count == maxKeys ) {
274+ lastKey = next .getName ();
275+ break ;
276+ }
275277 }
276278 }
277279
278280 response .setKeyCount (count );
279281
280282 if (count < maxKeys ) {
281283 response .setTruncated (false );
282- } else if (ozoneKeyIterator .hasNext ()) {
284+ } else if (ozoneKeyIterator .hasNext () && lastKey != null ) {
283285 response .setTruncated (true );
284286 ContinueToken nextToken = new ContinueToken (lastKey , prevDir );
285287 response .setNextToken (nextToken .encodeToString ());
@@ -303,8 +305,8 @@ public Response get(
303305 }
304306
305307 private int validateMaxKeys (int maxKeys ) throws OS3Exception {
306- if (maxKeys <= 0 ) {
307- throw newError (S3ErrorTable .INVALID_ARGUMENT , "maxKeys must be > 0" );
308+ if (maxKeys < 0 ) {
309+ throw newError (S3ErrorTable .INVALID_ARGUMENT , "maxKeys must be >= 0" );
308310 }
309311
310312 return Math .min (maxKeys , maxKeysLimit );
0 commit comments