diff options
author | unknown <tomas@whalegate.ndb.mysql.com> | 2007-05-11 08:07:42 +0200 |
---|---|---|
committer | unknown <tomas@whalegate.ndb.mysql.com> | 2007-05-11 08:07:42 +0200 |
commit | 18e6090c376e4347a3b2041244e2b1a2fb269c2f (patch) | |
tree | bfa9322c102de846dd59e0f232480b77dad8c6e9 /sql | |
parent | 28d9a827b5091e0087c5236e0b79a7abc1e1cffc (diff) | |
download | mariadb-git-18e6090c376e4347a3b2041244e2b1a2fb269c2f.tar.gz |
Bug#25818 No return of NDB share object in failures in open method
- make sure resources are release properly on error
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_ndbcluster.cc | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 9b48e0d4f38..0e9dfcef5fb 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -5011,27 +5011,36 @@ int ha_ndbcluster::open(const char *name, int mode, uint test_if_locked) set_dbname(name); set_tabname(name); - if (check_ndb_connection()) { - free_share(m_share); m_share= 0; - DBUG_RETURN(HA_ERR_NO_CONNECTION); + if ((res= check_ndb_connection()) || + (res= get_metadata(name))) + { + free_share(m_share); + m_share= 0; + DBUG_RETURN(res); } - - res= get_metadata(name); - if (!res) + while (1) { Ndb *ndb= get_ndb(); if (ndb->setDatabaseName(m_dbname)) { - ERR_RETURN(ndb->getNdbError()); + res= ndb_to_mysql_error(&ndb->getNdbError()); + break; } struct Ndb_statistics stat; res= ndb_get_table_statistics(NULL, false, ndb, m_tabname, &stat); records= stat.row_count; if(!res) res= info(HA_STATUS_CONST); + break; } - - DBUG_RETURN(res); + if (res) + { + free_share(m_share); + m_share= 0; + release_metadata(); + DBUG_RETURN(res); + } + DBUG_RETURN(0); } |