Commit b1e97c86 authored by tomas@poseidon.ndb.mysql.com's avatar tomas@poseidon.ndb.mysql.com
Browse files

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1-ndb

into  poseidon.ndb.mysql.com:/home/tomas/cge-5.1
parents 6a55195f 04c26018
Loading
Loading
Loading
Loading
+44 −39
Original line number Diff line number Diff line
@@ -313,6 +313,10 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans,
/*
  Place holder for ha_ndbcluster thread specific data
*/
typedef struct st_thd_ndb_share {
  const void *key;
  struct Ndb_local_table_statistics stat;
} THD_NDB_SHARE;
static
uchar *thd_ndb_share_get_key(THD_NDB_SHARE *thd_ndb_share, size_t *length,
                            my_bool not_used __attribute__((unused)))
@@ -369,41 +373,6 @@ Thd_ndb::init_open_tables()
  my_hash_reset(&open_tables);
}

THD_NDB_SHARE *
Thd_ndb::get_open_table(THD *thd, const void *key)
{
  DBUG_ENTER("Thd_ndb::get_open_table");
  HASH_SEARCH_STATE state;
  THD_NDB_SHARE *thd_ndb_share=
    (THD_NDB_SHARE*)hash_first(&open_tables, (uchar *)&key, sizeof(key), &state);
  while (thd_ndb_share && thd_ndb_share->key != key)
    thd_ndb_share= (THD_NDB_SHARE*)hash_next(&open_tables, (uchar *)&key, sizeof(key), &state);
  if (thd_ndb_share == 0)
  {
    thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
                                                sizeof(THD_NDB_SHARE));
    if (!thd_ndb_share)
    {
      mem_alloc_error(sizeof(THD_NDB_SHARE));
      DBUG_RETURN(NULL);
    }
    thd_ndb_share->key= key;
    thd_ndb_share->stat.last_count= count;
    thd_ndb_share->stat.no_uncommitted_rows_count= 0;
    thd_ndb_share->stat.records= ~(ha_rows)0;
    my_hash_insert(&open_tables, (uchar *)thd_ndb_share);
  }
  else if (thd_ndb_share->stat.last_count != count)
  {
    thd_ndb_share->stat.last_count= count;
    thd_ndb_share->stat.no_uncommitted_rows_count= 0;
    thd_ndb_share->stat.records= ~(ha_rows)0;
  }
  DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx  key: 0x%lx",
                      (long) thd_ndb_share, (long) key));
  DBUG_RETURN(thd_ndb_share);
}

inline
Ndb *ha_ndbcluster::get_ndb()
{
@@ -4554,12 +4523,48 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb)
        thd_ndb->trans_options|= TNTO_INJECTED_APPLY_STATUS;
  }
#endif
  // TODO remove double pointers...
  if (!(m_thd_ndb_share= thd_ndb->get_open_table(thd, m_table)))

  if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
  {
    const void *key= m_table;
    HASH_SEARCH_STATE state;
    THD_NDB_SHARE *thd_ndb_share=
      (THD_NDB_SHARE*)hash_first(&thd_ndb->open_tables, (uchar *)&key, sizeof(key), &state);
    while (thd_ndb_share && thd_ndb_share->key != key)
      thd_ndb_share= (THD_NDB_SHARE*)hash_next(&thd_ndb->open_tables, (uchar *)&key, sizeof(key), &state);
    if (thd_ndb_share == 0)
    {
      thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
                                                  sizeof(THD_NDB_SHARE));
      if (!thd_ndb_share)
      {
        mem_alloc_error(sizeof(THD_NDB_SHARE));
        DBUG_RETURN(1);
      }
  m_table_info= &m_thd_ndb_share->stat;
      thd_ndb_share->key= key;
      thd_ndb_share->stat.last_count= thd_ndb->count;
      thd_ndb_share->stat.no_uncommitted_rows_count= 0;
      thd_ndb_share->stat.records= ~(ha_rows)0;
      my_hash_insert(&thd_ndb->open_tables, (uchar *)thd_ndb_share);
    }
    else if (thd_ndb_share->stat.last_count != thd_ndb->count)
    {
      thd_ndb_share->stat.last_count= thd_ndb->count;
      thd_ndb_share->stat.no_uncommitted_rows_count= 0;
      thd_ndb_share->stat.records= ~(ha_rows)0;
    }
    DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx  key: 0x%lx",
                        (long) thd_ndb_share, (long) key));
    m_table_info= &thd_ndb_share->stat;
  }
  else
  {
    struct Ndb_local_table_statistics &stat= m_table_info_instance;
    stat.last_count= thd_ndb->count;
    stat.no_uncommitted_rows_count= 0;
    stat.records= ~(ha_rows)0;
    m_table_info= &stat;
  }
  DBUG_RETURN(0);
}

+1 −7
Original line number Diff line number Diff line
@@ -195,11 +195,6 @@ struct Ndb_local_table_statistics {
  ha_rows records;
};

typedef struct st_thd_ndb_share {
  const void *key;
  struct Ndb_local_table_statistics stat;
} THD_NDB_SHARE;

class Thd_ndb 
{
 public:
@@ -207,7 +202,6 @@ class Thd_ndb
  ~Thd_ndb();

  void init_open_tables();
  THD_NDB_SHARE *get_open_table(THD *thd, const void *key);

  Ndb *ndb;
  ulong count;
@@ -514,6 +508,7 @@ static void set_tabname(const char *pathname, char *tabname);
  NdbScanOperation *m_active_cursor;
  const NdbDictionary::Table *m_table;
  struct Ndb_local_table_statistics *m_table_info;
  struct Ndb_local_table_statistics m_table_info_instance;
  char m_dbname[FN_HEADLEN];
  //char m_schemaname[FN_HEADLEN];
  char m_tabname[FN_HEADLEN];
@@ -522,7 +517,6 @@ static void set_tabname(const char *pathname, char *tabname);
  bool m_lock_tuple;
  NDB_SHARE *m_share;
  NDB_INDEX_DATA  m_index[MAX_KEY];
  THD_NDB_SHARE *m_thd_ndb_share;
  // NdbRecAttr has no reference to blob
  NdbValue m_value[NDB_MAX_ATTRIBUTES_IN_TABLE];
  uchar m_ref[NDB_HIDDEN_PRIMARY_KEY_LENGTH];