-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add client max connection #136
base: unstable
Are you sure you want to change the base?
Changes from 14 commits
eaa8fe8
e01a031
a3d3ba3
ab5c2c2
3e07a20
9edb5b4
80da4ab
e555f07
1743986
e79f013
81a60af
92fec59
30a2327
c7b7c79
239f72f
50a3929
4e9c500
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -90,18 +90,26 @@ class ThreadManager { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint64_t DoTCPConnect(T &t, int fd, const std::shared_ptr<Connection> &conn); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint32_t get_client_count() const { return clientCount_.load(); } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void client_count_increment() { clientCount_.fetch_add(1, std::memory_order_relaxed); } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void client_count_decrement() { clientCount_.fetch_sub(1, std::memory_order_relaxed); } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const int8_t index_ = 0; // The index of the thread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uint32_t tcpKeepAlive_ = 300; // The timeout of the keepalive connection in seconds | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::atomic<bool> running_ = true; // Whether the thread is running | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NetOptions netOptions_; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
inline static std::atomic<uint32_t> clientCount_{0}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unique_ptr<IOThread> readThread_; // Read thread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unique_ptr<IOThread> writeThread_; // Write thread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// All connections for the current thread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unordered_map<uint64_t, std::pair<T, std::shared_ptr<Connection>>> connections_; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::unordered_map<uint64_t, std::pair<T, std::shared_ptr<Connection>>> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
connections_; // All connections for the current thread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::shared_mutex mutex_; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -149,6 +157,20 @@ void ThreadManager<T>::Stop() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template <typename T> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
requires HasSetFdFunction<T> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
void ThreadManager<T>::OnNetEventCreate(int fd, const std::shared_ptr<Connection> &conn) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!clientCount_.compare_exchange_strong(expected, expected + 1, std::memory_order_seq_cst, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::memory_order_seq_cst) || expected >= netOptions_.GetMaxClients()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INFO("Max client connetions, refuse new connection fd: %d", fd); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
std::string response = "-ERR max clients reached\r\n"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ssize_t sent = ::send(fd, response.c_str(), response.size(), 0); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (sent < 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERROR("Failed to send error response to fd: %d, errno: %d", fd, errno); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (::close(fd) < 0) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERROR("Failed to close fd: %d, errno: %d", fd, errno); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Fix code formatting issues. The condition statement needs proper formatting according to clang-format style. Also, there's a typo in "connetions". - if (!clientCount_.compare_exchange_strong(expected, expected + 1, std::memory_order_seq_cst,
- std::memory_order_seq_cst) || expected >= netOptions_.GetMaxClients()) {
- INFO("Max client connetions, refuse new connection fd: %d", fd);
+ if (!clientCount_.compare_exchange_strong(expected, expected + 1,
+ std::memory_order_seq_cst,
+ std::memory_order_seq_cst) ||
+ expected >= netOptions_.GetMaxClients()) {
+ INFO("Max client connections, refuse new connection fd: %d", fd); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
T t; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onInit_(&t); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
auto connId = getConnId(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -170,6 +192,7 @@ void ThreadManager<T>::OnNetEventCreate(int fd, const std::shared_ptr<Connection | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onCreate_(connId, t, conn->addr_); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client_count_increment(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Move client count increment before onCreate_. If onCreate_ throws an exception, the client count won't reflect the actual connection state. Move the increment before the callback to ensure accurate counting. readThread_->AddNewEvent(connId, fd, BaseEvent::EVENT_READ);
if (writeThread_) {
writeThread_->AddNewEvent(connId, fd, BaseEvent::EVENT_NULL);
}
+ client_count_increment();
onCreate_(connId, t, conn->addr_);
- client_count_increment(); 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Actions: kiwi[error] Code formatting issues detected by clang-format. Issues include indentation and spacing in the OnNetEventCreate function. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template <typename T> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -206,6 +229,7 @@ void ThreadManager<T>::OnNetEventClose(uint64_t connId, std::string &&err) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
iter->second.second->netEvent_->Close(); // close socket | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onClose_(iter->second.first, std::move(err)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
connections_.erase(iter); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client_count_decrement(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template <typename T> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
返回 redis 格式的一个 response