predixy/src/Conf.h
Yoon 5d9cd99270 Add support custom commands
Custom commands are from redis module can be added up to 16(currently).
Configuration is like below.

CustomCommand {
  hello {      # hello is command, must be lower case.
               # this command has 2 or 3 parameters and first argument is key
    minArgs 2  # minimum arguments(including command itself)
    maxArgs 3  # maximum arguments(including command itself)
    mode Write,Read # this command is writable and readable
               # mode value can be Admin, Private, NoKey, MultiKey, SMultiKey, MultiKeyVal, KeyAt2, KeyAt3
  }
  newcommand { # default minArgs = 1, maxArgs = 1 and mode = Write
    mode Admin
  }
  ...
}
2018-04-05 16:17:47 +09:00

239 lines
5.9 KiB
C++

/*
* predixy - A high performance and full features proxy for redis.
* Copyright (C) 2017 Joyield, Inc. <joyield.com@gmail.com>
* All rights reserved.
*/
#ifndef _PREDIXY_CONF_H_
#define _PREDIXY_CONF_H_
#include <limits.h>
#include <string.h>
#include <strings.h>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <bitset>
#include "Predixy.h"
#include "Distribution.h"
#include "ConfParser.h"
#include "Auth.h"
#include "Command.h"
struct AuthConf
{
std::string password;
int mode; //Command::Mode
std::vector<std::string> keyPrefix;
std::vector<std::string> readKeyPrefix;
std::vector<std::string> writeKeyPrefix;
};
struct ServerConf
{
std::string password;
std::string addr;
static bool parse(ServerConf& s, const char* str);
};
struct ServerGroupConf
{
std::string name;
std::vector<ServerConf> servers;
};
struct ServerPoolConf
{
std::string password;
int masterReadPriority = 50;
int staticSlaveReadPriority = 0;
int dynamicSlaveReadPriority = 0;
long refreshInterval = 1000000; //us
long serverTimeout = 0; //us
int serverFailureLimit = 10;
long serverRetryTimeout = 1000000; //us
int keepalive = 0; //seconds
int databases = 1;
};
struct ClusterServerPoolConf : public ServerPoolConf
{
std::vector<ServerConf> servers;
};
struct SentinelServerPoolConf : public ServerPoolConf
{
Distribution dist = Distribution::None;
Hash hash = Hash::None;
char hashTag[2];
std::string sentinelPassword;
std::vector<ServerConf> sentinels;
std::vector<ServerGroupConf> groups;
};
struct ReadPolicyConf
{
std::string name;
int priority;
int weight;
};
struct DCConf
{
std::string name;
std::vector<std::string> addrPrefix;
std::vector<ReadPolicyConf> readPolicy;
};
struct LatencyMonitorConf
{
std::string name;
std::bitset<Command::AvailableCommands> cmds;
std::vector<long> timeSpan;//us
};
struct CustomCommandConf
{
std::string name;
Command cmd;
static void init(CustomCommandConf &c, const char* name, const int type);
};
class Conf
{
public:
DefException(InvalidStartArg);
DefException(UnknownKey);
DefException(InvalidValue);
DefException(LogicError);
public:
Conf();
~Conf();
bool init(int argc, char* argv[]);
const char* name() const
{
return mName.c_str();
}
const char* bind() const
{
return mBind.c_str();
}
int workerThreads() const
{
return mWorkerThreads;
}
long maxMemory() const
{
return mMaxMemory;
}
void setClientTimeout(long v)
{
mClientTimeout = v;
}
long clientTimeout() const
{
return mClientTimeout;
}
int bufSize() const
{
return mBufSize;
}
const std::vector<AuthConf>& authConfs() const
{
return mAuthConfs;
}
const char* log() const
{
return mLog.c_str();
}
int logRotateSecs() const
{
return mLogRotateSecs;
}
long logRotateBytes() const
{
return mLogRotateBytes;
}
bool allowMissLog() const
{
return mAllowMissLog;
}
int logSample(LogLevel::Type lvl) const
{
return mLogSample[lvl];
}
int serverPoolType() const
{
return mServerPoolType;
}
const ClusterServerPoolConf& clusterServerPool() const
{
return mClusterServerPool;
}
const SentinelServerPoolConf& sentinelServerPool() const
{
return mSentinelServerPool;
}
const std::string& localDC() const
{
return mLocalDC;
}
const std::vector<DCConf>& dcConfs() const
{
return mDCConfs;
}
const std::vector<LatencyMonitorConf>& latencyMonitors() const
{
return mLatencyMonitors;
}
public:
static bool parseMemory(long& m, const char* str);
static bool parseDuration(long& v, const char* str);
private:
void setGlobal(const ConfParser::Node* node);
void setAuthority(const ConfParser::Node* node);
void setClusterServerPool(const ConfParser::Node* node);
void setSentinelServerPool(const ConfParser::Node* node);
void setDataCenter(const ConfParser::Node* node);
void check();
bool setServerPool(ServerPoolConf& sp, const ConfParser::Node* n);
bool setStr(std::string& attr, const char* name, const ConfParser::Node* n);
bool setInt(int& attr, const char* name, const ConfParser::Node* n, int lower = INT_MIN, int upper = INT_MAX);
bool setLong(long& attr, const char* name, const ConfParser::Node* n, long lower = LONG_MIN, long upper = LONG_MAX);
bool setBool(bool& attr, const char* name, const ConfParser::Node* n);
bool setMemory(long& mem, const char* name, const ConfParser::Node* n);
bool setDuration(long& v, const char* name, const ConfParser::Node* n);
bool setServers(std::vector<ServerConf>& servs, const char* name, const ConfParser::Node* n);
void setDC(DCConf& dc, const ConfParser::Node* n);
void setReadPolicy(ReadPolicyConf& c, const ConfParser::Node* n);
void setLatencyMonitor(LatencyMonitorConf& m, const ConfParser::Node* n);
void setCustomCommand(const ConfParser::Node* n);
bool setCommandMode(int& mode, const char* name, const ConfParser::Node* n, const int defaultMode = Command::Write);
private:
std::string mName;
std::string mBind;
int mWorkerThreads;
long mMaxMemory;
long mClientTimeout; //us
int mBufSize;
std::string mLog;
int mLogRotateSecs;
long mLogRotateBytes;
bool mAllowMissLog;
int mLogSample[LogLevel::Sentinel];
std::vector<AuthConf> mAuthConfs;
int mServerPoolType;
ClusterServerPoolConf mClusterServerPool;
SentinelServerPoolConf mSentinelServerPool;
std::vector<DCConf> mDCConfs;
std::string mLocalDC;
std::vector<LatencyMonitorConf> mLatencyMonitors;
std::vector<CustomCommandConf> mCustomCommands;
};
#endif