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

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

Issue 18796003: When an idle socket is added back to a socket pool, check for stalled jobs in lower pools (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Undo somewhat tangential change Created 7 years, 5 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 | Annotate | Revision Log
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 // 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 const Request& request, 193 const Request& request,
194 ConnectJob::Delegate* delegate) const = 0; 194 ConnectJob::Delegate* delegate) const = 0;
195 195
196 virtual base::TimeDelta ConnectionTimeout() const = 0; 196 virtual base::TimeDelta ConnectionTimeout() const = 0;
197 197
198 private: 198 private:
199 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); 199 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory);
200 }; 200 };
201 201
202 ClientSocketPoolBaseHelper( 202 ClientSocketPoolBaseHelper(
203 HigherLayeredPool* pool,
203 int max_sockets, 204 int max_sockets,
204 int max_sockets_per_group, 205 int max_sockets_per_group,
205 base::TimeDelta unused_idle_socket_timeout, 206 base::TimeDelta unused_idle_socket_timeout,
206 base::TimeDelta used_idle_socket_timeout, 207 base::TimeDelta used_idle_socket_timeout,
207 ConnectJobFactory* connect_job_factory); 208 ConnectJobFactory* connect_job_factory);
208 209
209 virtual ~ClientSocketPoolBaseHelper(); 210 virtual ~ClientSocketPoolBaseHelper();
210 211
211 // Adds/Removes layered pools. It is expected in the destructor that no 212 // Adds a lower layered pool to |this|, and adds |pool_| as a higher layered
212 // layered pools remain. 213 // pool on top of |lower_pool|.
213 void AddLayeredPool(LayeredPool* pool); 214 void AddLowerLayeredPool(LowerLayeredPool* lower_pool);
214 void RemoveLayeredPool(LayeredPool* pool); 215
216 // See LowerLayeredPool::IsStalled for documentation on this function.
217 bool IsStalled() const;
218
219 // See LowerLayeredPool for documentation on these functions. It is expected
220 // in the destructor that no higher layer pools remain.
221 void AddHigherLayeredPool(HigherLayeredPool* higher_pool);
222 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool);
215 223
216 // See ClientSocketPool::RequestSocket for documentation on this function. 224 // See ClientSocketPool::RequestSocket for documentation on this function.
217 // ClientSocketPoolBaseHelper takes ownership of |request|, which must be 225 // ClientSocketPoolBaseHelper takes ownership of |request|, which must be
218 // heap allocated. 226 // heap allocated.
219 int RequestSocket(const std::string& group_name, const Request* request); 227 int RequestSocket(const std::string& group_name, const Request* request);
220 228
221 // See ClientSocketPool::RequestSocket for documentation on this function. 229 // See ClientSocketPool::RequestSocket for documentation on this function.
222 void RequestSockets(const std::string& group_name, 230 void RequestSockets(const std::string& group_name,
223 const Request& request, 231 const Request& request,
224 int num_sockets); 232 int num_sockets);
225 233
226 // See ClientSocketPool::CancelRequest for documentation on this function. 234 // See ClientSocketPool::CancelRequest for documentation on this function.
227 void CancelRequest(const std::string& group_name, 235 void CancelRequest(const std::string& group_name,
228 ClientSocketHandle* handle); 236 ClientSocketHandle* handle);
229 237
230 // See ClientSocketPool::ReleaseSocket for documentation on this function. 238 // See ClientSocketPool::ReleaseSocket for documentation on this function.
231 void ReleaseSocket(const std::string& group_name, 239 void ReleaseSocket(const std::string& group_name,
232 StreamSocket* socket, 240 StreamSocket* socket,
233 int id); 241 int id);
234 242
235 // See ClientSocketPool::FlushWithError for documentation on this function. 243 // See ClientSocketPool::FlushWithError for documentation on this function.
236 void FlushWithError(int error); 244 void FlushWithError(int error);
237 245
238 // See ClientSocketPool::IsStalled for documentation on this function.
239 bool IsStalled() const;
240
241 // See ClientSocketPool::CloseIdleSockets for documentation on this function. 246 // See ClientSocketPool::CloseIdleSockets for documentation on this function.
242 void CloseIdleSockets(); 247 void CloseIdleSockets();
243 248
244 // See ClientSocketPool::IdleSocketCount() for documentation on this function. 249 // See ClientSocketPool::IdleSocketCount() for documentation on this function.
245 int idle_socket_count() const { 250 int idle_socket_count() const {
246 return idle_socket_count_; 251 return idle_socket_count_;
247 } 252 }
248 253
249 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this 254 // See ClientSocketPool::IdleSocketCountInGroup() for documentation on this
250 // function. 255 // function.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 // sockets that timed out or can't be reused. Made public for testing. 292 // sockets that timed out or can't be reused. Made public for testing.
288 void CleanupIdleSockets(bool force); 293 void CleanupIdleSockets(bool force);
289 294
290 // Closes one idle socket. Picks the first one encountered. 295 // Closes one idle socket. Picks the first one encountered.
291 // TODO(willchan): Consider a better algorithm for doing this. Perhaps we 296 // TODO(willchan): Consider a better algorithm for doing this. Perhaps we
292 // should keep an ordered list of idle sockets, and close them in order. 297 // should keep an ordered list of idle sockets, and close them in order.
293 // Requires maintaining more state. It's not clear if it's worth it since 298 // Requires maintaining more state. It's not clear if it's worth it since
294 // I'm not sure if we hit this situation often. 299 // I'm not sure if we hit this situation often.
295 bool CloseOneIdleSocket(); 300 bool CloseOneIdleSocket();
296 301
297 // Checks layered pools to see if they can close an idle connection. 302 // Checks higher layered pools to see if they can close an idle connection.
298 bool CloseOneIdleConnectionInLayeredPool(); 303 bool CloseOneIdleConnectionInHigherLayeredPool();
299 304
300 // See ClientSocketPool::GetInfoAsValue for documentation on this function. 305 // See ClientSocketPool::GetInfoAsValue for documentation on this function.
301 base::DictionaryValue* GetInfoAsValue(const std::string& name, 306 base::DictionaryValue* GetInfoAsValue(const std::string& name,
302 const std::string& type) const; 307 const std::string& type) const;
303 308
304 base::TimeDelta ConnectionTimeout() const { 309 base::TimeDelta ConnectionTimeout() const {
305 return connect_job_factory_->ConnectionTimeout(); 310 return connect_job_factory_->ConnectionTimeout();
306 } 311 }
307 312
308 static bool connect_backup_jobs_enabled(); 313 static bool connect_backup_jobs_enabled();
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 const scoped_ptr<ConnectJobFactory> connect_job_factory_; 586 const scoped_ptr<ConnectJobFactory> connect_job_factory_;
582 587
583 // TODO(vandebo) Remove when backup jobs move to TransportClientSocketPool 588 // TODO(vandebo) Remove when backup jobs move to TransportClientSocketPool
584 bool connect_backup_jobs_enabled_; 589 bool connect_backup_jobs_enabled_;
585 590
586 // A unique id for the pool. It gets incremented every time we 591 // A unique id for the pool. It gets incremented every time we
587 // FlushWithError() the pool. This is so that when sockets get released back 592 // FlushWithError() the pool. This is so that when sockets get released back
588 // to the pool, we can make sure that they are discarded rather than reused. 593 // to the pool, we can make sure that they are discarded rather than reused.
589 int pool_generation_number_; 594 int pool_generation_number_;
590 595
591 std::set<LayeredPool*> higher_layer_pools_; 596 // Used to add |this| as a higher layer pool on top of lower layer pools. May
597 // be NULL if no lower layer pools will be added.
598 HigherLayeredPool* pool_;
599
600 // Pools that create connections through |this|. |this| will Try to close
601 // their idle sockets when it stalls. Must be empty on destruction.
602 std::set<HigherLayeredPool*> higher_pools_;
603
604 // Pools that this goes through. Typically there's only one, but not always.
605 // |this| will check if they're stalled when it has a new idle socket. |this|
606 // will remove itself from all lower layered pools on destruction.
607 std::set<LowerLayeredPool*> lower_pools_;
592 608
593 base::WeakPtrFactory<ClientSocketPoolBaseHelper> weak_factory_; 609 base::WeakPtrFactory<ClientSocketPoolBaseHelper> weak_factory_;
594 610
595 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBaseHelper); 611 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBaseHelper);
596 }; 612 };
597 613
598 } // namespace internal 614 } // namespace internal
599 615
600 template <typename SocketParams> 616 template <typename SocketParams>
601 class ClientSocketPoolBase { 617 class ClientSocketPoolBase {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory); 651 DISALLOW_COPY_AND_ASSIGN(ConnectJobFactory);
636 }; 652 };
637 653
638 // |max_sockets| is the maximum number of sockets to be maintained by this 654 // |max_sockets| is the maximum number of sockets to be maintained by this
639 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of 655 // ClientSocketPool. |max_sockets_per_group| specifies the maximum number of
640 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how 656 // sockets a "group" can have. |unused_idle_socket_timeout| specifies how
641 // long to leave an unused idle socket open before closing it. 657 // long to leave an unused idle socket open before closing it.
642 // |used_idle_socket_timeout| specifies how long to leave a previously used 658 // |used_idle_socket_timeout| specifies how long to leave a previously used
643 // idle socket open before closing it. 659 // idle socket open before closing it.
644 ClientSocketPoolBase( 660 ClientSocketPoolBase(
661 HigherLayeredPool* self,
645 int max_sockets, 662 int max_sockets,
646 int max_sockets_per_group, 663 int max_sockets_per_group,
647 ClientSocketPoolHistograms* histograms, 664 ClientSocketPoolHistograms* histograms,
648 base::TimeDelta unused_idle_socket_timeout, 665 base::TimeDelta unused_idle_socket_timeout,
649 base::TimeDelta used_idle_socket_timeout, 666 base::TimeDelta used_idle_socket_timeout,
650 ConnectJobFactory* connect_job_factory) 667 ConnectJobFactory* connect_job_factory)
651 : histograms_(histograms), 668 : histograms_(histograms),
652 helper_(max_sockets, max_sockets_per_group, 669 helper_(self, max_sockets, max_sockets_per_group,
653 unused_idle_socket_timeout, used_idle_socket_timeout, 670 unused_idle_socket_timeout, used_idle_socket_timeout,
654 new ConnectJobFactoryAdaptor(connect_job_factory)) {} 671 new ConnectJobFactoryAdaptor(connect_job_factory)) {}
655 672
656 virtual ~ClientSocketPoolBase() {} 673 virtual ~ClientSocketPoolBase() {}
657 674
658 // These member functions simply forward to ClientSocketPoolBaseHelper. 675 // These member functions simply forward to ClientSocketPoolBaseHelper.
659 void AddLayeredPool(LayeredPool* pool) { 676 void AddLowerLayeredPool(LowerLayeredPool* lower_pool) {
660 helper_.AddLayeredPool(pool); 677 helper_.AddLowerLayeredPool(lower_pool);
661 } 678 }
662 679
663 void RemoveLayeredPool(LayeredPool* pool) { 680 void AddHigherLayeredPool(HigherLayeredPool* higher_pool) {
664 helper_.RemoveLayeredPool(pool); 681 helper_.AddHigherLayeredPool(higher_pool);
682 }
683
684 void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) {
685 helper_.RemoveHigherLayeredPool(higher_pool);
665 } 686 }
666 687
667 // RequestSocket bundles up the parameters into a Request and then forwards to 688 // RequestSocket bundles up the parameters into a Request and then forwards to
668 // ClientSocketPoolBaseHelper::RequestSocket(). 689 // ClientSocketPoolBaseHelper::RequestSocket().
669 int RequestSocket(const std::string& group_name, 690 int RequestSocket(const std::string& group_name,
670 const scoped_refptr<SocketParams>& params, 691 const scoped_refptr<SocketParams>& params,
671 RequestPriority priority, 692 RequestPriority priority,
672 ClientSocketHandle* handle, 693 ClientSocketHandle* handle,
673 const CompletionCallback& callback, 694 const CompletionCallback& callback,
674 const BoundNetLog& net_log) { 695 const BoundNetLog& net_log) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 } 779 }
759 780
760 ClientSocketPoolHistograms* histograms() const { 781 ClientSocketPoolHistograms* histograms() const {
761 return histograms_; 782 return histograms_;
762 } 783 }
763 784
764 void EnableConnectBackupJobs() { helper_.EnableConnectBackupJobs(); } 785 void EnableConnectBackupJobs() { helper_.EnableConnectBackupJobs(); }
765 786
766 bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); } 787 bool CloseOneIdleSocket() { return helper_.CloseOneIdleSocket(); }
767 788
768 bool CloseOneIdleConnectionInLayeredPool() { 789 bool CloseOneIdleConnectionInHigherLayeredPool() {
769 return helper_.CloseOneIdleConnectionInLayeredPool(); 790 return helper_.CloseOneIdleConnectionInHigherLayeredPool();
770 } 791 }
771 792
772 private: 793 private:
773 // This adaptor class exists to bridge the 794 // This adaptor class exists to bridge the
774 // internal::ClientSocketPoolBaseHelper::ConnectJobFactory and 795 // internal::ClientSocketPoolBaseHelper::ConnectJobFactory and
775 // ClientSocketPoolBase::ConnectJobFactory types, allowing clients to use the 796 // ClientSocketPoolBase::ConnectJobFactory types, allowing clients to use the
776 // typesafe ClientSocketPoolBase::ConnectJobFactory, rather than having to 797 // typesafe ClientSocketPoolBase::ConnectJobFactory, rather than having to
777 // static_cast themselves. 798 // static_cast themselves.
778 class ConnectJobFactoryAdaptor 799 class ConnectJobFactoryAdaptor
779 : public internal::ClientSocketPoolBaseHelper::ConnectJobFactory { 800 : public internal::ClientSocketPoolBaseHelper::ConnectJobFactory {
(...skipping 24 matching lines...) Expand all
804 // Histograms for the pool 825 // Histograms for the pool
805 ClientSocketPoolHistograms* const histograms_; 826 ClientSocketPoolHistograms* const histograms_;
806 internal::ClientSocketPoolBaseHelper helper_; 827 internal::ClientSocketPoolBaseHelper helper_;
807 828
808 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase); 829 DISALLOW_COPY_AND_ASSIGN(ClientSocketPoolBase);
809 }; 830 };
810 831
811 } // namespace net 832 } // namespace net
812 833
813 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_ 834 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_BASE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698