提交 fdd33003 编写于 作者: K KernelMaker

1) update nemo: bugfix for bit; 2) bugfix for ip bind; 3) bugfix for monitor;...

1) update nemo: bugfix for bit; 2) bugfix for ip bind; 3) bugfix for monitor; 4) optimize log; 5) beta 2.2.1
上级 ff1dccd4
......@@ -47,4 +47,11 @@ private:
AuthStat auth_stat_;
};
struct ClientInfo {
int fd;
std::string ip_port;
int last_interaction;
PikaClientConn* conn;
};
#endif
......@@ -9,16 +9,9 @@
#define PIKA_MAX_WORKER_THREAD_NUM 24
const std::string kPikaVersion = "2.2.0";
const std::string kPikaVersion = "2.2.1";
const std::string kPikaPidFile = "pika.pid";
struct ClientInfo {
int fd;
std::string ip_port;
int last_interaction;
};
struct WorkerCronTask {
int task;
std::string ip_port;
......
......@@ -23,7 +23,7 @@ public:
PikaMonitorThread();
virtual ~PikaMonitorThread();
void AddMonitorClient(pink::RedisConn* client_ptr);
void AddMonitorClient(PikaClientConn* client_ptr);
void AddMonitorMessage(const std::string &monitor_message);
int32_t ThreadClientList(std::vector<ClientInfo>* client = NULL);
bool ThreadClientKill(const std::string& ip_port = "all");
......
......@@ -293,7 +293,7 @@ public:
/*
* Monitor used
*/
void AddMonitorClient(pink::RedisConn* client_ptr);
void AddMonitorClient(PikaClientConn* client_ptr);
void AddMonitorMessage(const std::string &monitor_message);
bool HasMonitorClients();
......
......@@ -509,6 +509,7 @@ void InfoCmd::InfoServer(std::string &info) {
tmp_stream << "uptime_in_seconds:" << (current_time_s - g_pika_server->start_time_s()) << "\r\n";
tmp_stream << "uptime_in_days:" << (current_time_s / (24*3600) - g_pika_server->start_time_s() / (24*3600) + 1) << "\r\n";
tmp_stream << "config_file:" << g_pika_conf->conf_path() << "\r\n";
tmp_stream << "compact_cron:" << g_pika_conf->compact_cron() << "\r\n";
info.append(tmp_stream.str());
}
......
......@@ -36,10 +36,10 @@ PikaMonitorThread::~PikaMonitorThread() {
LOG(INFO) << " PikaMonitorThread " << pthread_self() << " exit!!!";
}
void PikaMonitorThread::AddMonitorClient(pink::RedisConn* client_ptr) {
void PikaMonitorThread::AddMonitorClient(PikaClientConn* client_ptr) {
StartThread();
slash::MutexLock lm(&monitor_mutex_protector_);
monitor_clients_.push_back(ClientInfo{client_ptr->fd(), client_ptr->ip_port(), 0});
monitor_clients_.push_back(ClientInfo{client_ptr->fd(), client_ptr->ip_port(), 0, client_ptr});
}
void PikaMonitorThread::RemoveMonitorClient(const std::string& ip_port) {
......@@ -47,10 +47,12 @@ void PikaMonitorThread::RemoveMonitorClient(const std::string& ip_port) {
for (; iter != monitor_clients_.end(); ++iter) {
if (ip_port == "all") {
close(iter->fd);
delete iter->conn;
continue;
}
if (iter->ip_port == ip_port) {
close(iter->fd);
delete iter->conn;
break;
}
}
......
......@@ -149,78 +149,82 @@ PikaServer::~PikaServer() {
}
bool PikaServer::ServerInit() {
std::string network_interface = g_pika_conf->network_interface();
std::string network_interface = g_pika_conf->network_interface();
if (network_interface == "") {
std::ifstream routeFile("/proc/net/route", std::ios_base::in);
if (!routeFile.good())
{
return false;
}
std::string line;
std::vector<std::string> tokens;
while(std::getline(routeFile, line))
{
std::istringstream stream(line);
std::copy(std::istream_iterator<std::string>(stream),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string> >(tokens));
// the default interface is the one having the second
// field, Destination, set to "00000000"
if ((tokens.size() >= 2) && (tokens[1] == std::string("00000000")))
{
network_interface = tokens[0];
break;
}
tokens.clear();
}
routeFile.close();
std::ifstream routeFile("/proc/net/route", std::ios_base::in);
if (!routeFile.good())
{
return false;
}
std::string line;
std::vector<std::string> tokens;
while(std::getline(routeFile, line))
{
std::istringstream stream(line);
std::copy(std::istream_iterator<std::string>(stream),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string> >(tokens));
// the default interface is the one having the second
// field, Destination, set to "00000000"
if ((tokens.size() >= 2) && (tokens[1] == std::string("00000000")))
{
network_interface = tokens[0];
break;
}
tokens.clear();
}
routeFile.close();
}
LOG(INFO) << "Using Networker Interface: " << network_interface;
LOG(INFO) << "Using Networker Interface: " << network_interface;
struct ifaddrs * ifAddrStruct = NULL;
struct ifaddrs * ifAddrStruct = NULL;
struct ifaddrs * ifa = NULL;
void * tmpAddrPtr = NULL;
getifaddrs(&ifAddrStruct);
if (getifaddrs(&ifAddrStruct) == -1) {
LOG(FATAL) << "getifaddrs failed: " << strerror(errno);
}
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa ->ifa_addr->sa_family==AF_INET) { // Check it is
// a valid IPv4 address
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
if (std::string(ifa->ifa_name) == network_interface) {
host_ = addressBuffer;
break;
}
if (ifa->ifa_addr == NULL) {
continue;
}
if (ifa ->ifa_addr->sa_family==AF_INET) { // Check it is
// a valid IPv4 address
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
if (std::string(ifa->ifa_name) == network_interface) {
host_ = addressBuffer;
break;
}
else if (ifa->ifa_addr->sa_family==AF_INET6) { // Check it is
// a valid IPv6 address
tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
if (std::string(ifa->ifa_name) == network_interface) {
host_ = addressBuffer;
break;
}
} else if (ifa->ifa_addr->sa_family==AF_INET6) { // Check it is
// a valid IPv6 address
tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
if (std::string(ifa->ifa_name) == network_interface) {
host_ = addressBuffer;
break;
}
}
}
if (ifAddrStruct != NULL) {
freeifaddrs(ifAddrStruct);
}
freeifaddrs(ifAddrStruct);
}
if (ifa == NULL) {
LOG(FATAL) << "error network interface: " << network_interface << ", please check!";
}
port_ = g_pika_conf->port();
port_ = g_pika_conf->port();
LOG(INFO) << "host: " << host_ << " port: " << port_;
return true;
return true;
}
......@@ -252,19 +256,19 @@ void PikaServer::Start() {
if (ret != pink::kSuccess) {
delete logger_;
db_.reset();
LOG(FATAL) << "Start BinlogReceiver Error: " << ret;
LOG(FATAL) << "Start BinlogReceiver Error: " << ret << (ret == pink::kBindError ? ": bind port conflict" : ": other error");
}
ret = pika_heartbeat_thread_->StartThread();
if (ret != pink::kSuccess) {
delete logger_;
db_.reset();
LOG(FATAL) << "Start Heartbeat Error: " << ret;
LOG(FATAL) << "Start Heartbeat Error: " << ret << (ret == pink::kBindError ? ": bind port conflict" : ": other error");
}
ret = pika_trysync_thread_->StartThread();
if (ret != pink::kSuccess) {
delete logger_;
db_.reset();
LOG(FATAL) << "Start Trysync Error: " << ret;
LOG(FATAL) << "Start Trysync Error: " << ret << (ret == pink::kBindError ? ": bind port conflict" : ": other error");
}
time(&start_time_s_);
......@@ -1210,7 +1214,7 @@ void PikaServer::DoPurgeDir(void* arg) {
delete static_cast<std::string*>(arg);
}
void PikaServer::AddMonitorClient(pink::RedisConn* client_ptr) {
void PikaServer::AddMonitorClient(PikaClientConn* client_ptr) {
monitor_thread_->AddMonitorClient(client_ptr);
}
......
Subproject commit 3342a5d137c15d2a40b93365293bc250c9fbbfb7
Subproject commit c568c854f66637054bed8d93c49e6517255f361e
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册