storage: ApplyWriteRedirectErrors clears the write handle when a BidiWriteObjectRedirectedError omits it
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 82/100
Línea de trabajo
Comienza en google/cloud/storage/internal/async/handle_redirect_error.cc y compara ApplyWriteRedirectErrors con HandleBidiWriteRedirect; después, lee Resume() en google/cloud/storage/internal/async/writer_connection_resumed.cc. Se considera terminado cuando una redirección sin un write_handle conserva el handle existente, mientras que las redirecciones que proporcionan uno siguen aplicándolo.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Does this issue affect the google-cloud-cpp project? If the problem is with
the Google Cloud service exposed by the google-cloud-cpp libraries instead of
the client libraries themselves, you may consider opening a support request
instead. The google-cloud-cpp developers cannot help you troubleshoot problems
with the service itself.
Yes
What component of google-cloud-cpp is this related to? For example, is
this related to bigtable (i.e., something in google/cloud/bigtable), or GCS
(i.e., something in google/cloud/storage)?
google/cloud/storage
Describe the bug A clear and concise description of what the bug is.
Accidentally cleared write handle
To Reproduce Steps to reproduce the behavior:
Found through static analysis of the code
Expected behavior A clear and concise description of what you expected to
happen.
Don't clear the write handle
Operating system: If you are using a Linux distribution please include the
name and version of the distribution too.
N/A
What compiler and version are you using? Please include the output of
g++ -v or clang++ -v or the equivalent command-line flag.
N/A
What version of google-cloud-cpp are you using? Please include the output
from git rev-parse HEAD if you are compiling from source, or the version
number from the applicable google/cloud/*/version.h file.
Found by examining most recent version. 10/2/26.
Additional context Add any other context about the problem here.
When an appendable bidi write is redirected mid-upload, ApplyWriteRedirectErrors copies write_handle from the redirect without checking whether it is set:
// google/cloud/storage/internal/async/handle_redirect_error.cc
void ApplyWriteRedirectErrors(google::storage::v2::AppendObjectSpec& spec,
google::rpc::Status const& rpc_status) {
for (auto const& any : rpc_status.details()) {
...
*spec.mutable_write_handle() = std::move(*error.mutable_write_handle()); // unconditional
*spec.mutable_routing_token() = std::move(*error.mutable_routing_token()); // unconditional
if (error.has_generation()) spec.set_generation(error.generation()); // guarded
}
}
BidiWriteObjectRedirectedError.write_handle is optional. The proto says that if it is not set, "clients might retry the original request" (google/storage/v2/storage.proto). When the server omits it, the code above replaces the handle that AsyncWriterConnectionResumedState::Resume() just set from latest_write_handle_ with an empty one, so the resume request carries a write_handle that is set but empty:
// google/cloud/storage/internal/async/writer_connection_resumed.cc, Resume()
// Include write_handle to enable fast resume instead of slow
// takeover. Without handle, server performs full state validation.
if (latest_write_handle_) {
*append_object_spec.mutable_write_handle() = *latest_write_handle_;
}
append_object_spec.set_generation(first_response_.resource().generation());
ApplyWriteRedirectErrors(append_object_spec, std::move(proto_status));
This is inconsistent with the rest of the SDK:
generationon the next line is only overridden when the redirect sets it.HandleBidiWriteRedirect(same file, used when the stream is first opened) leaves the request unchanged when the redirect has nowrite_handle.
Impact: this isn't a correctness problem, since the resume still uses an AppendObjectSpec with the right generation. But per the comment in Resume(), resuming without a valid handle makes the server do a slow takeover with full state validation instead of a fast resume. This may be worth investigating for write performance after redirects. We haven't checked how the server treats a handle that is set but empty, as opposed to a missing one.
We hit token-only redirects in practice: a reconnect after a RESOURCE_EXHAUSTED stream failure received ABORTED: The object is not available from this location. with a BidiWriteObjectRedirectedError that had only a routing_token.
Suggested fix: guard the handle the same way as the generation:
if (error.has_write_handle()) {
*spec.mutable_write_handle() = std::move(*error.mutable_write_handle());
}
(Optionally also only override routing_token when it is non-empty, to match HandleBidiWriteRedirect. Note that routing tokens may expire, so keeping an old one has tradeoffs.)
- Lenguaje dominante
- C++
- Estrellas
- 658
- Forks
- 469
- Merge medio
- 1 d 8 h
- PR fusionados (30 d)
- 96
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de googleapis/google-cloud-cpp
-
storage: RetryClientTest.HedgedReadRecordsMetricsOnGlobalMeterProvider leaking mock objectsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertoapi: storage type: cleanup
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
googleapis/google-cloud-cpp#16522 ·
Los mantenedores suelen responder en 1 día
-
type: feature request
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
googleapis/google-cloud-cpp#16193 ·
Los mantenedores suelen responder en 1 día
-
api: storage type: cleanup
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
googleapis/google-cloud-cpp#16404 ·
Los mantenedores suelen responder en 1 día
-
cpp: generator type: cleanup
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
googleapis/google-cloud-cpp#16394 ·
Los mantenedores suelen responder en 1 día
-
BigQueryReadClient::ReadRows fails with `UNKNOWN: Error occurred when fetching oauth2 token` after CreateReadSession succeedsQuizá libre de nuevo @scotthart la tomó hace 43 días y no hay ningún pull request abierto. Abierto
googleapis/google-cloud-cpp#16371 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de googleapis/google-cloud-cpp
Issues similares
-
area:runtime good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
WATonomous/wato_f1tenth#39 ·
-
[APP BUG]: Sorting by name after searching can bring up irrelevant resultsPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
shadps4-emu/shadps4-qtlauncher#465 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
duckdb/duckdb-excel#104 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
lxqt/lxqt-powermanagement#495 ·
-
`FakeBackendV2.run` fails with `NoiseError` on circuits with delays on qubits where T2 > 2·T1Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Qiskit/qiskit-aer#2466 ·