116{
117 if (m_max_open == 0 && m_max_conns == 0) return true;
118
119 const std::lock_guard<std::mutex> lock(m_file_mutex);
120 auto iter = m_file_counters.find(entity);
121 unsigned long cur_open_files = 0, cur_open_conns;
122 if (m_max_open) {
123 if (iter == m_file_counters.end()) {
124 m_file_counters[entity] = 1;
125 TRACE(FILES,
"User " << entity <<
" has opened their first file");
126 cur_open_files = 1;
127 } else if (iter->second < m_max_open) {
128 iter->second++;
129 cur_open_files = iter->second;
130 } else {
131 std::stringstream ss;
132 ss << "User " << entity << " has hit the limit of " << m_max_open << " open files";
133 TRACE(FILES, ss.str());
134 error_message = ss.str();
135 return false;
136 }
137 }
138
139 if (m_max_conns) {
141 auto conn_iter = m_active_conns.find(entity);
142 auto conn_count_iter = m_conn_counters.find(entity);
143 if ((conn_count_iter != m_conn_counters.end()) && (conn_count_iter->second == m_max_conns) &&
144 (conn_iter == m_active_conns.end() || ((*(conn_iter->second))[pid] == 0)))
145 {
146
147 if (m_max_open) iter->second--;
148 std::stringstream ss;
149 ss << "User " << entity << " has hit the limit of " << m_max_conns <<
150 " open connections";
151 TRACE(CONNS, ss.str());
152 error_message = ss.str();
153 return false;
154 }
155 if (conn_iter == m_active_conns.end()) {
156 std::unique_ptr<std::unordered_map<pid_t, unsigned long>> conn_map(
157 new std::unordered_map<pid_t, unsigned long>());
158 (*conn_map)[pid] = 1;
159 m_active_conns[entity] = std::move(conn_map);
160 if (conn_count_iter == m_conn_counters.end()) {
161 m_conn_counters[entity] = 1;
162 cur_open_conns = 1;
163 } else {
164 m_conn_counters[entity] ++;
165 cur_open_conns = m_conn_counters[entity];
166 }
167 } else {
168 auto pid_iter = conn_iter->second->find(pid);
169 if (pid_iter == conn_iter->second->end() || pid_iter->second == 0) {
170 (*(conn_iter->second))[pid] = 1;
171 conn_count_iter->second++;
172 cur_open_conns = conn_count_iter->second;
173 } else {
174 (*(conn_iter->second))[pid] ++;
175 cur_open_conns = conn_count_iter->second;
176 }
177 }
178 TRACE(CONNS,
"User " << entity <<
" has " << cur_open_conns <<
" open connections");
179 }
180 if (m_max_open)
TRACE(FILES,
"User " << entity <<
" has " << cur_open_files <<
" open files");
181 return true;
182}