Use unordered_map in schemarouter

The shard map doesn't have to be in order and an unordered map will do
just fine.
This commit is contained in:
Markus Mäkelä 2017-07-04 13:01:04 +03:00
parent 11d494ef33
commit 71bc67b694
4 changed files with 16 additions and 19 deletions

View File

@ -32,7 +32,6 @@
#include <maxscale/spinlock.h>
using std::string;
using std::map;
namespace schemarouter
{

View File

@ -27,7 +27,7 @@ namespace schemarouter
bool connect_backend_servers(SSRBackendList& backends, MXS_SESSION* session);
enum route_target get_shard_route_target(uint32_t qtype);
bool change_current_db(string& dest, Shard& shard, GWBUF* buf);
bool change_current_db(std::string& dest, Shard& shard, GWBUF* buf);
bool extract_database(GWBUF* buf, char* str);
bool detect_show_shards(GWBUF* query);
void write_error_to_client(DCB* dcb, int errnum, const char* mysqlstate, const char* errmsg);
@ -1114,7 +1114,7 @@ void create_error_reply(char* fail_str, DCB* dcb)
* @return true if new database is set, false if non-existent database was tried
* to be set
*/
bool change_current_db(string& dest, Shard& shard, GWBUF* buf)
bool change_current_db(std::string& dest, Shard& shard, GWBUF* buf)
{
bool succp = false;
char db[MYSQL_DATABASE_MAXLEN + 1];

View File

@ -24,12 +24,12 @@ Shard::~Shard()
{
}
bool Shard::add_location(string db, SERVER* target)
bool Shard::add_location(std::string db, SERVER* target)
{
return m_map.insert(make_pair(db, target)).second;
return m_map.insert(std::make_pair(db, target)).second;
}
SERVER* Shard::get_location(string db)
SERVER* Shard::get_location(std::string db)
{
SERVER* rval = NULL;
ServerMap::iterator iter = m_map.find(db);
@ -76,9 +76,9 @@ ShardManager::~ShardManager()
{
}
Shard ShardManager::get_shard(string user, double max_interval)
Shard ShardManager::get_shard(std::string user, double max_interval)
{
SpinLockGuard guard(m_lock);
mxs::SpinLockGuard guard(m_lock);
ShardMap::iterator iter = m_maps.find(user);
@ -98,9 +98,9 @@ Shard ShardManager::get_shard(string user, double max_interval)
return iter->second;
}
void ShardManager::update_shard(Shard& shard, string user)
void ShardManager::update_shard(Shard& shard, std::string user)
{
SpinLockGuard guard(m_lock);
mxs::SpinLockGuard guard(m_lock);
ShardMap::iterator iter = m_maps.find(user);
if (iter == m_maps.end() || shard.newer_than(iter->second))

View File

@ -14,7 +14,7 @@
#include <maxscale/cppdefs.hh>
#include <map>
#include <tr1/unordered_map>
#include <string>
#include <list>
@ -23,11 +23,9 @@
#include <maxscale/spinlock.hh>
using namespace maxscale;
using std::map;
using std::string;
/** This contains the database to server mapping */
typedef map<string, SERVER*> ServerMap;
typedef std::tr1::unordered_map<std::string, SERVER*> ServerMap;
class Shard
{
@ -43,7 +41,7 @@ public:
*
* @return True if location was added
*/
bool add_location(string db, SERVER* target);
bool add_location(std::string db, SERVER* target);
/**
* @brief Retrieve the location of a database
@ -52,7 +50,7 @@ public:
*
* @return The database or NULL if no server contains the database
*/
SERVER* get_location(string db);
SERVER* get_location(std::string db);
/**
* @brief Check if shard contains stale information
@ -91,7 +89,7 @@ private:
time_t m_last_updated;
};
typedef map<string, Shard> ShardMap;
typedef std::tr1::unordered_map<std::string, Shard> ShardMap;
class ShardManager
{
@ -108,7 +106,7 @@ public:
* @return The latest version of the shard or a newly created shard if no
* old version is available
*/
Shard get_shard(string user, double max_lifetime);
Shard get_shard(std::string user, double max_lifetime);
/**
* @brief Update the shard information
@ -119,7 +117,7 @@ public:
* @param shard New version of the shard
* @param user The user whose shard this is
*/
void update_shard(Shard& shard, string user);
void update_shard(Shard& shard, std::string user);
private:
SPINLOCK m_lock;