mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
ndb - bug#20053
make sure we can only drop files from correct file group
This commit is contained in:
parent
e9cbae32ea
commit
33339fdf40
7 changed files with 98 additions and 26 deletions
|
@ -188,6 +188,19 @@ ENGINE NDB;
|
|||
CREATE INDEX b_i on t1(b);
|
||||
CREATE INDEX bc_i on t1(b, c);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLESPACE ts2
|
||||
ADD DATAFILE 'datafile3.dat'
|
||||
USE LOGFILE GROUP lg1
|
||||
INITIAL_SIZE 1M
|
||||
ENGINE NDB;
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile3.dat'
|
||||
ENGINE NDB;
|
||||
ERROR HY000: Failed to alter: NO SUCH FILE
|
||||
ALTER TABLESPACE ts2
|
||||
DROP DATAFILE 'datafile2.dat'
|
||||
ENGINE NDB;
|
||||
ERROR HY000: Failed to alter: NO SUCH FILE
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile2.dat'
|
||||
ENGINE NDB;
|
||||
|
@ -196,6 +209,11 @@ DROP DATAFILE 'datafile.dat'
|
|||
ENGINE NDB;
|
||||
DROP TABLESPACE ts1
|
||||
ENGINE NDB;
|
||||
ALTER TABLESPACE ts2
|
||||
DROP DATAFILE 'datafile3.dat'
|
||||
ENGINE NDB;
|
||||
DROP TABLESPACE ts2
|
||||
ENGINE NDB;
|
||||
DROP LOGFILE GROUP lg1
|
||||
ENGINE NDB;
|
||||
**** End = And No = ****
|
||||
|
|
|
@ -280,6 +280,25 @@ CREATE INDEX bc_i on t1(b, c);
|
|||
|
||||
DROP TABLE t1;
|
||||
|
||||
# bug#20053
|
||||
|
||||
CREATE TABLESPACE ts2
|
||||
ADD DATAFILE 'datafile3.dat'
|
||||
USE LOGFILE GROUP lg1
|
||||
INITIAL_SIZE 1M
|
||||
ENGINE NDB;
|
||||
|
||||
--error ER_ALTER_FILEGROUP_FAILED
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile3.dat'
|
||||
ENGINE NDB;
|
||||
|
||||
--error ER_ALTER_FILEGROUP_FAILED
|
||||
ALTER TABLESPACE ts2
|
||||
DROP DATAFILE 'datafile2.dat'
|
||||
ENGINE NDB;
|
||||
# bug#20053
|
||||
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile2.dat'
|
||||
ENGINE NDB;
|
||||
|
@ -291,6 +310,13 @@ ENGINE NDB;
|
|||
DROP TABLESPACE ts1
|
||||
ENGINE NDB;
|
||||
|
||||
ALTER TABLESPACE ts2
|
||||
DROP DATAFILE 'datafile3.dat'
|
||||
ENGINE NDB;
|
||||
|
||||
DROP TABLESPACE ts2
|
||||
ENGINE NDB;
|
||||
|
||||
DROP LOGFILE GROUP lg1
|
||||
ENGINE NDB;
|
||||
|
||||
|
|
|
@ -9949,7 +9949,7 @@ int ndbcluster_alter_tablespace(THD* thd, st_alter_tablespace *info)
|
|||
}
|
||||
|
||||
NdbError err;
|
||||
NDBDICT *dict = ndb->getDictionary();
|
||||
NDBDICT *dict= ndb->getDictionary();
|
||||
int error;
|
||||
const char * errmsg;
|
||||
LINT_INIT(errmsg);
|
||||
|
@ -10013,9 +10013,12 @@ int ndbcluster_alter_tablespace(THD* thd, st_alter_tablespace *info)
|
|||
}
|
||||
else if(info->ts_alter_tablespace_type == ALTER_TABLESPACE_DROP_FILE)
|
||||
{
|
||||
NdbDictionary::Datafile df = dict->getDatafile(0,
|
||||
info->data_file_name);
|
||||
if (strcmp(df.getPath(), info->data_file_name) == 0)
|
||||
NdbDictionary::Tablespace ts= dict->getTablespace(info->tablespace_name);
|
||||
NdbDictionary::Datafile df= dict->getDatafile(0, info->data_file_name);
|
||||
NdbDictionary::ObjectId objid;
|
||||
df.getTablespaceId(&objid);
|
||||
if (ts.getObjectId() == objid.getObjectId() &&
|
||||
strcmp(df.getPath(), info->data_file_name) == 0)
|
||||
{
|
||||
errmsg= " DROP DATAFILE";
|
||||
if (dict->dropDatafile(df))
|
||||
|
@ -10344,10 +10347,12 @@ static int ndbcluster_fill_files_table(THD *thd, TABLE_LIST *tables,
|
|||
table->field[c++]->set_null(); // TABLE_NAME
|
||||
|
||||
// LOGFILE_GROUP_NAME
|
||||
NdbDictionary::ObjectId objid;
|
||||
uf.getLogfileGroupId(&objid);
|
||||
table->field[c++]->store(uf.getLogfileGroup(),
|
||||
strlen(uf.getLogfileGroup()),
|
||||
system_charset_info);
|
||||
table->field[c++]->store(uf.getLogfileGroupId()); // LOGFILE_GROUP_NUMBER
|
||||
table->field[c++]->store(objid.getObjectId()); // LOGFILE_GROUP_NUMBER
|
||||
table->field[c++]->store(ndbcluster_hton_name,
|
||||
ndbcluster_hton_name_length,
|
||||
system_charset_info); // ENGINE
|
||||
|
|
|
@ -184,7 +184,7 @@ public:
|
|||
virtual int getObjectId() const;
|
||||
|
||||
private:
|
||||
friend class Dictionary;
|
||||
friend class NdbDictObjectImpl;
|
||||
class NdbDictObjectImpl & m_impl;
|
||||
};
|
||||
|
||||
|
@ -1462,11 +1462,11 @@ public:
|
|||
void setSize(Uint64);
|
||||
Uint64 getSize() const;
|
||||
Uint64 getFree() const;
|
||||
|
||||
|
||||
void setTablespace(const char * name);
|
||||
void setTablespace(const class Tablespace &);
|
||||
const char * getTablespace() const;
|
||||
Uint32 getTablespaceId() const;
|
||||
void getTablespaceId(ObjectId * dst) const;
|
||||
|
||||
void setNode(Uint32 nodeId);
|
||||
Uint32 getNode() const;
|
||||
|
@ -1509,7 +1509,7 @@ public:
|
|||
void setLogfileGroup(const char * name);
|
||||
void setLogfileGroup(const class LogfileGroup &);
|
||||
const char * getLogfileGroup() const;
|
||||
Uint32 getLogfileGroupId() const;
|
||||
void getLogfileGroupId(ObjectId * dst) const;
|
||||
|
||||
void setNode(Uint32 nodeId);
|
||||
Uint32 getNode() const;
|
||||
|
|
|
@ -1224,9 +1224,14 @@ NdbDictionary::Datafile::getTablespace() const {
|
|||
return m_impl.m_filegroup_name.c_str();
|
||||
}
|
||||
|
||||
Uint32
|
||||
NdbDictionary::Datafile::getTablespaceId() const {
|
||||
return m_impl.m_filegroup_id;
|
||||
void
|
||||
NdbDictionary::Datafile::getTablespaceId(NdbDictionary::ObjectId* dst) const
|
||||
{
|
||||
if (dst)
|
||||
{
|
||||
NdbDictObjectImpl::getImpl(* dst).m_id = m_impl.m_filegroup_id;
|
||||
NdbDictObjectImpl::getImpl(* dst).m_version = m_impl.m_filegroup_version;
|
||||
}
|
||||
}
|
||||
|
||||
NdbDictionary::Object::Status
|
||||
|
@ -1310,9 +1315,14 @@ NdbDictionary::Undofile::getLogfileGroup() const {
|
|||
return m_impl.m_filegroup_name.c_str();
|
||||
}
|
||||
|
||||
Uint32
|
||||
NdbDictionary::Undofile::getLogfileGroupId() const {
|
||||
return m_impl.m_filegroup_id;
|
||||
void
|
||||
NdbDictionary::Undofile::getLogfileGroupId(NdbDictionary::ObjectId * dst)const
|
||||
{
|
||||
if (dst)
|
||||
{
|
||||
NdbDictObjectImpl::getImpl(* dst).m_id = m_impl.m_filegroup_id;
|
||||
NdbDictObjectImpl::getImpl(* dst).m_version = m_impl.m_filegroup_version;
|
||||
}
|
||||
}
|
||||
|
||||
NdbDictionary::Object::Status
|
||||
|
@ -1829,7 +1839,8 @@ NdbDictionary::Dictionary::createLogfileGroup(const LogfileGroup & lg,
|
|||
ObjectId * obj)
|
||||
{
|
||||
return m_impl.createLogfileGroup(NdbLogfileGroupImpl::getImpl(lg),
|
||||
obj ? &obj->m_impl : 0);
|
||||
obj ?
|
||||
& NdbDictObjectImpl::getImpl(* obj) : 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1852,7 +1863,8 @@ NdbDictionary::Dictionary::createTablespace(const Tablespace & lg,
|
|||
ObjectId * obj)
|
||||
{
|
||||
return m_impl.createTablespace(NdbTablespaceImpl::getImpl(lg),
|
||||
obj ? &obj->m_impl : 0);
|
||||
obj ?
|
||||
& NdbDictObjectImpl::getImpl(* obj) : 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1887,7 +1899,7 @@ NdbDictionary::Dictionary::createDatafile(const Datafile & df,
|
|||
{
|
||||
return m_impl.createDatafile(NdbDatafileImpl::getImpl(df),
|
||||
force,
|
||||
obj ? &obj->m_impl : 0);
|
||||
obj ? & NdbDictObjectImpl::getImpl(* obj) : 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1913,7 +1925,7 @@ NdbDictionary::Dictionary::createUndofile(const Undofile & df,
|
|||
{
|
||||
return m_impl.createUndofile(NdbUndofileImpl::getImpl(df),
|
||||
force,
|
||||
obj ? &obj->m_impl : 0);
|
||||
obj ? & NdbDictObjectImpl::getImpl(* obj) : 0);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -46,14 +46,22 @@ public:
|
|||
NdbDictionary::Object::Status m_status;
|
||||
|
||||
bool change();
|
||||
|
||||
static NdbDictObjectImpl & getImpl(NdbDictionary::ObjectId & t) {
|
||||
return t.m_impl;
|
||||
}
|
||||
static const NdbDictObjectImpl & getImpl(const NdbDictionary::ObjectId & t){
|
||||
return t.m_impl;
|
||||
}
|
||||
|
||||
protected:
|
||||
friend class NdbDictionary::ObjectId;
|
||||
|
||||
NdbDictObjectImpl(NdbDictionary::Object::Type type) :
|
||||
m_type(type),
|
||||
m_status(NdbDictionary::Object::New) {
|
||||
m_id = -1;
|
||||
}
|
||||
|
||||
friend class NdbDictionary::ObjectId;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -533,9 +533,11 @@ BackupRestore::object(Uint32 type, const void * ptr)
|
|||
if (!m_no_restore_disk)
|
||||
{
|
||||
NdbDictionary::Datafile old(*(NdbDictionary::Datafile*)ptr);
|
||||
NdbDictionary::Tablespace * ts = m_tablespaces[old.getTablespaceId()];
|
||||
NdbDictionary::ObjectId objid;
|
||||
old.getTablespaceId(&objid);
|
||||
NdbDictionary::Tablespace * ts = m_tablespaces[objid.getObjectId()];
|
||||
debug << "Connecting datafile " << old.getPath()
|
||||
<< " to tablespace: oldid: " << old.getTablespaceId()
|
||||
<< " to tablespace: oldid: " << objid.getObjectId()
|
||||
<< " newid: " << ts->getObjectId() << endl;
|
||||
old.setTablespace(* ts);
|
||||
info << "Creating datafile \"" << old.getPath() << "\"..." << flush;
|
||||
|
@ -554,10 +556,11 @@ BackupRestore::object(Uint32 type, const void * ptr)
|
|||
if (!m_no_restore_disk)
|
||||
{
|
||||
NdbDictionary::Undofile old(*(NdbDictionary::Undofile*)ptr);
|
||||
NdbDictionary::LogfileGroup * lg =
|
||||
m_logfilegroups[old.getLogfileGroupId()];
|
||||
NdbDictionary::ObjectId objid;
|
||||
old.getLogfileGroupId(&objid);
|
||||
NdbDictionary::LogfileGroup * lg = m_logfilegroups[objid.getObjectId()];
|
||||
debug << "Connecting undofile " << old.getPath()
|
||||
<< " to logfile group: oldid: " << old.getLogfileGroupId()
|
||||
<< " to logfile group: oldid: " << objid.getObjectId()
|
||||
<< " newid: " << lg->getObjectId()
|
||||
<< " " << (void*)lg << endl;
|
||||
old.setLogfileGroup(* lg);
|
||||
|
|
Loading…
Reference in a new issue