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

Side by Side Diff: net/socket/client_socket_pool_base.h

Issue 2647003: Do not attempt to reuse active sockets after a socket pool flush (usually a network change). (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Address eroman comments. Created 10 years, 6 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/socket/client_socket_pool.h ('k') | net/socket/client_socket_pool_base.cc » ('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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 // A ClientSocketPoolBase is used to restrict the number of sockets open at 5 // A ClientSocketPoolBase is used to restrict the number of sockets open at
6 // a time. It also maintains a list of idle persistent sockets for reuse. 6 // a time. It also maintains a list of idle persistent sockets for reuse.
7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle 7 // Subclasses of ClientSocketPool should compose ClientSocketPoolBase to handle
8 // the core logic of (1) restricting the number of active (connected or 8 // the core logic of (1) restricting the number of active (connected or
9 // connecting) sockets per "group" (generally speaking, the hostname), (2) 9 // connecting) sockets per "group" (generally speaking, the hostname), (2)
10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3) 10 // maintaining a per-group list of idle, persistent sockets for reuse, and (3)
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 // ClientSocketPoolBaseHelper takes ownership of |request|, which must be 181 // ClientSocketPoolBaseHelper takes ownership of |request|, which must be
182 // heap allocated. 182 // heap allocated.
183 int RequestSocket(const std::string& group_name, const Request* request); 183 int RequestSocket(const std::string& group_name, const Request* request);
184 184
185 // See ClientSocketPool::CancelRequest for documentation on this function. 185 // See ClientSocketPool::CancelRequest for documentation on this function.
186 void CancelRequest(const std::string& group_name, 186 void CancelRequest(const std::string& group_name,
187 const ClientSocketHandle* handle); 187 const ClientSocketHandle* handle);
188 188
189 // See ClientSocketPool::ReleaseSocket for documentation on this function. 189 // See ClientSocketPool::ReleaseSocket for documentation on this function.
190 void ReleaseSocket(const std::string& group_name, 190 void ReleaseSocket(const std::string& group_name,
191 ClientSocket* socket); 191 ClientSocket* socket,
192 int id);
192 193
194 // See ClientSocketPool::Flush for documentation on this function.
195 void Flush();
196
193 // See ClientSocketPool::CloseIdleSockets for documentation on this function. 197 // See ClientSocketPool::CloseIdleSockets for documentation on this function.
194 void CloseIdleSockets(); 198 void CloseIdleSockets();
195 199
196 // See ClientSocketPool::IdleSocketCount() for documentation on this function. 200 // See ClientSocketPool::IdleSocketCount() for documentation on this function.
197 int idle_socket_count() const { 201 int idle_socket_count() const {
198 return idle_socket_count_; 202 return idle_socket_count_;
199 } 203 }
200 204
201 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this 205 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this
202 // function. 206 // function.
203 int IdleSocketCountInGroup(const std::string& group_name) const; 207 int IdleSocketCountInGroup(const std::string& group_name) const;
204 208
205 // See ClientSocketPool::GetLoadState() for documentation on this function. 209 // See ClientSocketPool::GetLoadState() for documentation on this function.
206 LoadState GetLoadState(const std::string& group_name, 210 LoadState GetLoadState(const std::string& group_name,
207 const ClientSocketHandle* handle) const; 211 const ClientSocketHandle* handle) const;
208 212
209 int ConnectRetryIntervalMs() const { 213 int ConnectRetryIntervalMs() const {
210 // TODO(mbelshe): Make this tuned dynamically based on measured RTT. 214 // TODO(mbelshe): Make this tuned dynamically based on measured RTT.
211 // For now, just use the max retry interval. 215 // For now, just use the max retry interval.
212 return ClientSocketPool::kMaxConnectRetryIntervalMs; 216 return ClientSocketPool::kMaxConnectRetryIntervalMs;
213 } 217 }
214 218
215 // ConnectJob::Delegate methods: 219 // ConnectJob::Delegate methods:
216 virtual void OnConnectJobComplete(int result, ConnectJob* job); 220 virtual void OnConnectJobComplete(int result, ConnectJob* job);
217 221
218 // NetworkChangeNotifier::Observer methods: 222 // NetworkChangeNotifier::Observer methods:
219 virtual void OnIPAddressChanged(); 223 virtual void OnIPAddressChanged() { Flush(); }
220 224
221 // For testing. 225 // For testing.
222 bool may_have_stalled_group() const { return may_have_stalled_group_; } 226 bool may_have_stalled_group() const { return may_have_stalled_group_; }
223 227
224 int NumConnectJobsInGroup(const std::string& group_name) const { 228 int NumConnectJobsInGroup(const std::string& group_name) const {
225 return group_map_.find(group_name)->second.jobs.size(); 229 return group_map_.find(group_name)->second.jobs.size();
226 } 230 }
227 231
228 // Closes all idle sockets if |force| is true. Else, only closes idle 232 // Closes all idle sockets if |force| is true. Else, only closes idle
229 // sockets that timed out or can't be reused. Made public for testing. 233 // sockets that timed out or can't be reused. Made public for testing.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 static void InsertRequestIntoQueue(const Request* r, 332 static void InsertRequestIntoQueue(const Request* r,
329 RequestQueue* pending_requests); 333 RequestQueue* pending_requests);
330 static const Request* RemoveRequestFromQueue(RequestQueue::iterator it, 334 static const Request* RemoveRequestFromQueue(RequestQueue::iterator it,
331 RequestQueue* pending_requests); 335 RequestQueue* pending_requests);
332 336
333 // Called when the number of idle sockets changes. 337 // Called when the number of idle sockets changes.
334 void IncrementIdleCount(); 338 void IncrementIdleCount();
335 void DecrementIdleCount(); 339 void DecrementIdleCount();
336 340
337 // Called via PostTask by ReleaseSocket. 341 // Called via PostTask by ReleaseSocket.
338 void DoReleaseSocket(const std::string& group_name, ClientSocket* socket); 342 void DoReleaseSocket(
343 const std::string& group_name, ClientSocket* socket, int id);
339 344
340 // Scans the group map for groups which have an available socket slot and 345 // Scans the group map for groups which have an available socket slot and
341 // at least one pending request. Returns number of groups found, and if found 346 // at least one pending request. Returns number of groups found, and if found
342 // at least one, fills |group| and |group_name| with data of the stalled group 347 // at least one, fills |group| and |group_name| with data of the stalled group
343 // having highest priority. 348 // having highest priority.
344 int FindTopStalledGroup(Group** group, std::string* group_name); 349 int FindTopStalledGroup(Group** group, std::string* group_name);
345 350
346 // Called when timer_ fires. This method scans the idle sockets removing 351 // Called when timer_ fires. This method scans the idle sockets removing
347 // sockets that timed out or can't be reused. 352 // sockets that timed out or can't be reused.
348 void OnCleanupTimerFired() { 353 void OnCleanupTimerFired() {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 449
445 const scoped_ptr<ConnectJobFactory> connect_job_factory_; 450 const scoped_ptr<ConnectJobFactory> connect_job_factory_;
446 451
447 NetworkChangeNotifier* const network_change_notifier_; 452 NetworkChangeNotifier* const network_change_notifier_;
448 453
449 // TODO(vandebo) Remove when backup jobs move to TCPClientSocketPool 454 // TODO(vandebo) Remove when backup jobs move to TCPClientSocketPool
450 bool backup_jobs_enabled_; 455 bool backup_jobs_enabled_;
451 456
452 // A factory to pin the backup_job tasks. 457 // A factory to pin the backup_job tasks.
453 ScopedRunnableMethodFactory<ClientSocketPoolBaseHelper> method_factory_; 458 ScopedRunnableMethodFactory<ClientSocketPoolBaseHelper> method_factory_;
459
460 // A unique id for the pool. It gets incremented every time we Flush() the
461 // pool. This is so that when sockets get released back to the pool, we can
462 // make sure that they are discarded rather than reused.
463 int pool_generation_number_;
454 }; 464 };
455 465
456 } // namespace internal 466 } // namespace internal
457 467
458 // The maximum duration, in seconds, to keep unused idle persistent sockets 468 // The maximum duration, in seconds, to keep unused idle persistent sockets
459 // alive. 469 // alive.
460 // TODO(willchan): Change this timeout after getting histogram data on how 470 // TODO(willchan): Change this timeout after getting histogram data on how
461 // long it should be. 471 // long it should be.
462 static const int kUnusedIdleSocketTimeout = 10; 472 static const int kUnusedIdleSocketTimeout = 10;
463 // The maximum duration, in seconds, to keep used idle persistent sockets alive. 473 // The maximum duration, in seconds, to keep used idle persistent sockets alive.
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 const BoundNetLog& net_log) { 545 const BoundNetLog& net_log) {
536 Request* request = new Request(handle, callback, priority, params, net_log); 546 Request* request = new Request(handle, callback, priority, params, net_log);
537 return helper_->RequestSocket(group_name, request); 547 return helper_->RequestSocket(group_name, request);
538 } 548 }
539 549
540 void CancelRequest(const std::string& group_name, 550 void CancelRequest(const std::string& group_name,
541 const ClientSocketHandle* handle) { 551 const ClientSocketHandle* handle) {
542 return helper_->CancelRequest(group_name, handle); 552 return helper_->CancelRequest(group_name, handle);
543 } 553 }
544 554
545 void ReleaseSocket(const std::string& group_name, ClientSocket* socket) { 555 void ReleaseSocket(const std::string& group_name, ClientSocket* socket, int id ) {
546 return helper_->ReleaseSocket(group_name, socket); 556 return helper_->ReleaseSocket(group_name, socket, id);
547 } 557 }
548 558
549 void CloseIdleSockets() { return helper_->CloseIdleSockets(); } 559 void CloseIdleSockets() { return helper_->CloseIdleSockets(); }
550 560
551 int idle_socket_count() const { return helper_->idle_socket_count(); } 561 int idle_socket_count() const { return helper_->idle_socket_count(); }
552 562
553 int IdleSocketCountInGroup(const std::string& group_name) const { 563 int IdleSocketCountInGroup(const std::string& group_name) const {
554 return helper_->IdleSocketCountInGroup(group_name); 564 return helper_->IdleSocketCountInGroup(group_name);
555 } 565 }
556 566
(...skipping 22 matching lines...) Expand all
579 base::TimeDelta ConnectionTimeout() const { 589 base::TimeDelta ConnectionTimeout() const {
580 return helper_->ConnectionTimeout(); 590 return helper_->ConnectionTimeout();
581 } 591 }
582 592
583 scoped_refptr<ClientSocketPoolHistograms> histograms() const { 593 scoped_refptr<ClientSocketPoolHistograms> histograms() const {
584 return histograms_; 594 return histograms_;
585 } 595 }
586 596
587 void enable_backup_jobs() { helper_->enable_backup_jobs(); } 597 void enable_backup_jobs() { helper_->enable_backup_jobs(); }
588 598
599 void Flush() { helper_->Flush(); }
600
589 private: 601 private:
590 // This adaptor class exists to bridge the 602 // This adaptor class exists to bridge the
591 // internal::ClientSocketPoolBaseHelper::ConnectJobFactory and 603 // internal::ClientSocketPoolBaseHelper::ConnectJobFactory and
592 // ClientSocketPoolBase::ConnectJobFactory types, allowing clients to use the 604 // ClientSocketPoolBase::ConnectJobFactory types, allowing clients to use the
593 // typesafe ClientSocketPoolBase::ConnectJobFactory, rather than having to 605 // typesafe ClientSocketPoolBase::ConnectJobFactory, rather than having to
594 // static_cast themselves. 606 // static_cast themselves.
595 class ConnectJobFactoryAdaptor 607 class ConnectJobFactoryAdaptor
596 : public internal::ClientSocketPoolBaseHelper::ConnectJobFactory { 608 : public internal::ClientSocketPoolBaseHelper::ConnectJobFactory {
597 public: 609 public:
598 typedef typename ClientSocketPoolBase<SocketParams>::ConnectJobFactory 610 typedef typename ClientSocketPoolBase<SocketParams>::ConnectJobFactory
(...skipping 29 matching lines...) Expand all
628 // the posting of the task and the execution, then we'll hit the DCHECK that 640 // the posting of the task and the execution, then we'll hit the DCHECK that
629 // |ClientSocketPoolBaseHelper::group_map_| is empty. 641 // |ClientSocketPoolBaseHelper::group_map_| is empty.
630 scoped_refptr<internal::ClientSocketPoolBaseHelper> helper_; 642 scoped_refptr<internal::ClientSocketPoolBaseHelper> helper_;
631 643
632 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); 644 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase);
633 }; 645 };
634 646
635 } // namespace net 647 } // namespace net
636 648
637 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ 649 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool.h ('k') | net/socket/client_socket_pool_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698