In QUIC TlsServerHandshaker, only run DefaultSignatureCallback at most once.

Protected by FLAGS_quic_reloadable_flag_quic_run_default_signature_callback_once.

PiperOrigin-RevId: 385179619
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 8abba28..90b14fb 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -23,6 +23,8 @@
 QUIC_FLAG(FLAGS_quic_restart_flag_quic_support_release_time_for_gso, false)
 // If true, QuicIdleNetworkDetector::SetAlarm will become a noop if dectection has been stopped by QuicIdleNetworkDetector::StopDetection.
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_idle_network_detector_no_alarm_after_stopped, false)
+// If true, TlsServerHandshaker::DefaultProofSourceHandle::DefaultSignatureCallback will run at most once.
+QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_run_default_signature_callback_once, false)
 // If true, abort async QPACK header decompression in QuicSpdyStream::Reset() and in QuicSpdyStream::OnStreamReset().
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_abort_qpack_on_stream_reset, true)
 // If true, ack frequency frame can be sent from server to client.
diff --git a/quic/core/tls_server_handshaker.h b/quic/core/tls_server_handshaker.h
index e9fc172..9ea70a6 100644
--- a/quic/core/tls_server_handshaker.h
+++ b/quic/core/tls_server_handshaker.h
@@ -19,6 +19,7 @@
 #include "quic/core/quic_types.h"
 #include "quic/core/tls_handshaker.h"
 #include "quic/platform/api/quic_export.h"
+#include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
 
 namespace quic {
@@ -254,6 +255,20 @@
           // Operation has been canceled, or Run has been called.
           return;
         }
+
+        if (GetQuicReloadableFlag(quic_run_default_signature_callback_once)) {
+          QUIC_RELOADABLE_FLAG_COUNT(quic_run_default_signature_callback_once);
+          DefaultProofSourceHandle* handle = handle_;
+          handle_ = nullptr;
+
+          handle->signature_callback_ = nullptr;
+          if (handle->handshaker_ != nullptr) {
+            handle->handshaker_->OnComputeSignatureDone(
+                ok, is_sync_, std::move(signature), std::move(details));
+          }
+          return;
+        }
+
         handle_->signature_callback_ = nullptr;
         if (handle_->handshaker_ != nullptr) {
           handle_->handshaker_->OnComputeSignatureDone(