1.support section for INFO command

2.fix authority bug
3.fix test base
This commit is contained in:
fortrue 2017-11-23 15:08:05 +08:00
parent 6da3706900
commit dc1de3935c
4 changed files with 99 additions and 81 deletions

View File

@ -10,8 +10,8 @@
#include "Request.h" #include "Request.h"
Auth::Auth(): Auth::Auth(int mode):
mMode(Command::Read|Command::Write|Command::Admin), mMode(mode),
mReadKeyPrefix(nullptr), mReadKeyPrefix(nullptr),
mWriteKeyPrefix(nullptr) mWriteKeyPrefix(nullptr)
{ {
@ -75,10 +75,11 @@ bool Auth::permission(Request* req, const String& key) const
return true; return true;
} }
Auth Authority::DefaultAuth; Auth Authority::AuthAllowAll;
Auth Authority::AuthDenyAll(0);
Authority::Authority(): Authority::Authority():
mDefault(&DefaultAuth) mDefault(&AuthAllowAll)
{ {
} }
@ -102,5 +103,7 @@ void Authority::add(const AuthConf& ac)
mAuthMap[a->password()] = a; mAuthMap[a->password()] = a;
if (a->password().empty()) { if (a->password().empty()) {
mDefault = a; mDefault = a;
} else if (mDefault == &AuthAllowAll) {
mDefault = &AuthDenyAll;
} }
} }

View File

@ -15,7 +15,7 @@
class Auth class Auth
{ {
public: public:
Auth(); Auth(int mode = Command::Read|Command::Write|Command::Admin);
Auth(const AuthConf& conf); Auth(const AuthConf& conf);
~Auth(); ~Auth();
const String& password() const const String& password() const
@ -53,7 +53,8 @@ public:
private: private:
std::map<String, Auth*> mAuthMap; std::map<String, Auth*> mAuthMap;
Auth* mDefault; Auth* mDefault;
static Auth DefaultAuth; static Auth AuthAllowAll;
static Auth AuthDenyAll;
}; };
#endif #endif

View File

@ -889,98 +889,111 @@ void Handler::infoRequest(Request* req, const String& key)
infoServerLatencyRequest(req); infoServerLatencyRequest(req);
return; return;
} }
bool all = key.equal("All", true);
bool empty = key.empty();
ResponsePtr res = ResponseAlloc::create(); ResponsePtr res = ResponseAlloc::create();
res->setType(Reply::String); res->setType(Reply::String);
Segment& body = res->body(); Segment& body = res->body();
BufferPtr buf = body.fset(nullptr, "# Proxy\n"); Buffer* buf = body.fset(nullptr, "");
buf = buf->fappend("Version:%s\n", _PREDIXY_VERSION_);
buf = buf->fappend("Name:%s\n", mProxy->conf()->name()); #define Scope(all, empty, header) ((all || empty || key.equal(header, true)) ? \
buf = buf->fappend("Bind:%s\n", mProxy->conf()->bind()); (buf = buf->fappend("# %s\n", header)) : nullptr)
buf = buf->fappend("RedisMode:proxy\n");
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_ #ifdef _PREDIXY_SINGLE_THREAD_
buf = buf->fappend("SingleThread:true\n"); buf = buf->fappend("SingleThread:true\n");
#else #else
buf = buf->fappend("SingleThread:false\n"); buf = buf->fappend("SingleThread:false\n");
#endif #endif
buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads()); buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads());
SString<32> timeStr; buf = buf->fappend("Uptime:%ld\n", (long)mProxy->startTime());
timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime()); SString<32> timeStr;
buf = buf->fappend("UptimeSince:%s\n", timeStr.data()); timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime());
buf = buf->fappend("\n"); buf = buf->fappend("UptimeSince:%s\n", timeStr.data());
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("\n"); buf = buf->fappend("\n");
} }
buf = buf->fappend("\n");
buf = buf->fappend("# LatencyMonitor\n"); if (Scope(all, empty, "SystemResource")) {
LatencyMonitor lm; buf = buf->fappend("UsedMemory:%ld\n", AllocBase::getUsedMemory());
for (size_t i = 0; i < mLatencyMonitors.size(); ++i) { buf = buf->fappend("MaxMemory:%ld\n", AllocBase::getMaxMemory());
lm = mLatencyMonitors[i]; 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()) { for (auto h : mProxy->handlers()) {
if (h == this) { if (h == this) {
continue; continue;
} }
lm += h->mLatencyMonitors[i]; st += h->mStats;
} }
buf = buf->fappend("LatencyMonitorName:%s\n", lm.name().data()); buf = buf->fappend("Accept:%ld\n", st.accept);
buf = lm.output(buf); 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("\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"); buf = buf->fappend("\r\n");
body.end().buf = buf; body.end().buf = buf;
body.end().pos = buf->length(); body.end().pos = buf->length();

View File

@ -133,6 +133,7 @@ Cases = [
[('del', 'list', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6'), 7], [('del', 'list', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6'), 7],
]), ]),
('touch', [ ('touch', [
[('del', 'k1', 'k2', 'k3', 'k4'), ],
[('mset', 'k1', 'v1', 'k2', 'v2', 'k3', 'v3'), 'OK'], [('mset', 'k1', 'v1', 'k2', 'v2', 'k3', 'v3'), 'OK'],
[('touch', 'k1'), 1], [('touch', 'k1'), 1],
[('touch', 'k1', 'k2', 'k3', 'k4'), 3], [('touch', 'k1', 'k2', 'k3', 'k4'), 3],