summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorMarc Alff <marc.alff@sun.com>2009-12-11 01:58:13 -0700
committerMarc Alff <marc.alff@sun.com>2009-12-11 01:58:13 -0700
commitbea4ab9bb65f6ff576b9b71011c5a8f22baa164a (patch)
tree5d91d6cc01f82639588f2c17fbb5289637567684 /plugin
parentc082955f0676efe069f30384102ba7807b49dee6 (diff)
parent376cf4275f28f6b8167eaf19b2c66dee41fbc5c5 (diff)
downloadmariadb-git-bea4ab9bb65f6ff576b9b71011c5a8f22baa164a.tar.gz
Merge mysql-next-mr (revno 2936) --> mysql-next-mr-marc
Diffstat (limited to 'plugin')
-rw-r--r--plugin/semisync/CMakeLists.txt2
-rw-r--r--plugin/semisync/Makefile.am18
-rw-r--r--plugin/semisync/plug.in2
-rw-r--r--plugin/semisync/semisync_master.cc87
-rw-r--r--plugin/semisync/semisync_master.h23
5 files changed, 40 insertions, 92 deletions
diff --git a/plugin/semisync/CMakeLists.txt b/plugin/semisync/CMakeLists.txt
index d42510fab18..ad26298b0b7 100644
--- a/plugin/semisync/CMakeLists.txt
+++ b/plugin/semisync/CMakeLists.txt
@@ -29,7 +29,7 @@ SET(SEMISYNC_SLAVE_SOURCES semisync.cc semisync_slave.cc semisync_slave_plugin.c
ADD_DEFINITIONS(-DMYSQL_DYNAMIC_PLUGIN)
ADD_LIBRARY(semisync_master SHARED ${SEMISYNC_MASTER_SOURCES})
-TARGET_LINK_LIBRARIES(semisync_master mysqld)
+TARGET_LINK_LIBRARIES(semisync_master mysqlservices mysqld)
ADD_LIBRARY(semisync_slave SHARED ${SEMISYNC_SLAVE_SOURCES})
TARGET_LINK_LIBRARIES(semisync_slave mysqld)
MESSAGE("build SEMISYNC as DLL")
diff --git a/plugin/semisync/Makefile.am b/plugin/semisync/Makefile.am
index 25949485987..0022d600f57 100644
--- a/plugin/semisync/Makefile.am
+++ b/plugin/semisync/Makefile.am
@@ -23,16 +23,16 @@ INCLUDES = -I$(top_srcdir)/include \
noinst_HEADERS = semisync.h semisync_master.h semisync_slave.h
-pkgplugin_LTLIBRARIES = libsemisync_master.la libsemisync_slave.la
+pkgplugin_LTLIBRARIES = semisync_master.la semisync_slave.la
-libsemisync_master_la_LDFLAGS = -module
-libsemisync_master_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
-libsemisync_master_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
-libsemisync_master_la_SOURCES = semisync.cc semisync_master.cc semisync_master_plugin.cc
+semisync_master_la_LDFLAGS = -module -rpath $(pkgplugindir) -L$(top_builddir)/libservices -lmysqlservices
+semisync_master_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+semisync_master_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+semisync_master_la_SOURCES = semisync.cc semisync_master.cc semisync_master_plugin.cc
-libsemisync_slave_la_LDFLAGS = -module
-libsemisync_slave_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
-libsemisync_slave_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
-libsemisync_slave_la_SOURCES = semisync.cc semisync_slave.cc semisync_slave_plugin.cc
+semisync_slave_la_LDFLAGS = -module -rpath $(pkgplugindir) -L$(top_builddir)/libservices -lmysqlservices
+semisync_slave_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+semisync_slave_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
+semisync_slave_la_SOURCES = semisync.cc semisync_slave.cc semisync_slave_plugin.cc
EXTRA_DIST= CMakeLists.txt plug.in
diff --git a/plugin/semisync/plug.in b/plugin/semisync/plug.in
index 917c8950f02..82bd9772644 100644
--- a/plugin/semisync/plug.in
+++ b/plugin/semisync/plug.in
@@ -1,3 +1,3 @@
MYSQL_PLUGIN(semisync,[Semi-synchronous Replication Plugin],
[Semi-synchronous replication plugin.])
-MYSQL_PLUGIN_DYNAMIC(semisync, [libsemisync_master.la libsemisync_slave.la])
+MYSQL_PLUGIN_DYNAMIC(semisync, [semisync_master.la semisync_slave.la])
diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc
index 23c78eca587..eb8d7465025 100644
--- a/plugin/semisync/semisync_master.cc
+++ b/plugin/semisync/semisync_master.cc
@@ -63,29 +63,14 @@ static int gettimeofday(struct timeval *tv, void *tz)
*
******************************************************************************/
-ActiveTranx::ActiveTranx(int max_connections,
- mysql_mutex_t *lock,
+ActiveTranx::ActiveTranx(mysql_mutex_t *lock,
unsigned long trace_level)
- : Trace(trace_level), num_transactions_(max_connections),
- num_entries_(max_connections << 1),
+ : Trace(trace_level),
+ num_entries_(max_connections << 1), /* Transaction hash table size
+ * is set to double the size
+ * of max_connections */
lock_(lock)
{
- /* Allocate the memory for the array */
- node_array_ = new TranxNode[num_transactions_];
- for (int idx = 0; idx < num_transactions_; ++idx)
- {
- node_array_[idx].log_pos_ = 0;
- node_array_[idx].hash_next_ = NULL;
- node_array_[idx].next_ = node_array_ + idx + 1;
-
- node_array_[idx].log_name_ = new char[FN_REFLEN];
- node_array_[idx].log_name_[0] = '\x0';
- }
- node_array_[num_transactions_-1].next_ = NULL;
-
- /* All nodes in the array go to the pool initially. */
- free_pool_ = node_array_;
-
/* No transactions are in the list initially. */
trx_front_ = NULL;
trx_rear_ = NULL;
@@ -95,24 +80,13 @@ ActiveTranx::ActiveTranx(int max_connections,
for (int idx = 0; idx < num_entries_; ++idx)
trx_htb_[idx] = NULL;
- sql_print_information("Semi-sync replication initialized for %d "
- "transactions.", num_transactions_);
+ sql_print_information("Semi-sync replication initialized for transactions.");
}
ActiveTranx::~ActiveTranx()
{
- for (int idx = 0; idx < num_transactions_; ++idx)
- {
- delete [] node_array_[idx].log_name_;
- node_array_[idx].log_name_ = NULL;
- }
-
- delete [] node_array_;
delete [] trx_htb_;
-
- node_array_ = NULL;
trx_htb_ = NULL;
- num_transactions_ = 0;
num_entries_ = 0;
}
@@ -143,26 +117,21 @@ unsigned int ActiveTranx::get_hash_value(const char *log_file_name,
ActiveTranx::TranxNode* ActiveTranx::alloc_tranx_node()
{
- TranxNode *ptr = free_pool_;
-
- if (free_pool_)
- {
- free_pool_ = free_pool_->next_;
- ptr->next_ = NULL;
- ptr->hash_next_ = NULL;
- }
- else
+ MYSQL_THD thd= (MYSQL_THD)current_thd;
+ /* The memory allocated for TranxNode will be automatically freed at
+ the end of the command of current THD. And because
+ ha_autocommit_or_rollback() will always be called before that, so
+ we are sure that the node will be removed from the active list
+ before it get freed. */
+ TranxNode *trx_node = (TranxNode *)thd_alloc(thd, sizeof(TranxNode));
+ if (trx_node)
{
- /*
- free_pool should never be NULL here, because we have
- max_connections number of pre-allocated nodes.
- */
- sql_print_error("You have encountered a semi-sync bug (free_pool == NULL), "
- "please report to http://bugs.mysql.com");
- assert(free_pool_);
+ trx_node->log_name_[0] = '\0';
+ trx_node->log_pos_= 0;
+ trx_node->next_= 0;
+ trx_node->hash_next_= 0;
}
-
- return ptr;
+ return trx_node;
}
int ActiveTranx::compare(const char *log_file_name1, my_off_t log_file_pos1,
@@ -306,14 +275,12 @@ int ActiveTranx::clear_active_tranx_nodes(const char *log_file_name,
/* Clear the active transaction list. */
if (trx_front_ != NULL)
{
- trx_rear_->next_ = free_pool_;
- free_pool_ = trx_front_;
trx_front_ = NULL;
trx_rear_ = NULL;
}
if (trace_level_ & kTraceDetail)
- sql_print_information("%s: free all nodes back to free list", kWho);
+ sql_print_information("%s: cleared all nodes", kWho);
}
else if (new_front != trx_front_)
{
@@ -325,10 +292,6 @@ int ActiveTranx::clear_active_tranx_nodes(const char *log_file_name,
while (curr_node != new_front)
{
next_node = curr_node->next_;
-
- /* Put the node in the memory pool. */
- curr_node->next_ = free_pool_;
- free_pool_ = curr_node;
n_frees++;
/* Remove the node from the hash table. */
@@ -350,7 +313,7 @@ int ActiveTranx::clear_active_tranx_nodes(const char *log_file_name,
trx_front_ = new_front;
if (trace_level_ & kTraceDetail)
- sql_print_information("%s: free %d nodes back until pos (%s, %lu)",
+ sql_print_information("%s: cleared %d nodes back until pos (%s, %lu)",
kWho, n_frees,
trx_front_->log_name_, (unsigned long)trx_front_->log_pos_);
}
@@ -391,8 +354,7 @@ ReplSemiSyncMaster::ReplSemiSyncMaster()
wait_file_pos_(0),
master_enabled_(false),
wait_timeout_(0L),
- state_(0),
- max_transactions_(0L)
+ state_(0)
{
strcpy(reply_file_name_, "");
strcpy(wait_file_name_, "");
@@ -413,7 +375,6 @@ int ReplSemiSyncMaster::initObject()
/* References to the parameter works after set_options(). */
setWaitTimeout(rpl_semi_sync_master_timeout);
setTraceLevel(rpl_semi_sync_master_trace_level);
- max_transactions_ = (int)max_connections;
/* Mutex initialization can only be done after MY_INIT(). */
mysql_mutex_init(key_ss_mutex_LOCK_binlog_,
@@ -438,9 +399,7 @@ int ReplSemiSyncMaster::enableMaster()
if (!getMasterEnabled())
{
- active_tranxs_ = new ActiveTranx(max_connections,
- &LOCK_binlog_,
- trace_level_);
+ active_tranxs_ = new ActiveTranx(&LOCK_binlog_, trace_level_);
if (active_tranxs_ != NULL)
{
commit_file_name_inited_ = false;
diff --git a/plugin/semisync/semisync_master.h b/plugin/semisync/semisync_master.h
index dbe8bb9d5e2..1a951fa0ba2 100644
--- a/plugin/semisync/semisync_master.h
+++ b/plugin/semisync/semisync_master.h
@@ -29,31 +29,26 @@ extern PSI_cond_key key_ss_cond_COND_binlog_send_;
/**
This class manages memory for active transaction list.
- We record each active transaction with a TranxNode. Because each
- session can only have only one open transaction, the total active
- transaction nodes can not exceed the maximum sessions. Currently
- in MySQL, sessions are the same as connections.
+ We record each active transaction with a TranxNode, each session
+ can have only one open transaction. Because of EVENT, the total
+ active transaction nodes can exceed the maximum allowed
+ connections.
*/
class ActiveTranx
:public Trace {
private:
struct TranxNode {
- char *log_name_;
+ char log_name_[FN_REFLEN];
my_off_t log_pos_;
struct TranxNode *next_; /* the next node in the sorted list */
struct TranxNode *hash_next_; /* the next node during hash collision */
};
- /* The following data structure maintains an active transaction list. */
- TranxNode *node_array_;
- TranxNode *free_pool_;
-
/* These two record the active transaction list in sort order. */
TranxNode *trx_front_, *trx_rear_;
TranxNode **trx_htb_; /* A hash table on active transactions. */
- int num_transactions_; /* maximum transactions */
int num_entries_; /* maximum hash table entries */
mysql_mutex_t *lock_; /* mutex lock */
@@ -80,8 +75,7 @@ private:
}
public:
- ActiveTranx(int max_connections, mysql_mutex_t *lock,
- unsigned long trace_level);
+ ActiveTranx(mysql_mutex_t *lock, unsigned long trace_level);
~ActiveTranx();
/* Insert an active transaction node with the specified position.
@@ -183,11 +177,6 @@ class ReplSemiSyncMaster
bool state_; /* whether semi-sync is switched */
- /* The number of maximum active transactions. This should be the same as
- * maximum connections because MySQL does not do connection sharing now.
- */
- int max_transactions_;
-
void lock();
void unlock();
void cond_broadcast();