Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(77)

Side by Side Diff: net/quic/chromium/quic_stream_factory.cc

Issue 2821053004: Revert of Remove the code to store and load QUIC server configs in the disk cache. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/chromium/quic_stream_factory.h ('k') | net/quic/chromium/quic_stream_factory_peer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/chromium/quic_stream_factory.h" 5 #include "net/quic/chromium/quic_stream_factory.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <tuple> 8 #include <tuple>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 324
325 // Responsible for creating a new QUIC session to the specified server, and 325 // Responsible for creating a new QUIC session to the specified server, and
326 // for notifying any associated requests when complete. 326 // for notifying any associated requests when complete.
327 class QuicStreamFactory::Job { 327 class QuicStreamFactory::Job {
328 public: 328 public:
329 Job(QuicStreamFactory* factory, 329 Job(QuicStreamFactory* factory,
330 HostResolver* host_resolver, 330 HostResolver* host_resolver,
331 const QuicSessionKey& key, 331 const QuicSessionKey& key,
332 bool was_alternative_service_recently_broken, 332 bool was_alternative_service_recently_broken,
333 int cert_verify_flags, 333 int cert_verify_flags,
334 std::unique_ptr<QuicServerInfo> server_info,
334 const NetLogWithSource& net_log); 335 const NetLogWithSource& net_log);
335 336
337 // Creates a new job to handle the resumption of for connecting an
338 // existing session.
339 Job(QuicStreamFactory* factory,
340 HostResolver* host_resolver,
341 QuicChromiumClientSession* session,
342 const QuicSessionKey& key);
343
336 ~Job(); 344 ~Job();
337 345
338 int Run(const CompletionCallback& callback); 346 int Run(const CompletionCallback& callback);
339 347
340 int DoLoop(int rv); 348 int DoLoop(int rv);
341 int DoResolveHost(); 349 int DoResolveHost();
342 int DoResolveHostComplete(int rv); 350 int DoResolveHostComplete(int rv);
351 int DoLoadServerInfo();
352 int DoLoadServerInfoComplete(int rv);
343 int DoConnect(); 353 int DoConnect();
344 int DoConnectComplete(int rv); 354 int DoConnectComplete(int rv);
345 355
346 void OnIOComplete(int rv); 356 void OnIOComplete(int rv);
347 357
358 void RunAuxilaryJob();
359
348 void Cancel(); 360 void Cancel();
349 361
362 void CancelWaitForDataReadyCallback();
363
350 const QuicSessionKey& key() const { return key_; } 364 const QuicSessionKey& key() const { return key_; }
351 365
352 const NetLogWithSource& net_log() const { return net_log_; } 366 const NetLogWithSource& net_log() const { return net_log_; }
353 367
354 base::WeakPtr<Job> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 368 base::WeakPtr<Job> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
355 369
356 // Returns the estimate of dynamically allocated memory in bytes. 370 // Returns the estimate of dynamically allocated memory in bytes.
357 size_t EstimateMemoryUsage() const; 371 size_t EstimateMemoryUsage() const;
358 372
359 private: 373 private:
360 enum IoState { 374 enum IoState {
361 STATE_NONE, 375 STATE_NONE,
362 STATE_RESOLVE_HOST, 376 STATE_RESOLVE_HOST,
363 STATE_RESOLVE_HOST_COMPLETE, 377 STATE_RESOLVE_HOST_COMPLETE,
378 STATE_LOAD_SERVER_INFO,
379 STATE_LOAD_SERVER_INFO_COMPLETE,
364 STATE_CONNECT, 380 STATE_CONNECT,
365 STATE_CONNECT_COMPLETE, 381 STATE_CONNECT_COMPLETE,
366 }; 382 };
367 IoState io_state_; 383 IoState io_state_;
368 384
369 QuicStreamFactory* factory_; 385 QuicStreamFactory* factory_;
370 HostResolver* host_resolver_; 386 HostResolver* host_resolver_;
371 std::unique_ptr<HostResolver::Request> request_; 387 std::unique_ptr<HostResolver::Request> request_;
372 const QuicSessionKey key_; 388 const QuicSessionKey key_;
373 const int cert_verify_flags_; 389 const int cert_verify_flags_;
374 const bool was_alternative_service_recently_broken_; 390 const bool was_alternative_service_recently_broken_;
391 std::unique_ptr<QuicServerInfo> server_info_;
392 bool started_another_job_;
375 const NetLogWithSource net_log_; 393 const NetLogWithSource net_log_;
376 int num_sent_client_hellos_; 394 int num_sent_client_hellos_;
377 QuicChromiumClientSession* session_; 395 QuicChromiumClientSession* session_;
378 CompletionCallback callback_; 396 CompletionCallback callback_;
379 AddressList address_list_; 397 AddressList address_list_;
380 base::TimeTicks dns_resolution_start_time_; 398 base::TimeTicks dns_resolution_start_time_;
381 base::TimeTicks dns_resolution_end_time_; 399 base::TimeTicks dns_resolution_end_time_;
382 base::WeakPtrFactory<Job> weak_factory_; 400 base::WeakPtrFactory<Job> weak_factory_;
383 DISALLOW_COPY_AND_ASSIGN(Job); 401 DISALLOW_COPY_AND_ASSIGN(Job);
384 }; 402 };
385 403
386 QuicStreamFactory::Job::Job(QuicStreamFactory* factory, 404 QuicStreamFactory::Job::Job(QuicStreamFactory* factory,
387 HostResolver* host_resolver, 405 HostResolver* host_resolver,
388 const QuicSessionKey& key, 406 const QuicSessionKey& key,
389 bool was_alternative_service_recently_broken, 407 bool was_alternative_service_recently_broken,
390 int cert_verify_flags, 408 int cert_verify_flags,
409 std::unique_ptr<QuicServerInfo> server_info,
391 const NetLogWithSource& net_log) 410 const NetLogWithSource& net_log)
392 : io_state_(STATE_RESOLVE_HOST), 411 : io_state_(STATE_RESOLVE_HOST),
393 factory_(factory), 412 factory_(factory),
394 host_resolver_(host_resolver), 413 host_resolver_(host_resolver),
395 key_(key), 414 key_(key),
396 cert_verify_flags_(cert_verify_flags), 415 cert_verify_flags_(cert_verify_flags),
397 was_alternative_service_recently_broken_( 416 was_alternative_service_recently_broken_(
398 was_alternative_service_recently_broken), 417 was_alternative_service_recently_broken),
418 server_info_(std::move(server_info)),
419 started_another_job_(false),
399 net_log_( 420 net_log_(
400 NetLogWithSource::Make(net_log.net_log(), 421 NetLogWithSource::Make(net_log.net_log(),
401 NetLogSourceType::QUIC_STREAM_FACTORY_JOB)), 422 NetLogSourceType::QUIC_STREAM_FACTORY_JOB)),
402 num_sent_client_hellos_(0), 423 num_sent_client_hellos_(0),
403 session_(nullptr), 424 session_(nullptr),
404 weak_factory_(this) { 425 weak_factory_(this) {
405 net_log_.BeginEvent( 426 net_log_.BeginEvent(
406 NetLogEventType::QUIC_STREAM_FACTORY_JOB, 427 NetLogEventType::QUIC_STREAM_FACTORY_JOB,
407 base::Bind(&NetLogQuicStreamFactoryJobCallback, &key_.server_id())); 428 base::Bind(&NetLogQuicStreamFactoryJobCallback, &key_.server_id()));
408 // Associate |net_log_| with |net_log|. 429 // Associate |net_log_| with |net_log|.
409 net_log_.AddEvent( 430 net_log_.AddEvent(
410 NetLogEventType::QUIC_STREAM_FACTORY_JOB_BOUND_TO_HTTP_STREAM_JOB, 431 NetLogEventType::QUIC_STREAM_FACTORY_JOB_BOUND_TO_HTTP_STREAM_JOB,
411 net_log.source().ToEventParametersCallback()); 432 net_log.source().ToEventParametersCallback());
412 net_log.AddEvent( 433 net_log.AddEvent(
413 NetLogEventType::HTTP_STREAM_JOB_BOUND_TO_QUIC_STREAM_FACTORY_JOB, 434 NetLogEventType::HTTP_STREAM_JOB_BOUND_TO_QUIC_STREAM_FACTORY_JOB,
414 net_log_.source().ToEventParametersCallback()); 435 net_log_.source().ToEventParametersCallback());
415 } 436 }
416 437
417 QuicStreamFactory::Job::~Job() { 438 QuicStreamFactory::Job::~Job() {
418 net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB); 439 net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB);
419 DCHECK(callback_.is_null()); 440 DCHECK(callback_.is_null());
441
442 // If disk cache has a pending WaitForDataReadyCallback, cancel that callback.
443 if (server_info_)
444 server_info_->ResetWaitForDataReadyCallback();
420 } 445 }
421 446
422 int QuicStreamFactory::Job::Run(const CompletionCallback& callback) { 447 int QuicStreamFactory::Job::Run(const CompletionCallback& callback) {
423 int rv = DoLoop(OK); 448 int rv = DoLoop(OK);
424 if (rv == ERR_IO_PENDING) 449 if (rv == ERR_IO_PENDING)
425 callback_ = callback; 450 callback_ = callback;
426 451
427 return rv > 0 ? OK : rv; 452 return rv > 0 ? OK : rv;
428 } 453 }
429 454
430 int QuicStreamFactory::Job::DoLoop(int rv) { 455 int QuicStreamFactory::Job::DoLoop(int rv) {
431 TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::Job::DoLoop"); 456 TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::Job::DoLoop");
432 do { 457 do {
433 IoState state = io_state_; 458 IoState state = io_state_;
434 io_state_ = STATE_NONE; 459 io_state_ = STATE_NONE;
435 switch (state) { 460 switch (state) {
436 case STATE_RESOLVE_HOST: 461 case STATE_RESOLVE_HOST:
437 CHECK_EQ(OK, rv); 462 CHECK_EQ(OK, rv);
438 rv = DoResolveHost(); 463 rv = DoResolveHost();
439 break; 464 break;
440 case STATE_RESOLVE_HOST_COMPLETE: 465 case STATE_RESOLVE_HOST_COMPLETE:
441 rv = DoResolveHostComplete(rv); 466 rv = DoResolveHostComplete(rv);
442 break; 467 break;
468 case STATE_LOAD_SERVER_INFO:
469 CHECK_EQ(OK, rv);
470 rv = DoLoadServerInfo();
471 break;
472 case STATE_LOAD_SERVER_INFO_COMPLETE:
473 rv = DoLoadServerInfoComplete(rv);
474 break;
443 case STATE_CONNECT: 475 case STATE_CONNECT:
444 CHECK_EQ(OK, rv); 476 CHECK_EQ(OK, rv);
445 rv = DoConnect(); 477 rv = DoConnect();
446 break; 478 break;
447 case STATE_CONNECT_COMPLETE: 479 case STATE_CONNECT_COMPLETE:
448 rv = DoConnectComplete(rv); 480 rv = DoConnectComplete(rv);
449 break; 481 break;
450 default: 482 default:
451 NOTREACHED() << "io_state_: " << io_state_; 483 NOTREACHED() << "io_state_: " << io_state_;
452 break; 484 break;
453 } 485 }
454 } while (io_state_ != STATE_NONE && rv != ERR_IO_PENDING); 486 } while (io_state_ != STATE_NONE && rv != ERR_IO_PENDING);
455 return rv; 487 return rv;
456 } 488 }
457 489
458 void QuicStreamFactory::Job::OnIOComplete(int rv) { 490 void QuicStreamFactory::Job::OnIOComplete(int rv) {
459 rv = DoLoop(rv); 491 rv = DoLoop(rv);
460 if (rv != ERR_IO_PENDING && !callback_.is_null()) 492 if (rv != ERR_IO_PENDING && !callback_.is_null())
461 base::ResetAndReturn(&callback_).Run(rv); 493 base::ResetAndReturn(&callback_).Run(rv);
462 } 494 }
463 495
496 void QuicStreamFactory::Job::RunAuxilaryJob() {
497 int rv = Run(base::Bind(&QuicStreamFactory::OnJobComplete,
498 base::Unretained(factory_), this));
499 if (rv != ERR_IO_PENDING)
500 factory_->OnJobComplete(this, rv);
501 }
502
464 void QuicStreamFactory::Job::Cancel() { 503 void QuicStreamFactory::Job::Cancel() {
465 callback_.Reset(); 504 callback_.Reset();
466 if (session_) 505 if (session_)
467 session_->connection()->CloseConnection( 506 session_->connection()->CloseConnection(
468 QUIC_CONNECTION_CANCELLED, "New job canceled.", 507 QUIC_CONNECTION_CANCELLED, "New job canceled.",
469 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); 508 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
470 } 509 }
471 510
511 void QuicStreamFactory::Job::CancelWaitForDataReadyCallback() {
512 // If we are waiting for WaitForDataReadyCallback, then cancel the callback.
513 if (io_state_ != STATE_LOAD_SERVER_INFO_COMPLETE)
514 return;
515 server_info_->CancelWaitForDataReadyCallback();
516 OnIOComplete(OK);
517 }
518
472 size_t QuicStreamFactory::Job::EstimateMemoryUsage() const { 519 size_t QuicStreamFactory::Job::EstimateMemoryUsage() const {
473 return base::trace_event::EstimateMemoryUsage(key_); 520 return base::trace_event::EstimateMemoryUsage(key_) +
521 base::trace_event::EstimateMemoryUsage(server_info_);
474 } 522 }
475 523
476 int QuicStreamFactory::Job::DoResolveHost() { 524 int QuicStreamFactory::Job::DoResolveHost() {
477 dns_resolution_start_time_ = base::TimeTicks::Now(); 525 dns_resolution_start_time_ = base::TimeTicks::Now();
526 // Start loading the data now, and wait for it after we resolve the host.
527 if (server_info_)
528 server_info_->Start();
478 529
479 io_state_ = STATE_RESOLVE_HOST_COMPLETE; 530 io_state_ = STATE_RESOLVE_HOST_COMPLETE;
480 return host_resolver_->Resolve( 531 return host_resolver_->Resolve(
481 HostResolver::RequestInfo(key_.destination()), DEFAULT_PRIORITY, 532 HostResolver::RequestInfo(key_.destination()), DEFAULT_PRIORITY,
482 &address_list_, 533 &address_list_,
483 base::Bind(&QuicStreamFactory::Job::OnIOComplete, GetWeakPtr()), 534 base::Bind(&QuicStreamFactory::Job::OnIOComplete, GetWeakPtr()),
484 &request_, net_log_); 535 &request_, net_log_);
485 } 536 }
486 537
487 int QuicStreamFactory::Job::DoResolveHostComplete(int rv) { 538 int QuicStreamFactory::Job::DoResolveHostComplete(int rv) {
488 dns_resolution_end_time_ = base::TimeTicks::Now(); 539 dns_resolution_end_time_ = base::TimeTicks::Now();
489 if (rv != OK) 540 if (rv != OK)
490 return rv; 541 return rv;
491 542
492 DCHECK(!factory_->HasActiveSession(key_.server_id())); 543 DCHECK(!factory_->HasActiveSession(key_.server_id()));
493 544
494 // Inform the factory of this resolution, which will set up 545 // Inform the factory of this resolution, which will set up
495 // a session alias, if possible. 546 // a session alias, if possible.
496 if (factory_->OnResolution(key_, address_list_)) 547 if (factory_->OnResolution(key_, address_list_))
497 return OK; 548 return OK;
498 549
550 if (server_info_)
551 io_state_ = STATE_LOAD_SERVER_INFO;
552 else
553 io_state_ = STATE_CONNECT;
554 return OK;
555 }
556
557 int QuicStreamFactory::Job::DoLoadServerInfo() {
558 net_log_.BeginEvent(
559 NetLogEventType::QUIC_STREAM_FACTORY_JOB_LOAD_SERVER_INFO);
560
561 io_state_ = STATE_LOAD_SERVER_INFO_COMPLETE;
562
563 DCHECK(server_info_);
564
565 // To mitigate the effects of disk cache taking too long to load QUIC server
566 // information, set up a timer to cancel WaitForDataReady's callback.
567 if (factory_->load_server_info_timeout_srtt_multiplier_ > 0) {
568 const int kMaxLoadServerInfoTimeoutMs = 50;
569 // Wait for DiskCache a maximum of 50ms.
570 int64_t load_server_info_timeout_ms =
571 std::min(static_cast<int>(
572 (factory_->load_server_info_timeout_srtt_multiplier_ *
573 factory_->GetServerNetworkStatsSmoothedRttInMicroseconds(
574 key_.server_id())) /
575 1000),
576 kMaxLoadServerInfoTimeoutMs);
577 if (load_server_info_timeout_ms > 0) {
578 factory_->task_runner_->PostDelayedTask(
579 FROM_HERE,
580 base::Bind(&QuicStreamFactory::Job::CancelWaitForDataReadyCallback,
581 GetWeakPtr()),
582 base::TimeDelta::FromMilliseconds(load_server_info_timeout_ms));
583 }
584 }
585
586 int rv = server_info_->WaitForDataReady(
587 base::Bind(&QuicStreamFactory::Job::OnIOComplete, GetWeakPtr()));
588 if (rv == ERR_IO_PENDING && factory_->enable_connection_racing()) {
589 // If we are waiting to load server config from the disk cache, then start
590 // another job.
591 started_another_job_ = true;
592 factory_->CreateAuxilaryJob(key_, cert_verify_flags_, net_log_);
593 }
594 return rv;
595 }
596
597 int QuicStreamFactory::Job::DoLoadServerInfoComplete(int rv) {
598 net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB_LOAD_SERVER_INFO);
599 UMA_HISTOGRAM_TIMES("Net.QuicServerInfo.DiskCacheWaitForDataReadyTime",
600 base::TimeTicks::Now() - dns_resolution_end_time_);
601
602 if (rv != OK)
603 server_info_.reset();
604
605 if (started_another_job_ &&
606 (!server_info_ || server_info_->state().server_config.empty() ||
607 !factory_->CryptoConfigCacheIsEmpty(key_.server_id()))) {
608 // If we have started another job and if we didn't load the server config
609 // from the disk cache or if we have received a new server config from the
610 // server, then cancel the current job.
611 io_state_ = STATE_NONE;
612 return ERR_CONNECTION_CLOSED;
613 }
614
499 io_state_ = STATE_CONNECT; 615 io_state_ = STATE_CONNECT;
500 return OK; 616 return OK;
501 } 617 }
502 618
503 int QuicStreamFactory::Job::DoConnect() { 619 int QuicStreamFactory::Job::DoConnect() {
504 io_state_ = STATE_CONNECT_COMPLETE; 620 io_state_ = STATE_CONNECT_COMPLETE;
505 621
506 bool require_confirmation = factory_->require_confirmation() || 622 bool require_confirmation = factory_->require_confirmation() ||
507 was_alternative_service_recently_broken_; 623 was_alternative_service_recently_broken_;
508 net_log_.BeginEvent( 624 net_log_.BeginEvent(
509 NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT, 625 NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT,
510 NetLog::BoolCallback("require_confirmation", require_confirmation)); 626 NetLog::BoolCallback("require_confirmation", require_confirmation));
511 627
512 int rv = 628 int rv = factory_->CreateSession(
513 factory_->CreateSession(key_, cert_verify_flags_, require_confirmation, 629 key_, cert_verify_flags_, std::move(server_info_), require_confirmation,
514 address_list_, dns_resolution_start_time_, 630 address_list_, dns_resolution_start_time_, dns_resolution_end_time_,
515 dns_resolution_end_time_, net_log_, &session_); 631 net_log_, &session_);
516 if (rv != OK) { 632 if (rv != OK) {
517 DCHECK(rv != ERR_IO_PENDING); 633 DCHECK(rv != ERR_IO_PENDING);
518 DCHECK(!session_); 634 DCHECK(!session_);
519 return rv; 635 return rv;
520 } 636 }
521 637
522 if (!session_->connection()->connected()) 638 if (!session_->connection()->connected())
523 return ERR_CONNECTION_CLOSED; 639 return ERR_CONNECTION_CLOSED;
524 640
525 session_->StartReading(); 641 session_->StartReading();
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 ChannelIDService* channel_id_service, 764 ChannelIDService* channel_id_service,
649 TransportSecurityState* transport_security_state, 765 TransportSecurityState* transport_security_state,
650 CTVerifier* cert_transparency_verifier, 766 CTVerifier* cert_transparency_verifier,
651 SocketPerformanceWatcherFactory* socket_performance_watcher_factory, 767 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
652 QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory, 768 QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory,
653 QuicRandom* random_generator, 769 QuicRandom* random_generator,
654 QuicClock* clock, 770 QuicClock* clock,
655 size_t max_packet_length, 771 size_t max_packet_length,
656 const std::string& user_agent_id, 772 const std::string& user_agent_id,
657 const QuicVersionVector& supported_versions, 773 const QuicVersionVector& supported_versions,
774 float load_server_info_timeout_srtt_multiplier,
775 bool enable_connection_racing,
658 bool enable_non_blocking_io, 776 bool enable_non_blocking_io,
659 bool store_server_configs_in_properties, 777 bool disable_disk_cache,
778 int max_server_configs_stored_in_properties,
660 bool close_sessions_on_ip_change, 779 bool close_sessions_on_ip_change,
661 bool mark_quic_broken_when_network_blackholes, 780 bool mark_quic_broken_when_network_blackholes,
662 int idle_connection_timeout_seconds, 781 int idle_connection_timeout_seconds,
663 int reduced_ping_timeout_seconds, 782 int reduced_ping_timeout_seconds,
664 int packet_reader_yield_after_duration_milliseconds, 783 int packet_reader_yield_after_duration_milliseconds,
665 bool migrate_sessions_on_network_change, 784 bool migrate_sessions_on_network_change,
666 bool migrate_sessions_early, 785 bool migrate_sessions_early,
667 bool allow_server_migration, 786 bool allow_server_migration,
668 bool force_hol_blocking, 787 bool force_hol_blocking,
669 bool race_cert_verification, 788 bool race_cert_verification,
(...skipping 17 matching lines...) Expand all
687 clock_skew_detector_(base::TimeTicks::Now(), base::Time::Now()), 806 clock_skew_detector_(base::TimeTicks::Now(), base::Time::Now()),
688 socket_performance_watcher_factory_(socket_performance_watcher_factory), 807 socket_performance_watcher_factory_(socket_performance_watcher_factory),
689 config_(InitializeQuicConfig(connection_options, 808 config_(InitializeQuicConfig(connection_options,
690 idle_connection_timeout_seconds)), 809 idle_connection_timeout_seconds)),
691 crypto_config_(base::WrapUnique( 810 crypto_config_(base::WrapUnique(
692 new ProofVerifierChromium(cert_verifier, 811 new ProofVerifierChromium(cert_verifier,
693 ct_policy_enforcer, 812 ct_policy_enforcer,
694 transport_security_state, 813 transport_security_state,
695 cert_transparency_verifier))), 814 cert_transparency_verifier))),
696 supported_versions_(supported_versions), 815 supported_versions_(supported_versions),
816 load_server_info_timeout_srtt_multiplier_(
817 load_server_info_timeout_srtt_multiplier),
818 enable_connection_racing_(enable_connection_racing),
697 enable_non_blocking_io_(enable_non_blocking_io), 819 enable_non_blocking_io_(enable_non_blocking_io),
820 disable_disk_cache_(disable_disk_cache),
698 mark_quic_broken_when_network_blackholes_( 821 mark_quic_broken_when_network_blackholes_(
699 mark_quic_broken_when_network_blackholes), 822 mark_quic_broken_when_network_blackholes),
700 store_server_configs_in_properties_(store_server_configs_in_properties),
701 ping_timeout_(QuicTime::Delta::FromSeconds(kPingTimeoutSecs)), 823 ping_timeout_(QuicTime::Delta::FromSeconds(kPingTimeoutSecs)),
702 reduced_ping_timeout_( 824 reduced_ping_timeout_(
703 QuicTime::Delta::FromSeconds(reduced_ping_timeout_seconds)), 825 QuicTime::Delta::FromSeconds(reduced_ping_timeout_seconds)),
704 yield_after_packets_(kQuicYieldAfterPacketsRead), 826 yield_after_packets_(kQuicYieldAfterPacketsRead),
705 yield_after_duration_(QuicTime::Delta::FromMilliseconds( 827 yield_after_duration_(QuicTime::Delta::FromMilliseconds(
706 packet_reader_yield_after_duration_milliseconds)), 828 packet_reader_yield_after_duration_milliseconds)),
707 close_sessions_on_ip_change_(close_sessions_on_ip_change), 829 close_sessions_on_ip_change_(close_sessions_on_ip_change),
708 migrate_sessions_on_network_change_( 830 migrate_sessions_on_network_change_(
709 migrate_sessions_on_network_change && 831 migrate_sessions_on_network_change &&
710 NetworkChangeNotifier::AreNetworkHandlesSupported()), 832 NetworkChangeNotifier::AreNetworkHandlesSupported()),
711 migrate_sessions_early_(migrate_sessions_early && 833 migrate_sessions_early_(migrate_sessions_early &&
712 migrate_sessions_on_network_change_), 834 migrate_sessions_on_network_change_),
713 allow_server_migration_(allow_server_migration), 835 allow_server_migration_(allow_server_migration),
714 force_hol_blocking_(force_hol_blocking), 836 force_hol_blocking_(force_hol_blocking),
715 race_cert_verification_(race_cert_verification), 837 race_cert_verification_(race_cert_verification),
716 do_not_fragment_(do_not_fragment), 838 do_not_fragment_(do_not_fragment),
717 estimate_initial_rtt(estimate_initial_rtt), 839 estimate_initial_rtt(estimate_initial_rtt),
718 check_persisted_supports_quic_(true), 840 check_persisted_supports_quic_(true),
841 has_initialized_data_(false),
719 num_push_streams_created_(0), 842 num_push_streams_created_(0),
720 task_runner_(nullptr), 843 task_runner_(nullptr),
721 ssl_config_service_(ssl_config_service), 844 ssl_config_service_(ssl_config_service),
722 weak_factory_(this) { 845 weak_factory_(this) {
723 if (ssl_config_service_.get()) 846 if (ssl_config_service_.get())
724 ssl_config_service_->AddObserver(this); 847 ssl_config_service_->AddObserver(this);
725 DCHECK(transport_security_state_); 848 DCHECK(transport_security_state_);
726 DCHECK(http_server_properties_); 849 DCHECK(http_server_properties_);
727 crypto_config_.set_user_agent_id(user_agent_id); 850 crypto_config_.set_user_agent_id(user_agent_id);
728 crypto_config_.AddCanonicalSuffix(".c.youtube.com"); 851 crypto_config_.AddCanonicalSuffix(".c.youtube.com");
729 crypto_config_.AddCanonicalSuffix(".ggpht.com"); 852 crypto_config_.AddCanonicalSuffix(".ggpht.com");
730 crypto_config_.AddCanonicalSuffix(".googlevideo.com"); 853 crypto_config_.AddCanonicalSuffix(".googlevideo.com");
731 crypto_config_.AddCanonicalSuffix(".googleusercontent.com"); 854 crypto_config_.AddCanonicalSuffix(".googleusercontent.com");
732 // TODO(rtenneti): http://crbug.com/487355. Temporary fix for b/20760730 until 855 // TODO(rtenneti): http://crbug.com/487355. Temporary fix for b/20760730 until
733 // channel_id_service is supported in cronet. 856 // channel_id_service is supported in cronet.
734 if (channel_id_service) { 857 if (channel_id_service) {
735 crypto_config_.SetChannelIDSource( 858 crypto_config_.SetChannelIDSource(
736 new ChannelIDSourceChromium(channel_id_service)); 859 new ChannelIDSourceChromium(channel_id_service));
737 } 860 }
738 if (enable_token_binding && channel_id_service) 861 if (enable_token_binding && channel_id_service)
739 crypto_config_.tb_key_params.push_back(kTB10); 862 crypto_config_.tb_key_params.push_back(kTB10);
740 crypto::EnsureOpenSSLInit(); 863 crypto::EnsureOpenSSLInit();
741 bool has_aes_hardware_support = !!EVP_has_aes_hardware(); 864 bool has_aes_hardware_support = !!EVP_has_aes_hardware();
742 UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.PreferAesGcm", 865 UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.PreferAesGcm",
743 has_aes_hardware_support); 866 has_aes_hardware_support);
744 if (has_aes_hardware_support) 867 if (has_aes_hardware_support)
745 crypto_config_.PreferAesGcm(); 868 crypto_config_.PreferAesGcm();
869 // When disk cache is used to store the server configs, HttpCache code calls
870 // |set_quic_server_info_factory| if |quic_server_info_factory_| wasn't
871 // created.
872 if (max_server_configs_stored_in_properties > 0) {
873 quic_server_info_factory_.reset(
874 new PropertiesBasedQuicServerInfoFactory(http_server_properties_));
875 }
746 876
747 // migrate_sessions_early should only be set to true if 877 // migrate_sessions_early should only be set to true if
748 // migrate_sessions_on_network_change is set to true. 878 // migrate_sessions_on_network_change is set to true.
749 if (migrate_sessions_early) 879 if (migrate_sessions_early)
750 DCHECK(migrate_sessions_on_network_change); 880 DCHECK(migrate_sessions_on_network_change);
751 // close_sessions_on_ip_change and migrate_sessions_on_network_change should 881 // close_sessions_on_ip_change and migrate_sessions_on_network_change should
752 // never be simultaneously set to true. 882 // never be simultaneously set to true.
753 DCHECK(!(close_sessions_on_ip_change && migrate_sessions_on_network_change)); 883 DCHECK(!(close_sessions_on_ip_change && migrate_sessions_on_network_change));
754 884
755 if (migrate_sessions_on_network_change_) { 885 if (migrate_sessions_on_network_change_) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 int64_t srtt = 923 int64_t srtt =
794 1.5 * GetServerNetworkStatsSmoothedRttInMicroseconds(server_id); 924 1.5 * GetServerNetworkStatsSmoothedRttInMicroseconds(server_id);
795 // Picked 300ms based on mean time from 925 // Picked 300ms based on mean time from
796 // Net.QuicSession.HostResolution.HandshakeConfirmedTime histogram. 926 // Net.QuicSession.HostResolution.HandshakeConfirmedTime histogram.
797 const int kDefaultRTT = 300 * kNumMicrosPerMilli; 927 const int kDefaultRTT = 300 * kNumMicrosPerMilli;
798 if (!srtt) 928 if (!srtt)
799 srtt = kDefaultRTT; 929 srtt = kDefaultRTT;
800 return base::TimeDelta::FromMicroseconds(srtt); 930 return base::TimeDelta::FromMicroseconds(srtt);
801 } 931 }
802 932
933 void QuicStreamFactory::set_quic_server_info_factory(
934 QuicServerInfoFactory* quic_server_info_factory) {
935 quic_server_info_factory_.reset(quic_server_info_factory);
936 }
937
803 void QuicStreamFactory::DumpMemoryStats( 938 void QuicStreamFactory::DumpMemoryStats(
804 base::trace_event::ProcessMemoryDump* pmd, 939 base::trace_event::ProcessMemoryDump* pmd,
805 const std::string& parent_absolute_name) const { 940 const std::string& parent_absolute_name) const {
806 if (all_sessions_.empty() && active_jobs_.empty()) 941 if (all_sessions_.empty() && active_jobs_.empty())
807 return; 942 return;
808 base::trace_event::MemoryAllocatorDump* factory_dump = 943 base::trace_event::MemoryAllocatorDump* factory_dump =
809 pmd->CreateAllocatorDump(parent_absolute_name + "/quic_stream_factory"); 944 pmd->CreateAllocatorDump(parent_absolute_name + "/quic_stream_factory");
810 size_t memory_estimate = 945 size_t memory_estimate =
811 base::trace_event::EstimateMemoryUsage(all_sessions_) + 946 base::trace_event::EstimateMemoryUsage(all_sessions_) +
812 base::trace_event::EstimateMemoryUsage(active_sessions_) + 947 base::trace_event::EstimateMemoryUsage(active_sessions_) +
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 return OK; 1062 return OK;
928 } 1063 }
929 } 1064 }
930 } 1065 }
931 1066
932 // TODO(rtenneti): |task_runner_| is used by the Job. Initialize task_runner_ 1067 // TODO(rtenneti): |task_runner_| is used by the Job. Initialize task_runner_
933 // in the constructor after WebRequestActionWithThreadsTest.* tests are fixed. 1068 // in the constructor after WebRequestActionWithThreadsTest.* tests are fixed.
934 if (!task_runner_) 1069 if (!task_runner_)
935 task_runner_ = base::ThreadTaskRunnerHandle::Get().get(); 1070 task_runner_ = base::ThreadTaskRunnerHandle::Get().get();
936 1071
1072 std::unique_ptr<QuicServerInfo> quic_server_info;
1073 if (quic_server_info_factory_.get()) {
1074 bool load_from_disk_cache = !disable_disk_cache_;
1075 MaybeInitialize();
1076 if (!base::ContainsKey(quic_supported_servers_at_startup_, destination)) {
1077 // If there is no entry for QUIC, consider that as a new server and
1078 // don't wait for Cache thread to load the data for that server.
1079 load_from_disk_cache = false;
1080 }
1081 if (load_from_disk_cache && CryptoConfigCacheIsEmpty(server_id))
1082 quic_server_info = quic_server_info_factory_->GetForServer(server_id);
1083 }
1084
937 ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log)); 1085 ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log));
938 1086
939 QuicSessionKey key(destination, server_id); 1087 QuicSessionKey key(destination, server_id);
940 std::unique_ptr<Job> job = base::MakeUnique<Job>( 1088 std::unique_ptr<Job> job = base::MakeUnique<Job>(
941 this, host_resolver_, key, WasQuicRecentlyBroken(server_id), 1089 this, host_resolver_, key, WasQuicRecentlyBroken(server_id),
942 cert_verify_flags, net_log); 1090 cert_verify_flags, std::move(quic_server_info), net_log);
943 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, 1091 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete,
944 base::Unretained(this), job.get())); 1092 base::Unretained(this), job.get()));
945 if (rv == ERR_IO_PENDING) { 1093 if (rv == ERR_IO_PENDING) {
946 job_requests_map_[server_id].insert(request); 1094 job_requests_map_[server_id].insert(request);
947 Job* job_ptr = job.get(); 1095 Job* job_ptr = job.get();
948 active_jobs_[server_id][job_ptr] = std::move(job); 1096 active_jobs_[server_id][job_ptr] = std::move(job);
949 return rv; 1097 return rv;
950 } 1098 }
951 if (rv == OK) { 1099 if (rv == OK) {
952 // TODO(rtenneti): crbug.com/498823 - revert active_sessions_.empty() 1100 // TODO(rtenneti): crbug.com/498823 - revert active_sessions_.empty()
(...skipping 25 matching lines...) Expand all
978 const QuicSessionKey& other) const { 1126 const QuicSessionKey& other) const {
979 return destination_.Equals(other.destination_) && 1127 return destination_.Equals(other.destination_) &&
980 server_id_ == other.server_id_; 1128 server_id_ == other.server_id_;
981 } 1129 }
982 1130
983 size_t QuicStreamFactory::QuicSessionKey::EstimateMemoryUsage() const { 1131 size_t QuicStreamFactory::QuicSessionKey::EstimateMemoryUsage() const {
984 return base::trace_event::EstimateMemoryUsage(destination_) + 1132 return base::trace_event::EstimateMemoryUsage(destination_) +
985 EstimateServerIdMemoryUsage(server_id_); 1133 EstimateServerIdMemoryUsage(server_id_);
986 } 1134 }
987 1135
1136 void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key,
1137 int cert_verify_flags,
1138 const NetLogWithSource& net_log) {
1139 Job* aux_job =
1140 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()),
1141 cert_verify_flags, nullptr, net_log);
1142 active_jobs_[key.server_id()][aux_job] = base::WrapUnique(aux_job);
1143 task_runner_->PostTask(FROM_HERE,
1144 base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob,
1145 aux_job->GetWeakPtr()));
1146 }
1147
988 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key, 1148 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key,
989 const AddressList& address_list) { 1149 const AddressList& address_list) {
990 const QuicServerId& server_id(key.server_id()); 1150 const QuicServerId& server_id(key.server_id());
991 DCHECK(!HasActiveSession(server_id)); 1151 DCHECK(!HasActiveSession(server_id));
992 for (const IPEndPoint& address : address_list) { 1152 for (const IPEndPoint& address : address_list) {
993 if (!base::ContainsKey(ip_aliases_, address)) 1153 if (!base::ContainsKey(ip_aliases_, address))
994 continue; 1154 continue;
995 1155
996 const SessionSet& sessions = ip_aliases_[address]; 1156 const SessionSet& sessions = ip_aliases_[address];
997 for (QuicChromiumClientSession* session : sessions) { 1157 for (QuicChromiumClientSession* session : sessions) {
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 require_confirmation_ = false; 1636 require_confirmation_ = false;
1477 } 1637 }
1478 } 1638 }
1479 1639
1480 return OK; 1640 return OK;
1481 } 1641 }
1482 1642
1483 int QuicStreamFactory::CreateSession( 1643 int QuicStreamFactory::CreateSession(
1484 const QuicSessionKey& key, 1644 const QuicSessionKey& key,
1485 int cert_verify_flags, 1645 int cert_verify_flags,
1646 std::unique_ptr<QuicServerInfo> server_info,
1486 bool require_confirmation, 1647 bool require_confirmation,
1487 const AddressList& address_list, 1648 const AddressList& address_list,
1488 base::TimeTicks dns_resolution_start_time, 1649 base::TimeTicks dns_resolution_start_time,
1489 base::TimeTicks dns_resolution_end_time, 1650 base::TimeTicks dns_resolution_end_time,
1490 const NetLogWithSource& net_log, 1651 const NetLogWithSource& net_log,
1491 QuicChromiumClientSession** session) { 1652 QuicChromiumClientSession** session) {
1492 TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::CreateSession"); 1653 TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::CreateSession");
1493 IPEndPoint addr = *address_list.begin(); 1654 IPEndPoint addr = *address_list.begin();
1494 const QuicServerId& server_id = key.server_id(); 1655 const QuicServerId& server_id = key.server_id();
1495 DatagramSocket::BindType bind_type = DatagramSocket::DEFAULT_BIND; 1656 DatagramSocket::BindType bind_type = DatagramSocket::DEFAULT_BIND;
1496 std::unique_ptr<DatagramClientSocket> socket( 1657 std::unique_ptr<DatagramClientSocket> socket(
1497 client_socket_factory_->CreateDatagramClientSocket( 1658 client_socket_factory_->CreateDatagramClientSocket(
1498 bind_type, RandIntCallback(), net_log.net_log(), net_log.source())); 1659 bind_type, RandIntCallback(), net_log.net_log(), net_log.source()));
1499 1660
1500 // Passing in kInvalidNetworkHandle binds socket to default network. 1661 // Passing in kInvalidNetworkHandle binds socket to default network.
1501 int rv = ConfigureSocket(socket.get(), addr, 1662 int rv = ConfigureSocket(socket.get(), addr,
1502 NetworkChangeNotifier::kInvalidNetworkHandle); 1663 NetworkChangeNotifier::kInvalidNetworkHandle);
1503 if (rv != OK) 1664 if (rv != OK)
1504 return rv; 1665 return rv;
1505 1666
1506 if (!helper_.get()) { 1667 if (!helper_.get()) {
1507 helper_.reset(new QuicChromiumConnectionHelper(clock_, random_generator_)); 1668 helper_.reset(new QuicChromiumConnectionHelper(clock_, random_generator_));
1508 } 1669 }
1509 1670
1510 if (!alarm_factory_.get()) { 1671 if (!alarm_factory_.get()) {
1511 alarm_factory_.reset(new QuicChromiumAlarmFactory( 1672 alarm_factory_.reset(new QuicChromiumAlarmFactory(
1512 base::ThreadTaskRunnerHandle::Get().get(), clock_)); 1673 base::ThreadTaskRunnerHandle::Get().get(), clock_));
1513 } 1674 }
1514
1515 QuicConnectionId connection_id = random_generator_->RandUint64(); 1675 QuicConnectionId connection_id = random_generator_->RandUint64();
1516 std::unique_ptr<QuicServerInfo> server_info;
1517 if (store_server_configs_in_properties_) {
1518 server_info = base::MakeUnique<PropertiesBasedQuicServerInfo>(
1519 server_id, http_server_properties_);
1520 }
1521 InitializeCachedStateInCryptoConfig(server_id, server_info, &connection_id); 1676 InitializeCachedStateInCryptoConfig(server_id, server_info, &connection_id);
1522 1677
1523 QuicChromiumPacketWriter* writer = new QuicChromiumPacketWriter(socket.get()); 1678 QuicChromiumPacketWriter* writer = new QuicChromiumPacketWriter(socket.get());
1524 QuicConnection* connection = new QuicConnection( 1679 QuicConnection* connection = new QuicConnection(
1525 connection_id, QuicSocketAddress(QuicSocketAddressImpl(addr)), 1680 connection_id, QuicSocketAddress(QuicSocketAddressImpl(addr)),
1526 helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */, 1681 helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */,
1527 Perspective::IS_CLIENT, supported_versions_); 1682 Perspective::IS_CLIENT, supported_versions_);
1528 connection->set_ping_timeout(ping_timeout_); 1683 connection->set_ping_timeout(ping_timeout_);
1529 connection->SetMaxPacketLength(max_packet_length_); 1684 connection->SetMaxPacketLength(max_packet_length_);
1530 1685
1531 QuicConfig config = config_; 1686 QuicConfig config = config_;
1532 config.SetSocketReceiveBufferToSend(kQuicSocketReceiveBufferSize); 1687 config.SetSocketReceiveBufferToSend(kQuicSocketReceiveBufferSize);
1533 config.set_max_undecryptable_packets(kMaxUndecryptablePackets); 1688 config.set_max_undecryptable_packets(kMaxUndecryptablePackets);
1534 config.SetInitialSessionFlowControlWindowToSend( 1689 config.SetInitialSessionFlowControlWindowToSend(
1535 kQuicSessionMaxRecvWindowSize); 1690 kQuicSessionMaxRecvWindowSize);
1536 config.SetInitialStreamFlowControlWindowToSend(kQuicStreamMaxRecvWindowSize); 1691 config.SetInitialStreamFlowControlWindowToSend(kQuicStreamMaxRecvWindowSize);
1537 config.SetBytesForConnectionIdToSend(0); 1692 config.SetBytesForConnectionIdToSend(0);
1538 ConfigureInitialRttEstimate(server_id, &config); 1693 ConfigureInitialRttEstimate(server_id, &config);
1539 1694
1540 if (force_hol_blocking_) 1695 if (force_hol_blocking_)
1541 config.SetForceHolBlocking(); 1696 config.SetForceHolBlocking();
1542 1697
1698 if (quic_server_info_factory_.get() && !server_info) {
1699 // Start the disk cache loading so that we can persist the newer QUIC server
1700 // information and/or inform the disk cache that we have reused
1701 // |server_info|.
1702 server_info = quic_server_info_factory_->GetForServer(server_id);
1703 server_info->Start();
1704 }
1705
1543 // Use the factory to create a new socket performance watcher, and pass the 1706 // Use the factory to create a new socket performance watcher, and pass the
1544 // ownership to QuicChromiumClientSession. 1707 // ownership to QuicChromiumClientSession.
1545 std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher; 1708 std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher;
1546 if (socket_performance_watcher_factory_) { 1709 if (socket_performance_watcher_factory_) {
1547 socket_performance_watcher = 1710 socket_performance_watcher =
1548 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher( 1711 socket_performance_watcher_factory_->CreateSocketPerformanceWatcher(
1549 SocketPerformanceWatcherFactory::PROTOCOL_QUIC); 1712 SocketPerformanceWatcherFactory::PROTOCOL_QUIC);
1550 } 1713 }
1551 1714
1552 *session = new QuicChromiumClientSession( 1715 *session = new QuicChromiumClientSession(
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1675 const std::unique_ptr<QuicServerInfo>& server_info, 1838 const std::unique_ptr<QuicServerInfo>& server_info,
1676 QuicConnectionId* connection_id) { 1839 QuicConnectionId* connection_id) {
1677 QuicCryptoClientConfig::CachedState* cached = 1840 QuicCryptoClientConfig::CachedState* cached =
1678 crypto_config_.LookupOrCreate(server_id); 1841 crypto_config_.LookupOrCreate(server_id);
1679 if (cached->has_server_designated_connection_id()) 1842 if (cached->has_server_designated_connection_id())
1680 *connection_id = cached->GetNextServerDesignatedConnectionId(); 1843 *connection_id = cached->GetNextServerDesignatedConnectionId();
1681 1844
1682 if (!cached->IsEmpty()) 1845 if (!cached->IsEmpty())
1683 return; 1846 return;
1684 1847
1685 if (!server_info || !server_info->Load()) 1848 // |server_info| will be NULL, if a non-empty server config already exists in
1849 // the memory cache.
1850 if (!server_info)
1686 return; 1851 return;
1687 1852
1853 // TODO(rtenneti): Delete the following histogram after collecting stats.
1854 // If the AlternativeServiceMap contained an entry for this host, check if
1855 // the disk cache contained an entry for it.
1856 if (base::ContainsKey(quic_supported_servers_at_startup_,
1857 server_id.host_port_pair())) {
1858 UMA_HISTOGRAM_BOOLEAN("Net.QuicServerInfo.ExpectConfigMissingFromDiskCache",
1859 server_info->state().server_config.empty());
1860 }
1861
1688 cached->Initialize(server_info->state().server_config, 1862 cached->Initialize(server_info->state().server_config,
1689 server_info->state().source_address_token, 1863 server_info->state().source_address_token,
1690 server_info->state().certs, server_info->state().cert_sct, 1864 server_info->state().certs, server_info->state().cert_sct,
1691 server_info->state().chlo_hash, 1865 server_info->state().chlo_hash,
1692 server_info->state().server_config_sig, clock_->WallNow(), 1866 server_info->state().server_config_sig, clock_->WallNow(),
1693 QuicWallTime::Zero()); 1867 QuicWallTime::Zero());
1694 } 1868 }
1695 1869
1870 void QuicStreamFactory::MaybeInitialize() {
1871 // We don't initialize data from HttpServerProperties in the constructor
1872 // because HttpServerProperties has not yet initialized. We're guaranteed
1873 // HttpServerProperties has been initialized by the first time a request is
1874 // made.
1875 if (has_initialized_data_)
1876 return;
1877
1878 has_initialized_data_ = true;
1879
1880 // Query the proxy delegate for the default alternative proxy server.
1881 ProxyServer default_alternative_proxy_server =
1882 proxy_delegate_ ? proxy_delegate_->GetDefaultAlternativeProxy()
1883 : ProxyServer();
1884 if (default_alternative_proxy_server.is_quic()) {
1885 quic_supported_servers_at_startup_.insert(
1886 default_alternative_proxy_server.host_port_pair());
1887 }
1888
1889 for (const std::pair<const url::SchemeHostPort, AlternativeServiceInfoVector>&
1890 key_value : http_server_properties_->alternative_service_map()) {
1891 HostPortPair host_port_pair(key_value.first.host(), key_value.first.port());
1892 for (const AlternativeServiceInfo& alternative_service_info :
1893 key_value.second) {
1894 if (alternative_service_info.alternative_service.protocol == kProtoQUIC) {
1895 quic_supported_servers_at_startup_.insert(host_port_pair);
1896 break;
1897 }
1898 }
1899 }
1900
1901 if (http_server_properties_->max_server_configs_stored_in_properties() == 0)
1902 return;
1903 // Create a temporary QuicServerInfo object to deserialize and to populate the
1904 // in-memory crypto server config cache in the MRU order.
1905 std::unique_ptr<QuicServerInfo> server_info;
1906 CompletionCallback callback;
1907 // Get the list of servers to be deserialized first because WaitForDataReady
1908 // touches quic_server_info_map.
1909 const QuicServerInfoMap& quic_server_info_map =
1910 http_server_properties_->quic_server_info_map();
1911 std::vector<QuicServerId> server_list;
1912 for (const auto& key_value : quic_server_info_map)
1913 server_list.push_back(key_value.first);
1914 for (auto it = server_list.rbegin(); it != server_list.rend(); ++it) {
1915 const QuicServerId& server_id = *it;
1916 server_info = quic_server_info_factory_->GetForServer(server_id);
1917 if (server_info->WaitForDataReady(callback) == OK) {
1918 DVLOG(1) << "Initialized server config for: " << server_id.ToString();
1919 InitializeCachedStateInCryptoConfig(server_id, server_info, nullptr);
1920 }
1921 }
1922 }
1923
1696 void QuicStreamFactory::ProcessGoingAwaySession( 1924 void QuicStreamFactory::ProcessGoingAwaySession(
1697 QuicChromiumClientSession* session, 1925 QuicChromiumClientSession* session,
1698 const QuicServerId& server_id, 1926 const QuicServerId& server_id,
1699 bool session_was_active) { 1927 bool session_was_active) {
1700 if (!http_server_properties_) 1928 if (!http_server_properties_)
1701 return; 1929 return;
1702 1930
1703 const QuicConnectionStats& stats = session->connection()->GetStats(); 1931 const QuicConnectionStats& stats = session->connection()->GetStats();
1704 const AlternativeService alternative_service(kProtoQUIC, 1932 const AlternativeService alternative_service(kProtoQUIC,
1705 server_id.host_port_pair()); 1933 server_id.host_port_pair());
(...skipping 30 matching lines...) Expand all
1736 // Since the session was active, there's no longer an 1964 // Since the session was active, there's no longer an
1737 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP 1965 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP
1738 // job also fails. So to avoid not using QUIC when we otherwise could, we mark 1966 // job also fails. So to avoid not using QUIC when we otherwise could, we mark
1739 // it as recently broken, which means that 0-RTT will be disabled but we'll 1967 // it as recently broken, which means that 0-RTT will be disabled but we'll
1740 // still race. 1968 // still race.
1741 http_server_properties_->MarkAlternativeServiceRecentlyBroken( 1969 http_server_properties_->MarkAlternativeServiceRecentlyBroken(
1742 alternative_service); 1970 alternative_service);
1743 } 1971 }
1744 1972
1745 } // namespace net 1973 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/chromium/quic_stream_factory.h ('k') | net/quic/chromium/quic_stream_factory_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698