3437 Jonas Oreland 2011-08-17
ndb - The last crusade of the trailing share - remove dependency on LOCK_open in ndbcluster_create_binlog_setup, allow it to be used from anywhere. Use share->mutex to serialize the actual binlog setup. Patch for 5.5, plan to backport after test results
modified:
sql/ha_ndbcluster.cc
sql/ha_ndbcluster_binlog.cc
sql/ha_ndbcluster_binlog.h
3436 Jonas Oreland 2011-08-17 [merge]
ndb - merge 71 into 5.5-cluster
removed:
mysql-test/suite/ndb/r/ndb_statistics.result
mysql-test/suite/ndb/t/ndb_statistics.test
added:
mysql-test/suite/ndb/r/ndb_index_stat.result
mysql-test/suite/ndb/r/ndb_statistics0.result
mysql-test/suite/ndb/r/ndb_statistics1.result
mysql-test/suite/ndb/t/ndb_index_stat.test
mysql-test/suite/ndb/t/ndb_index_stat_enable.inc
mysql-test/suite/ndb/t/ndb_statistics.inc
mysql-test/suite/ndb/t/ndb_statistics0.test
mysql-test/suite/ndb/t/ndb_statistics1.test
modified:
mysql-test/r/group_by.result
mysql-test/suite/ndb/r/ndb_restore_misc.result
mysql-test/suite/ndb/t/ndb_restore_misc.test
mysql-test/t/group_by.test
sql/ha_ndb_index_stat.cc
sql/ha_ndb_index_stat.h
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.h
sql/sql_select.cc
storage/ndb/clusterj/clusterj-core/src/main/java/com/mysql/clusterj/core/SessionFactoryImpl.java
storage/ndb/clusterj/clusterj-jdbc/src/main/antlr3/com/mysql/clusterj/jdbc/antlr/MySQL51Lexer.g
storage/ndb/clusterj/clusterj-openjpa/src/main/java/com/mysql/clusterj/openjpa/NdbOpenJPABrokerFactory.java
storage/ndb/clusterj/clusterj-openjpa/src/main/java/com/mysql/clusterj/openjpa/NdbOpenJPAConfigurationImpl.java
storage/ndb/clusterj/clusterj-openjpa/src/main/java/com/mysql/clusterj/openjpa/NdbOpenJPADomainFieldHandlerImpl.java
storage/ndb/clusterj/clusterj-openjpa/src/main/java/com/mysql/clusterj/openjpa/NdbOpenJPADomainTypeHandlerImpl.java
storage/ndb/clusterj/clusterj-openjpa/src/main/java/com/mysql/clusterj/openjpa/NdbOpenJPAStoreManager.java
storage/ndb/include/ndb_constants.h
storage/ndb/include/ndbapi/NdbIndexStat.hpp
storage/ndb/include/util/NdbPack.hpp
storage/ndb/src/common/util/NdbPack.cpp
storage/ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp
storage/ndb/src/kernel/vm/ndbd_malloc_impl.cpp
storage/ndb/src/kernel/vm/ndbd_malloc_impl.hpp
storage/ndb/src/ndbapi/NdbIndexStat.cpp
storage/ndb/src/ndbapi/NdbIndexStatImpl.cpp
storage/ndb/src/ndbapi/NdbIndexStatImpl.hpp
storage/ndb/src/ndbapi/NdbQueryOperation.cpp
storage/ndb/src/ndbapi/NdbQueryOperationImpl.hpp
storage/ndb/test/ndbapi/testIndexStat.cpp
storage/ndb/tools/ndb_index_stat.cpp
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2011-08-17 10:36:01 +0000
+++ b/sql/ha_ndbcluster.cc 2011-08-17 12:22:49 +0000
@@ -9130,8 +9130,9 @@ int ha_ndbcluster::create(const char *na
*/
if ((my_errno= write_ndb_file(name)))
DBUG_RETURN(my_errno);
+
ndbcluster_create_binlog_setup(thd, ndb, name, strlen(name),
- m_dbname, m_tabname, FALSE);
+ m_dbname, m_tabname, form);
DBUG_RETURN(my_errno);
}
@@ -10686,7 +10687,7 @@ int ha_ndbcluster::open(const char *name
}
Ndb* ndb= check_ndb_in_thd(thd);
ndbcluster_create_binlog_setup(thd, ndb, name, strlen(name),
- m_dbname, m_tabname, FALSE);
+ m_dbname, m_tabname, table);
if ((m_share=get_share(name, table, FALSE)) == 0)
{
local_close(thd, FALSE);
@@ -11402,7 +11403,7 @@ int ndbcluster_find_all_files(THD *thd)
/* set up replication for this table */
ndbcluster_create_binlog_setup(thd, ndb, key, end-key,
elmt.database, elmt.name,
- TRUE);
+ 0);
}
}
}
@@ -11570,7 +11571,7 @@ ndbcluster_find_files(handlerton *hton,
end= end1 +
tablename_to_filename(file_name_str, end1, sizeof(name) - (end1 - name));
ndbcluster_create_binlog_setup(thd, ndb, name, end-name,
- db, file_name_str, TRUE);
+ db, file_name_str, 0);
}
}
@@ -13033,6 +13034,7 @@ NDB_SHARE *ndbcluster_get_share(const ch
MEM_ROOT *old_root= *root_ptr;
init_sql_alloc(&share->mem_root, 1024, 0);
*root_ptr= &share->mem_root; // remember to reset before return
+ share->flags= 0;
share->state= NSS_INITIAL;
/* enough space for key, db, and table_name */
share->key= (char*) alloc_root(*root_ptr, 2 * (length + 1));
=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc 2011-07-08 15:05:28 +0000
+++ b/sql/ha_ndbcluster_binlog.cc 2011-08-17 12:22:49 +0000
@@ -4683,66 +4683,33 @@ int ndbcluster_create_binlog_setup(THD *
uint key_len,
const char *db,
const char *table_name,
- my_bool share_may_exist)
+ TABLE * table)
{
int do_event_op= ndb_binlog_running;
DBUG_ENTER("ndbcluster_create_binlog_setup");
- DBUG_PRINT("enter",("key: %s key_len: %d %s.%s share_may_exist: %d",
- key, key_len, db, table_name, share_may_exist));
+ DBUG_PRINT("enter",("key: %s key_len: %d %s.%s",
+ key, key_len, db, table_name));
DBUG_ASSERT(! IS_NDB_BLOB_PREFIX(table_name));
DBUG_ASSERT(strlen(key) == key_len);
pthread_mutex_lock(&ndbcluster_mutex);
-
- /* Handle any trailing share */
- NDB_SHARE *share= (NDB_SHARE*) my_hash_search(&ndbcluster_open_tables,
- (const uchar*) key, key_len);
-
- if (share && share_may_exist)
- {
- if (get_binlog_nologging(share) ||
- share->op != 0 ||
- share->new_op != 0)
- {
- pthread_mutex_unlock(&ndbcluster_mutex);
- DBUG_RETURN(0); // replication already setup, or should not
- }
- }
-
- if (share)
+ NDB_SHARE * share = get_share(key, table, TRUE, TRUE);
+ if (share == 0)
{
- if (share->op || share->new_op)
- {
- my_errno= HA_ERR_TABLE_EXIST;
- pthread_mutex_unlock(&ndbcluster_mutex);
- DBUG_RETURN(1);
- }
- if (!share_may_exist || share->connect_count !=
- g_ndb_cluster_connection->get_connect_count())
- {
- handle_trailing_share(thd, share);
- share= NULL;
- }
+ /**
+ * Failed to create share
+ */
+ pthread_mutex_unlock(&ndbcluster_mutex);
+ DBUG_RETURN(-1);
}
+ pthread_mutex_unlock(&ndbcluster_mutex);
- /* Create share which is needed to hold replication information */
- if (share)
- {
- /* ndb_share reference create */
- ++share->use_count;
- DBUG_PRINT("NDB_SHARE", ("%s create use_count: %u",
- share->key, share->use_count));
- }
- /* ndb_share reference create */
- else if (!(share= get_share(key, 0, TRUE, TRUE)))
- {
- sql_print_error("NDB Binlog: "
- "allocating table share for %s failed", key);
- }
- else
+ pthread_mutex_lock(&share->mutex);
+ if (get_binlog_nologging(share) || share->op != 0 || share->new_op != 0)
{
- DBUG_PRINT("NDB_SHARE", ("%s create use_count: %u",
- share->key, share->use_count));
+ pthread_mutex_unlock(&share->mutex);
+ free_share(&share);
+ DBUG_RETURN(0); // replication already setup, or should not
}
if (!ndb_schema_share &&
@@ -4757,10 +4724,9 @@ int ndbcluster_create_binlog_setup(THD *
if (!do_event_op)
{
set_binlog_nologging(share);
- pthread_mutex_unlock(&ndbcluster_mutex);
+ pthread_mutex_unlock(&share->mutex);
DBUG_RETURN(0);
}
- pthread_mutex_unlock(&ndbcluster_mutex);
while (share && !IS_TMP_PREFIX(table_name))
{
@@ -4798,6 +4764,7 @@ int ndbcluster_create_binlog_setup(THD *
{
if (opt_ndb_extra_logging)
sql_print_information("NDB Binlog: NOT logging %s", share->key);
+ pthread_mutex_unlock(&share->mutex);
DBUG_RETURN(0);
}
@@ -4842,13 +4809,12 @@ int ndbcluster_create_binlog_setup(THD *
/* a warning has been issued to the client */
break;
}
+ pthread_mutex_unlock(&share->mutex);
DBUG_RETURN(0);
}
- if (share)
- {
- free_share(&share);
- }
+ pthread_mutex_unlock(&share->mutex);
+ free_share(&share);
DBUG_RETURN(-1);
}
=== modified file 'sql/ha_ndbcluster_binlog.h'
--- a/sql/ha_ndbcluster_binlog.h 2011-07-05 12:46:07 +0000
+++ b/sql/ha_ndbcluster_binlog.h 2011-08-17 12:22:49 +0000
@@ -138,7 +138,7 @@ int ndbcluster_create_binlog_setup(THD *
uint key_len,
const char *db,
const char *table_name,
- my_bool share_may_exist);
+ TABLE * table);
int ndbcluster_create_event(THD *thd, Ndb *ndb, const NDBTAB *table,
const char *event_name, NDB_SHARE *share,
int push_warning= 0);
No bundle (reason: useless for push emails).
| Thread |
|---|
| • bzr push into mysql-5.5-cluster branch (jonas.oreland:3436 to 3437) | Jonas Oreland | 22 Aug |