1 /*
2  * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef _SQUID_SRC_HELPER_CHILDCONFIG_H
10 #define _SQUID_SRC_HELPER_CHILDCONFIG_H
11 
12 namespace Helper
13 {
14 
15 /**
16  * Contains statistics of a particular type of child helper.
17  *
18  * Some derived from a helper children configuration option,
19  * some from runtime stats on the currently active children.
20  */
21 class ChildConfig
22 {
23 public:
24     ChildConfig();
25     explicit ChildConfig(const unsigned int m);
26 
27     /**
28      * When new helpers are needed call this to find out how many more
29      * we are allowed to start.
30      * \retval 0       No more helpers may be started right now.
31      * \retval N < 0   Error. No more helpers may be started.
32      * \retval N       N more helpers may be started immediately.
33      */
34     int needNew() const;
35     void parseConfig();
36 
37     /**
38      * Update an existing set of details with new start/max/idle/concurrent limits.
39      * This is for parsing new child settings into an object incrementally then updating
40      * the running set without loosing any of the active state or causing races.
41      */
42     ChildConfig &updateLimits(const ChildConfig &rhs);
43 
44     /* values from squid.conf */
45 public:
46 
47     /** maximum child process limits. How many of this helper the system can cope with */
48     unsigned int n_max;
49 
50     /**
51      * Number of children to kick off at startup.
52      * set via the startup=N option.
53      *
54      * By default if undefined 1 will be started immediately for use.
55      * The minimum/idle amount will be scheduled for starting as soon as possible after startup is completed.
56      */
57     unsigned int n_startup;
58 
59     /**
60      * Number of helper children to keep available as a buffer against sudden bursts of requests.
61      * set via the idle=N option. May be zero.
62      *
63      * The default value for backward compatibility the default for this is the same as maximum children.
64      * For now the actual number of idle children is only reduced by a reconfigure operation. This may change.
65      */
66     unsigned int n_idle;
67 
68     /**
69      * How many concurrent requests each child helper may be capable of handling.
70      * Default: 0  - no concurrency possible.
71      */
72     unsigned int concurrency;
73 
74     /* derived from active operations */
75 
76     /**
77      * Total helper children objects currently existing.
78      * Produced as a side effect of starting children or their stopping.
79      */
80     unsigned int n_running;
81 
82     /**
83      * Count of helper children active (not shutting down).
84      * This includes both idle and in-use children.
85      */
86     unsigned int n_active;
87 
88     /**
89      * The requests queue size. By default it is of size 2*n_max
90      */
91     unsigned int queue_size;
92 
93     /// how to handle a serious problem with a helper request submission
94     enum SubmissionErrorHandlingAction {
95         actDie, ///< kill the caller process (i.e., Squid worker)
96         actErr  ///< drop the request and send an error to the caller
97     };
98     /// how to handle a new request for helper that was overloaded for too long
99     SubmissionErrorHandlingAction onPersistentOverload;
100 
101     /**
102      * True if the default queue size is used.
103      * Needed in the cases where we need to adjust default queue_size in
104      * special configurations, for example when redirector_bypass is used.
105      */
106     bool defaultQueueSize;
107 };
108 
109 } // namespace Helper
110 
111 /* Legacy parser interface */
112 #define parse_HelperChildConfig(c)     (c)->parseConfig()
113 #define dump_HelperChildConfig(e,n,c)  storeAppendPrintf((e), "\n%s %d startup=%d idle=%d concurrency=%d\n", (n), (c).n_max, (c).n_startup, (c).n_idle, (c).concurrency)
114 #define free_HelperChildConfig(dummy)  // NO.
115 
116 #endif /* _SQUID_SRC_HELPER_CHILDCONFIG_H */
117 
118