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"
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;
}
}

View File

@ -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

View File

@ -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();

View File

@ -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],