mirror of
https://github.com/joyieldInc/predixy.git
synced 2025-12-24 22:46:41 +08:00
1.support section for INFO command
2.fix authority bug 3.fix test base
This commit is contained in:
parent
6da3706900
commit
dc1de3935c
11
src/Auth.cpp
11
src/Auth.cpp
@ -10,8 +10,8 @@
|
||||
#include "Request.h"
|
||||
|
||||
|
||||
Auth::Auth():
|
||||
mMode(Command::Read|Command::Write|Command::Admin),
|
||||
Auth::Auth(int mode):
|
||||
mMode(mode),
|
||||
mReadKeyPrefix(nullptr),
|
||||
mWriteKeyPrefix(nullptr)
|
||||
{
|
||||
@ -75,10 +75,11 @@ bool Auth::permission(Request* req, const String& key) const
|
||||
return true;
|
||||
}
|
||||
|
||||
Auth Authority::DefaultAuth;
|
||||
Auth Authority::AuthAllowAll;
|
||||
Auth Authority::AuthDenyAll(0);
|
||||
|
||||
Authority::Authority():
|
||||
mDefault(&DefaultAuth)
|
||||
mDefault(&AuthAllowAll)
|
||||
{
|
||||
}
|
||||
|
||||
@ -102,5 +103,7 @@ void Authority::add(const AuthConf& ac)
|
||||
mAuthMap[a->password()] = a;
|
||||
if (a->password().empty()) {
|
||||
mDefault = a;
|
||||
} else if (mDefault == &AuthAllowAll) {
|
||||
mDefault = &AuthDenyAll;
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
class Auth
|
||||
{
|
||||
public:
|
||||
Auth();
|
||||
Auth(int mode = Command::Read|Command::Write|Command::Admin);
|
||||
Auth(const AuthConf& conf);
|
||||
~Auth();
|
||||
const String& password() const
|
||||
@ -53,7 +53,8 @@ public:
|
||||
private:
|
||||
std::map<String, Auth*> mAuthMap;
|
||||
Auth* mDefault;
|
||||
static Auth DefaultAuth;
|
||||
static Auth AuthAllowAll;
|
||||
static Auth AuthDenyAll;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
163
src/Handler.cpp
163
src/Handler.cpp
@ -889,98 +889,111 @@ void Handler::infoRequest(Request* req, const String& key)
|
||||
infoServerLatencyRequest(req);
|
||||
return;
|
||||
}
|
||||
bool all = key.equal("All", true);
|
||||
bool empty = key.empty();
|
||||
ResponsePtr res = ResponseAlloc::create();
|
||||
res->setType(Reply::String);
|
||||
Segment& body = res->body();
|
||||
BufferPtr buf = body.fset(nullptr, "# Proxy\n");
|
||||
buf = buf->fappend("Version:%s\n", _PREDIXY_VERSION_);
|
||||
buf = buf->fappend("Name:%s\n", mProxy->conf()->name());
|
||||
buf = buf->fappend("Bind:%s\n", mProxy->conf()->bind());
|
||||
buf = buf->fappend("RedisMode:proxy\n");
|
||||
Buffer* buf = body.fset(nullptr, "");
|
||||
|
||||
#define Scope(all, empty, header) ((all || empty || key.equal(header, true)) ? \
|
||||
(buf = buf->fappend("# %s\n", header)) : nullptr)
|
||||
|
||||
if (Scope(all, empty, "Proxy")) {
|
||||
buf = buf->fappend("Version:%s\n", _PREDIXY_VERSION_);
|
||||
buf = buf->fappend("Name:%s\n", mProxy->conf()->name());
|
||||
buf = buf->fappend("Bind:%s\n", mProxy->conf()->bind());
|
||||
buf = buf->fappend("RedisMode:proxy\n");
|
||||
#ifdef _PREDIXY_SINGLE_THREAD_
|
||||
buf = buf->fappend("SingleThread:true\n");
|
||||
buf = buf->fappend("SingleThread:true\n");
|
||||
#else
|
||||
buf = buf->fappend("SingleThread:false\n");
|
||||
buf = buf->fappend("SingleThread:false\n");
|
||||
#endif
|
||||
buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads());
|
||||
SString<32> timeStr;
|
||||
timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime());
|
||||
buf = buf->fappend("UptimeSince:%s\n", timeStr.data());
|
||||
buf = buf->fappend("\n");
|
||||
|
||||
buf = buf->fappend("# SystemResource\n");
|
||||
buf = buf->fappend("UsedMemory:%ld\n", AllocBase::getUsedMemory());
|
||||
buf = buf->fappend("MaxMemory:%ld\n", AllocBase::getMaxMemory());
|
||||
struct rusage ru;
|
||||
int ret = getrusage(RUSAGE_SELF, &ru);
|
||||
if (ret == 0) {
|
||||
buf = buf->fappend("MaxRSS:%ld\n", ru.ru_maxrss<<10);
|
||||
buf = buf->fappend("UsedCpuSys:%.3f\n", (double)ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1000000.);
|
||||
buf = buf->fappend("UsedCpuUser:%.3f\n", (double)ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1000000.);
|
||||
} else {
|
||||
logError("h %d getrusage fail %s", id(), StrError());
|
||||
}
|
||||
buf = buf->fappend("\n");
|
||||
|
||||
buf = buf->fappend("# Stats\n");
|
||||
HandlerStats st(mStats);
|
||||
for (auto h : mProxy->handlers()) {
|
||||
if (h == this) {
|
||||
continue;
|
||||
}
|
||||
st += h->mStats;
|
||||
}
|
||||
buf = buf->fappend("Accept:%ld\n", st.accept);
|
||||
buf = buf->fappend("ClientConnections:%ld\n", st.clientConnections);
|
||||
buf = buf->fappend("TotalRequests:%ld\n", st.requests);
|
||||
buf = buf->fappend("TotalResponses:%ld\n", st.responses);
|
||||
buf = buf->fappend("TotalRecvClientBytes:%ld\n", st.recvClientBytes);
|
||||
buf = buf->fappend("TotalSendServerBytes:%ld\n", st.sendServerBytes);
|
||||
buf = buf->fappend("TotalRecvServerBytes:%ld\n", st.recvServerBytes);
|
||||
buf = buf->fappend("TotalSendClientBytes:%ld\n", st.sendClientBytes);
|
||||
buf = buf->fappend("\n");
|
||||
|
||||
buf = buf->fappend("# Servers\n");
|
||||
int servCursor = 0;
|
||||
auto sp = mProxy->serverPool();
|
||||
while (Server* serv = sp->iter(servCursor)) {
|
||||
ServerStats st;
|
||||
for (auto h : mProxy->handlers()) {
|
||||
if (auto cp = h->getConnectConnectionPool(serv->id())) {
|
||||
st += cp->stats();
|
||||
}
|
||||
}
|
||||
buf->fappend("Server:%s\n", serv->addr().data());
|
||||
buf->fappend("Role:%s\n", serv->roleStr());
|
||||
auto g = serv->group();
|
||||
buf->fappend("Group:%s\n", g ? g->name().data() : "");
|
||||
buf->fappend("DC:%s\n", serv->dcName().data());
|
||||
buf->fappend("CurrentIsFail:%d\n", (int)serv->fail());
|
||||
buf->fappend("Connections:%d\n", st.connections);
|
||||
buf->fappend("Connect:%ld\n", st.connect);
|
||||
buf->fappend("Requests:%ld\n", st.requests);
|
||||
buf->fappend("Responses:%ld\n", st.responses);
|
||||
buf->fappend("SendBytes:%ld\n", st.sendBytes);
|
||||
buf->fappend("RecvBytes:%ld\n", st.recvBytes);
|
||||
buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads());
|
||||
buf = buf->fappend("Uptime:%ld\n", (long)mProxy->startTime());
|
||||
SString<32> timeStr;
|
||||
timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime());
|
||||
buf = buf->fappend("UptimeSince:%s\n", timeStr.data());
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
buf = buf->fappend("\n");
|
||||
|
||||
buf = buf->fappend("# LatencyMonitor\n");
|
||||
LatencyMonitor lm;
|
||||
for (size_t i = 0; i < mLatencyMonitors.size(); ++i) {
|
||||
lm = mLatencyMonitors[i];
|
||||
if (Scope(all, empty, "SystemResource")) {
|
||||
buf = buf->fappend("UsedMemory:%ld\n", AllocBase::getUsedMemory());
|
||||
buf = buf->fappend("MaxMemory:%ld\n", AllocBase::getMaxMemory());
|
||||
struct rusage ru;
|
||||
int ret = getrusage(RUSAGE_SELF, &ru);
|
||||
if (ret == 0) {
|
||||
buf = buf->fappend("MaxRSS:%ld\n", ru.ru_maxrss<<10);
|
||||
buf = buf->fappend("UsedCpuSys:%.3f\n", (double)ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1000000.);
|
||||
buf = buf->fappend("UsedCpuUser:%.3f\n", (double)ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1000000.);
|
||||
} else {
|
||||
logError("h %d getrusage fail %s", id(), StrError());
|
||||
}
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
|
||||
if (Scope(all, empty, "Stats")) {
|
||||
HandlerStats st(mStats);
|
||||
for (auto h : mProxy->handlers()) {
|
||||
if (h == this) {
|
||||
continue;
|
||||
}
|
||||
lm += h->mLatencyMonitors[i];
|
||||
st += h->mStats;
|
||||
}
|
||||
buf = buf->fappend("LatencyMonitorName:%s\n", lm.name().data());
|
||||
buf = lm.output(buf);
|
||||
buf = buf->fappend("Accept:%ld\n", st.accept);
|
||||
buf = buf->fappend("ClientConnections:%ld\n", st.clientConnections);
|
||||
buf = buf->fappend("TotalRequests:%ld\n", st.requests);
|
||||
buf = buf->fappend("TotalResponses:%ld\n", st.responses);
|
||||
buf = buf->fappend("TotalRecvClientBytes:%ld\n", st.recvClientBytes);
|
||||
buf = buf->fappend("TotalSendServerBytes:%ld\n", st.sendServerBytes);
|
||||
buf = buf->fappend("TotalRecvServerBytes:%ld\n", st.recvServerBytes);
|
||||
buf = buf->fappend("TotalSendClientBytes:%ld\n", st.sendClientBytes);
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
|
||||
if (Scope(all, empty, "Servers")) {
|
||||
int servCursor = 0;
|
||||
auto sp = mProxy->serverPool();
|
||||
while (Server* serv = sp->iter(servCursor)) {
|
||||
ServerStats st;
|
||||
for (auto h : mProxy->handlers()) {
|
||||
if (auto cp = h->getConnectConnectionPool(serv->id())) {
|
||||
st += cp->stats();
|
||||
}
|
||||
}
|
||||
buf->fappend("Server:%s\n", serv->addr().data());
|
||||
buf->fappend("Role:%s\n", serv->roleStr());
|
||||
auto g = serv->group();
|
||||
buf->fappend("Group:%s\n", g ? g->name().data() : "");
|
||||
buf->fappend("DC:%s\n", serv->dcName().data());
|
||||
buf->fappend("CurrentIsFail:%d\n", (int)serv->fail());
|
||||
buf->fappend("Connections:%d\n", st.connections);
|
||||
buf->fappend("Connect:%ld\n", st.connect);
|
||||
buf->fappend("Requests:%ld\n", st.requests);
|
||||
buf->fappend("Responses:%ld\n", st.responses);
|
||||
buf->fappend("SendBytes:%ld\n", st.sendBytes);
|
||||
buf->fappend("RecvBytes:%ld\n", st.recvBytes);
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
|
||||
if (Scope(all, empty, "LatencyMonitor")) {
|
||||
LatencyMonitor lm;
|
||||
for (size_t i = 0; i < mLatencyMonitors.size(); ++i) {
|
||||
lm = mLatencyMonitors[i];
|
||||
for (auto h : mProxy->handlers()) {
|
||||
if (h == this) {
|
||||
continue;
|
||||
}
|
||||
lm += h->mLatencyMonitors[i];
|
||||
}
|
||||
buf = buf->fappend("LatencyMonitorName:%s\n", lm.name().data());
|
||||
buf = lm.output(buf);
|
||||
buf = buf->fappend("\n");
|
||||
}
|
||||
}
|
||||
|
||||
buf = buf->fappend("\r\n");
|
||||
body.end().buf = buf;
|
||||
body.end().pos = buf->length();
|
||||
|
||||
@ -133,6 +133,7 @@ Cases = [
|
||||
[('del', 'list', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6'), 7],
|
||||
]),
|
||||
('touch', [
|
||||
[('del', 'k1', 'k2', 'k3', 'k4'), ],
|
||||
[('mset', 'k1', 'v1', 'k2', 'v2', 'k3', 'v3'), 'OK'],
|
||||
[('touch', 'k1'), 1],
|
||||
[('touch', 'k1', 'k2', 'k3', 'k4'), 3],
|
||||
|
||||
Loading…
Reference in New Issue
Block a user