List iterators lose an item when loading the next page fails

Abierto Apto para principiantes
#240 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 3 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
java
Área
backend

Línea de trabajo

Empieza en next() en core/src/main/java/com/backblaze/b2/client/B2ListFilesIterableBase.java (alrededor de las líneas 43-58), donde currentIndex se incrementa antes de que advanceIfNeeded() pueda lanzar una excepción; el mismo patrón aparece en B2ListPartsIterableBase.java alrededor de las líneas 30-45. Escribe una prueba con un cliente simulado que falle al cargar la segunda página y, después de capturar la excepción, vuelve a llamar a next() para confirmar que el elemento se pierde. Se considera terminado cuando el elemento se devuelve o se reintenta correctamente y la prueba pasa, en ambos iteradores.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

What happens

In next(), the iterator moves past the current item and then loads the next page if the current page is used up. If that page load fails, B2RuntimeException is thrown from next() and the item that was just taken is not returned. A caller that catches the exception and continues will not see that item, and the next next() call fails with an IllegalStateException instead of retrying the page.

Where

core/src/main/java/com/backblaze/b2/client/B2ListFilesIterableBase.java:43-58 (next() at about :50 increments currentIndex, then calls advanceIfNeeded()); the same pattern is in core/src/main/java/com/backblaze/b2/client/B2ListPartsIterableBase.java:30-45.

Why it matters

Impact: Wrong request or result (a listing silently misses an item for a caller that continues after the error), loud for the failed call. Severity: Medium, because it needs a page load that fails after retries and a caller that catches the error and keeps iterating (unusual), and a caller that stops on the first error is not affected.

How to check

Found by reading the code, not reproduced. Read next(): the value is read and currentIndex incremented before advanceIfNeeded() can throw. A test with a mocked client that fails on the second page load, and a caller that catches the exception and calls next() again, would show the missing item. Advancing lazily in hasNext() or returning the item before advancing would avoid it.

Version

Seen at v6.5.0. Present on the default branch: present.

Lenguaje dominante
Java
Estrellas
103
Forks
23
Merge medio
5 d 8 h
PR fusionados (30 d)
3

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Backblaze/b2-sdk-java

Todos los issues de Backblaze/b2-sdk-java

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.