190 lines
5.8 KiB
C++
190 lines
5.8 KiB
C++
/*
|
|
Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License, version 2.0,
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is also distributed with certain software (including
|
|
but not limited to OpenSSL) that is licensed under separate terms,
|
|
as designated in a particular file or component or in included license
|
|
documentation. The authors of MySQL hereby grant you an additional
|
|
permission to link the program and your derivative works with the
|
|
separately licensed software that they have included with MySQL.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License, version 2.0, for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
#ifndef NDBMEMCACHE_CONFIGURATION_H
|
|
#define NDBMEMCACHE_CONFIGURATION_H
|
|
|
|
#ifndef __cplusplus
|
|
#error "This file is for C++ only"
|
|
#endif
|
|
|
|
#include <string.h>
|
|
|
|
#include <NdbApi.hpp>
|
|
|
|
#include "ClusterConnectionPool.h"
|
|
#include "KeyPrefix.h"
|
|
#include "QueryPlan.h"
|
|
|
|
/********************
|
|
NDB Configuration.
|
|
|
|
The Configuration class contains a configuration and supplies it via a
|
|
public API.
|
|
|
|
A set of configuration reader classes, config_v0, config_v1, etc. read
|
|
the configuration from its backing store. config_v0 simply constructs
|
|
a hard-coded config used in the first prototype. config_v1 reads a
|
|
configuration from a particular set of tables in the "ndbmemcache" schema
|
|
on the primary cluster. This metadata defines key prefixes and possible
|
|
connections to additional clusters.
|
|
|
|
The configuration readers provide a single public method, read_configuration().
|
|
The readers use the two protected API methods of Configuration,
|
|
storeConnection() and storePrefix(), to store the configuration there.
|
|
*********************/
|
|
|
|
|
|
// Forward declarations for Configuration and all config readers:
|
|
class Configuration;
|
|
class config_v0;
|
|
class config_v1;
|
|
class config_v1_0;
|
|
class config_v1_1;
|
|
class config_v1_2;
|
|
|
|
enum config_ver_enum {
|
|
CONFIG_VER_UNKNOWN,
|
|
CONFIG_VER_UNSUPPORTED,
|
|
CONFIG_VER_0,
|
|
CONFIG_VER_1_0,
|
|
CONFIG_VER_1_1,
|
|
CONFIG_VER_1_2
|
|
};
|
|
|
|
class Configuration {
|
|
friend class config_v0;
|
|
friend class config_v1;
|
|
friend class config_v1_0;
|
|
friend class config_v1_1;
|
|
friend class config_v1_2;
|
|
|
|
public:
|
|
/* public methods */
|
|
Configuration() : nclusters(0), nprefixes(0),
|
|
config_version(CONFIG_VER_UNKNOWN) {}
|
|
Configuration(Configuration *);
|
|
|
|
bool connectToPrimary();
|
|
bool openAllConnections();
|
|
bool readConfiguration();
|
|
void disconnectAll();
|
|
ClusterConnectionPool * getConnectionPoolById(int cluster_id) const;// inlined
|
|
const KeyPrefix * getDefaultPrefix() const; // inlined
|
|
const KeyPrefix * getPrefixForKey(const char *key, int nkey) const;
|
|
const KeyPrefix * getPrefixByInfo(const prefix_info_t info) const;
|
|
const KeyPrefix * getPrefix(int id) const; // inlined
|
|
const KeyPrefix * getNextPrefixForCluster(uint cluster_id, const KeyPrefix *) const;
|
|
void setPrimaryConnectString(const char *); // inlined
|
|
void setServerRole(const char *); // inlined
|
|
const char * getServerRole(); // inlined
|
|
bool prefetchDictionary();
|
|
double figureInFlightTransactions(int cluster_id) const;
|
|
bool canReloadOnline() const;
|
|
int waitForReconfSignal();
|
|
|
|
/* public instance variables */
|
|
|
|
unsigned int generation; /* Set by GlobalConfigManager */
|
|
unsigned int nclusters;
|
|
unsigned int nprefixes;
|
|
unsigned int max_tps; /* target throughput, transactions per second */
|
|
struct {
|
|
uint64_t for_ndb_engine;
|
|
uint64_t for_default_engine;
|
|
} initial_cas;
|
|
|
|
protected:
|
|
/* The protected methods and variables are shared with the config_XXX
|
|
classes */
|
|
int storeConnection(const char *connectstring, unsigned int usec_rtt);
|
|
int storePrefix(KeyPrefix &prefix);
|
|
void storeCAS(uint64_t ndb_engine_cas, uint64_t default_engine_cas);
|
|
|
|
const char *primary_connect_string;
|
|
int onlineReloadFlag;
|
|
int (*reload_waiter)(Ndb_cluster_connection *, const char *);
|
|
|
|
private:
|
|
/* private methods */
|
|
void store_default_prefix();
|
|
config_ver_enum get_supported_version();
|
|
bool fetch_meta_record(QueryPlan *plan, Ndb *db, const char *version);
|
|
|
|
/* private instance variables */
|
|
const char *server_role;
|
|
config_ver_enum config_version;
|
|
Ndb_cluster_connection *primary_conn;
|
|
const char * connect_strings[MAX_CLUSTERS];
|
|
KeyPrefix * prefixes[MAX_KEY_PREFIXES];
|
|
};
|
|
|
|
|
|
class config_v0 {
|
|
public:
|
|
/* Methods */
|
|
config_v0(Configuration * cf) : conf(*cf) {}
|
|
bool read_configuration();
|
|
|
|
/* Instance variables */
|
|
Configuration &conf;
|
|
};
|
|
|
|
|
|
/* Inline methods */
|
|
|
|
inline void Configuration::setServerRole(const char *role) {
|
|
server_role = role;
|
|
}
|
|
|
|
inline const char * Configuration::getServerRole() {
|
|
return server_role;
|
|
}
|
|
|
|
inline void Configuration::setPrimaryConnectString(const char *mgm) {
|
|
primary_connect_string = mgm;
|
|
}
|
|
|
|
inline ClusterConnectionPool * Configuration::getConnectionPoolById(int id) const
|
|
{
|
|
return get_connection_pool_for_cluster(connect_strings[id]);
|
|
}
|
|
|
|
inline const KeyPrefix * Configuration::getDefaultPrefix() const {
|
|
return prefixes[0];
|
|
}
|
|
|
|
inline const KeyPrefix * Configuration::getPrefix(int id) const {
|
|
return prefixes[id];
|
|
}
|
|
|
|
inline bool Configuration::canReloadOnline() const {
|
|
return (bool) onlineReloadFlag;
|
|
}
|
|
|
|
|
|
/* Singleton Factory Method; implemented in ndb_configuration.cc */
|
|
Configuration & get_Configuration();
|
|
|
|
#endif
|