summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/ha_ndbcluster.cc19
-rw-r--r--sql/ha_ndbcluster.h20
2 files changed, 30 insertions, 9 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index a7579c7b465..25c5fbf9b58 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -1041,7 +1041,8 @@ int ha_ndbcluster::get_metadata(const char *path)
DBUG_RETURN(1);
}
- if (m_share->state != NSS_ALTERED && cmp_frm(tab, pack_data, pack_length))
+ if (get_ndb_share_state(m_share) != NSS_ALTERED
+ && cmp_frm(tab, pack_data, pack_length))
{
if (!invalidating_ndb_table)
{
@@ -4434,7 +4435,7 @@ int ha_ndbcluster::create_handler_files(const char *file)
NDBDICT *dict= ndb->getDictionary();
if (!(tab= dict->getTable(m_tabname)))
DBUG_RETURN(0); // Must be a create, ignore since frm is saved in create
- DBUG_ASSERT(m_share->state == NSS_ALTERED);
+ DBUG_ASSERT(get_ndb_share_state(m_share) == NSS_ALTERED);
name= table->s->normalized_path.str;
DBUG_PRINT("enter", ("m_tabname: %s, path: %s", m_tabname, name));
if (readfrm(name, &data, &length) ||
@@ -4453,7 +4454,7 @@ int ha_ndbcluster::create_handler_files(const char *file)
my_free((char*)data, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*)pack_data, MYF(MY_ALLOW_ZERO_PTR));
}
- m_share->state= NSS_INITIAL;
+ set_ndb_share_state(m_share, NSS_INITIAL);
free_share(&m_share); // Decrease ref_count
DBUG_RETURN(error);
@@ -4590,7 +4591,7 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
if (!error)
{
ndbcluster_get_share(m_share); // Increase ref_count
- m_share->state= NSS_ALTERED;
+ set_ndb_share_state(m_share, NSS_ALTERED);
}
DBUG_RETURN(error);
}
@@ -4629,7 +4630,7 @@ int ha_ndbcluster::prepare_drop_index(TABLE *table_arg,
Ndb *ndb= thd_ndb->ndb;
renumber_indexes(ndb, table_arg);
ndbcluster_get_share(m_share); // Increase ref_count
- m_share->state= NSS_ALTERED;
+ set_ndb_share_state(m_share, NSS_ALTERED);
DBUG_RETURN(0);
}
@@ -5280,7 +5281,7 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
dict->invalidateTable(name);
strxnmov(key, FN_LEN-1, mysql_data_home, "/", db, "/", name, NullS);
NDB_SHARE *share= get_share(key, 0, false);
- if (share && share->state == NSS_ALTERED)
+ if (share && get_ndb_share_state(share) == NSS_ALTERED)
{
// Frm has been altered on disk, but not yet written to ndb
if (readfrm(key, &data, &len))
@@ -5532,7 +5533,7 @@ int ndbcluster_find_all_files(THD *thd)
else if (cmp_frm(ndbtab, pack_data, pack_length))
{
NDB_SHARE *share= get_share(key, 0, false);
- if (!share || share->state != NSS_ALTERED)
+ if (!share || get_ndb_share_state(share) != NSS_ALTERED)
{
discover= 1;
sql_print_information("NDB: mismatch in frm for %s.%s, discovering...",
@@ -9524,7 +9525,7 @@ int ndbcluster_alter_tablespace(THD* thd, st_alter_tablespace *info)
DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
}
}
-
+#ifdef HAVE_NDB_BINLOG
if (is_tablespace)
ndbcluster_log_schema_op(thd, 0,
thd->query, thd->query_length,
@@ -9537,7 +9538,7 @@ int ndbcluster_alter_tablespace(THD* thd, st_alter_tablespace *info)
"", info->logfile_group_name,
0, 0,
SOT_LOGFILE_GROUP);
-
+#endif
DBUG_RETURN(FALSE);
ndberror:
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 2a5e3eaee3a..5642a7e2d7b 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -118,6 +118,26 @@ typedef struct st_ndbcluster_share {
#endif
} NDB_SHARE;
+inline
+NDB_SHARE_STATE
+get_ndb_share_state(NDB_SHARE *share)
+{
+ NDB_SHARE_STATE state;
+ pthread_mutex_lock(&share->mutex);
+ state= share->state;
+ pthread_mutex_unlock(&share->mutex);
+ return state;
+}
+
+inline
+void
+set_ndb_share_state(NDB_SHARE *share, NDB_SHARE_STATE state)
+{
+ pthread_mutex_lock(&share->mutex);
+ share->state= state;
+ pthread_mutex_unlock(&share->mutex);
+}
+
#ifdef HAVE_NDB_BINLOG
/* NDB_SHARE.flags */
#define NSF_HIDDEN_PK 1 /* table has hidden primary key */