Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

storage: ApplyWriteRedirectErrors clears the write handle when a BidiWriteObjectRedirectedError omits it

Aperta Adatta ai principianti
#16,529 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
82/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
cpp
Ambito
cloud

Direzione di ricerca

Inizia da google/cloud/storage/internal/async/handle_redirect_error.cc e confronta ApplyWriteRedirectErrors con HandleBidiWriteRedirect; poi leggi Resume() in google/cloud/storage/internal/async/writer_connection_resumed.cc. È fatto quando un redirect senza un write_handle conserva l’handle esistente, mentre i redirect che ne forniscono uno continuano ad applicarlo.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

api: storage priority: p2 type: bug

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:

  • generation on 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 no write_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.)

Lingua principale
C++
Stelle
658
Fork
469
Merge medio
1g 10h
PR unite (30g)
96

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di googleapis/google-cloud-cpp

Tutte le issue di googleapis/google-cloud-cpp

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.