List:Internals« Previous MessageNext Message »
From:jonas Date:October 10 2005 2:31pm
Subject:bk commit into 5.1 tree (jonas:1.2036)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2036 05/10/10 14:31:41 jonas@stripped +25 -0
  wl#2898 ndb online drop of disk objects

  storage/ndb/include/kernel/signaldata/DropFilegroupImpl.hpp
    1.1 05/10/10 14:31:35 jonas@stripped +171 -0
    New BitKeeper file ``storage/ndb/include/kernel/signaldata/DropFilegroupImpl.hpp''

  storage/ndb/src/ndbapi/ndberror.c
    1.52 05/10/10 14:31:35 jonas@stripped +5 -1
    impl. drop datafile,tablespace/undofile

  storage/ndb/src/ndbapi/Ndbif.cpp
    1.26 05/10/10 14:31:35 jonas@stripped +5 -0
    impl. drop datafile,tablespace/undofile

  storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
    1.110 05/10/10 14:31:35 jonas@stripped +3 -3
    impl. drop datafile,tablespace/undofile

  storage/ndb/src/kernel/vm/SLList.hpp
    1.7 05/10/10 14:31:35 jonas@stripped +13 -5
    add HeadPOD to us in unions

  storage/ndb/src/kernel/vm/DLList.hpp
    1.7 05/10/10 14:31:35 jonas@stripped +13 -5
    add HeadPOD to us in unions

  storage/ndb/src/kernel/blocks/tsman.hpp
    1.28 05/10/10 14:31:35 jonas@stripped +11 -0
    impl. drop datafile,tablespace/undofile

  storage/ndb/src/kernel/blocks/tsman.cpp
    1.53 05/10/10 14:31:35 jonas@stripped +151 -17
    impl. drop datafile,tablespace/undofile

  storage/ndb/src/kernel/blocks/pgman.hpp
    1.33 05/10/10 14:31:35 jonas@stripped +11 -5
    Fix unlocking of pages (in order to drop them)

  storage/ndb/src/kernel/blocks/pgman.cpp
    1.40 05/10/10 14:31:35 jonas@stripped +19 -7
    Fix unlocking of pages (in order to drop them)

  storage/ndb/src/kernel/blocks/lgman.hpp
    1.39 05/10/10 14:31:35 jonas@stripped +20 -7
    impl. drop datafile, tablespace, logfilegroup

  storage/ndb/src/kernel/blocks/lgman.cpp
    1.61 05/10/10 14:31:35 jonas@stripped +187 -33
    impl. drop datafile, tablespace, logfilegroup

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
    1.46 05/10/10 14:31:35 jonas@stripped +23 -8
    impl. drop datafile, tablespace, logfilegroup

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.109 05/10/10 14:31:35 jonas@stripped +443 -30
    impl. drop datafile, tablespace, logfilegroup

  storage/ndb/include/kernel/signaldata/TsmanContinueB.hpp
    1.5 05/10/10 14:31:35 jonas@stripped +2 -1
    impl. drop datafile

  storage/ndb/include/kernel/signaldata/LgmanContinueB.hpp
    1.9 05/10/10 14:31:35 jonas@stripped +1 -0
    Impl. drop filegroup

  storage/ndb/include/kernel/signaldata/DropFilegroupImpl.hpp
    1.0 05/10/10 14:31:35 jonas@stripped +0 -0
    BitKeeper file
/home/jonas/src/mysql-5.1-ndb-dd/storage/ndb/include/kernel/signaldata/DropFilegroupImpl.hpp

  storage/ndb/include/kernel/signaldata/DropFilegroup.hpp
    1.4 05/10/10 14:31:35 jonas@stripped +7 -4
    new error codes

  storage/ndb/include/kernel/signaldata/CreateFilegroupImpl.hpp
    1.9 05/10/10 14:31:34 jonas@stripped +2 -1
    new error codes

  storage/ndb/include/kernel/signaldata/CreateFilegroup.hpp
    1.19 05/10/10 14:31:34 jonas@stripped +3 -1
    new error codes

  sql/sql_yacc.yy
    1.377 05/10/10 14:31:34 jonas@stripped +21 -7
    Add support for alter table drop datafile

  sql/share/errmsg.txt
    1.39 05/10/10 14:31:34 jonas@stripped +2 -0
    Error msg for fail to alter 

  sql/handler.h
    1.146 05/10/10 14:31:34 jonas@stripped +8 -0
    Add support for alter table drop datafile

  sql/ha_ndbcluster.cc
    1.152 05/10/10 14:31:34 jonas@stripped +130 -103
    Fix drop datafile
        drop tablespace/logfile group

  mysql-test/t/ndb_basic_disk.test
    1.8 05/10/10 14:31:34 jonas@stripped +6 -0
    Add rop of dd-object in end of test

  mysql-test/r/ndb_basic_disk.result
    1.5 05/10/10 14:31:34 jonas@stripped +4 -0
    Add rop of dd-object in end of test

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	jonas
# Host:	perch.ndb.mysql.com
# Root:	/home/jonas/src/mysql-5.1-ndb-dd

--- 1.145/sql/handler.h	2005-09-16 17:44:30 +02:00
+++ 1.146/sql/handler.h	2005-10-10 14:31:34 +02:00
@@ -723,6 +723,13 @@
   ALTER_ACCESS_MODE_TABLESPACE = 7
 };
 
+enum ts_alter_tablespace_type
+{
+  TS_ALTER_TABLESPACE_TYPE_NOT_DEFINED = -1,
+  ALTER_TABLESPACE_ADD_FILE = 1,
+  ALTER_TABLESPACE_DROP_FILE = 2
+};
+
 enum tablespace_access_mode
 {
   TS_NOT_DEFINED= -1,
@@ -737,6 +744,7 @@
   char *tablespace_name;
   char *logfile_group_name;
   enum ts_command_type ts_cmd_type;
+  enum ts_alter_tablespace_type ts_alter_tablespace_type;
   char *data_file_name;
   char *undo_file_name;
   char *redo_file_name;

--- 1.376/sql/sql_yacc.yy	2005-09-16 17:44:30 +02:00
+++ 1.377/sql/sql_yacc.yy	2005-10-10 14:31:34 +02:00
@@ -2615,8 +2615,17 @@
 alter_tablespace_info:
           tablespace_name
           ADD ts_datafile
-          alter_tablespace_option_list
-          ;
+          alter_tablespace_option_list 
+	  { 
+	    Lex->alter_tablespace_info->ts_alter_tablespace_type=
ALTER_TABLESPACE_ADD_FILE; 
+          }
+          |
+          tablespace_name
+          DROP ts_datafile
+          alter_tablespace_option_list 
+	  { 
+	    Lex->alter_tablespace_info->ts_alter_tablespace_type=
ALTER_TABLESPACE_DROP_FILE; 
+          };
 
 logfile_group_info:
           logfile_group_name
@@ -2670,7 +2679,7 @@
           | opt_ts_extent_size
           | opt_ts_nodegroup
           | opt_ts_engine
-          | opt_ts_wait
+          | ts_wait
           | opt_ts_comment
           ;
 
@@ -2690,7 +2699,7 @@
           | opt_ts_autoextend_size
           | opt_ts_max_size
           | opt_ts_engine
-          | opt_ts_wait
+          | ts_wait
           ;
 
 logfile_group_option_list:
@@ -2710,7 +2719,7 @@
           | opt_ts_redo_buffer_size
           | opt_ts_nodegroup
           | opt_ts_engine
-          | opt_ts_wait
+          | ts_wait
           | opt_ts_comment
           ;
 
@@ -2728,7 +2737,7 @@
 alter_logfile_group_option:
           opt_ts_initial_size
           | opt_ts_engine
-          | opt_ts_wait
+          | ts_wait
           ;
 
 
@@ -2868,6 +2877,11 @@
           };
 
 opt_ts_wait:
+          /* empty */ 
+          | ts_wait
+          ;
+
+ts_wait:
           WAIT_SYM
           {
             LEX *lex= Lex;
@@ -7044,7 +7058,7 @@
             LEX *lex= Lex;
             lex->alter_tablespace_info->ts_cmd_type= DROP_TABLESPACE;
           }
-        | DROP LOGFILE_SYM GROUP tablespace_name opt_ts_engine opt_ts_wait
+        | DROP LOGFILE_SYM GROUP logfile_group_name opt_ts_engine opt_ts_wait
           {
             LEX *lex= Lex;
             lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP;

--- 1.38/sql/share/errmsg.txt	2005-09-16 17:06:44 +02:00
+++ 1.39/sql/share/errmsg.txt	2005-10-10 14:31:34 +02:00
@@ -5544,3 +5544,5 @@
         eng "A size parameter was incorrectly specified, either number or on the form
10M"
 ER_SIZE_OVERFLOW_ERROR
         eng "The size number was correct but we don't allow the digit part to be more
than 2 billion"
+ER_ALTER_TABLESPACE_FAILED
+        eng "Failed to alter: %s"
--- New file ---
+++ storage/ndb/include/kernel/signaldata/DropFilegroupImpl.hpp	05/10/10 14:31:35
/* Copyright (C) 2003 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#ifndef DROP_FILEGROUP_IMPL_HPP
#define DROP_FILEGROUP_IMPL_HPP

#include "SignalData.hpp"

struct DropFilegroupImplReq {
  /**
   * Sender(s) / Reciver(s)
   */
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;

  /**
   * For printing
   */
  friend bool printDROP_FILEGROUP_IMPL_REQ(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 5 );
  
  enum RequestInfo {
    Prepare = 0x1,
    Commit = 0x2,
    Abort = 0x4
  };
  
  Uint32 senderData;
  Uint32 senderRef;
  
  Uint32 requestInfo;
  Uint32 filegroup_id;
  Uint32 filegroup_version;
};

struct DropFilegroupImplRef {
  /**
   * Sender(s)
   */
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;
  
  /**
   * For printing
   */
  friend bool printDROP_FILEGROUP_IMPL_REF(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 3 );

  enum ErrorCode {
    NoError = 0,
    NoSuchFilegroup = 767,
    InvalidFilegroupVersion = 767,
    FilegroupInUse = 768
  };
  
  Uint32 senderData;
  Uint32 senderRef;
  Uint32 errorCode;
};

struct DropFilegroupImplConf {
  /**
   * Sender(s)
   */
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;
  
  /**
   * For printing
   */
  friend bool printDROP_FILEGROUP_IMPL_CONF(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 2 );

  Uint32 senderData;
  Uint32 senderRef;
};

struct DropFileImplReq {
  /**
   * Sender(s) / Reciver(s)
   */
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;

  /**
   * For printing
   */
  friend bool printDROP_FILE_IMPL_REQ(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 6 );
  
  enum RequestInfo {
    Prepare = 0x1,
    Commit = 0x2,
    Abort = 0x4
  };
  
  Uint32 senderData;
  Uint32 senderRef;
  
  Uint32 requestInfo;
  Uint32 file_id;
  Uint32 filegroup_id;
  Uint32 filegroup_version;
};

struct DropFileImplRef {
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;
  
  /**
   * For printing
   */
  friend bool printDROP_FILE_IMPL_REF(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 5 );

  enum ErrorCode {
    NoError = 0,
    InvalidFilegroup = 767,
    InvalidFilegroupVersion = 767,
    NoSuchFile = 766,
    FileInUse = 770
  };
  
  Uint32 senderData;
  Uint32 senderRef;
  Uint32 errorCode;
  Uint32 fsErrCode;
  Uint32 osErrCode;
};

struct DropFileImplConf {
  friend class Dbdict;
  friend class Tsman;
  friend class Lgman;
  
  
  /**
   * For printing
   */
  friend bool printDROP_FILE_IMPL_CONF(FILE*, const Uint32*, Uint32, Uint16);
  
  STATIC_CONST( SignalLength = 2 );

  Uint32 senderData;
  Uint32 senderRef;
};

#endif


--- 1.4/mysql-test/r/ndb_basic_disk.result	2005-10-04 20:54:09 +02:00
+++ 1.5/mysql-test/r/ndb_basic_disk.result	2005-10-10 14:31:34 +02:00
@@ -345,3 +345,7 @@
 2	2	2
 3	3	3
 drop table t1;
+alter tablespace ts1 drop datafile 'datafile.dat' engine = ndb;
+alter tablespace ts1 drop datafile 'datafile02.dat' engine = ndb;
+drop tablespace ts1 engine = ndb;
+drop logfile group lg1 engine = ndb;

--- 1.18/storage/ndb/include/kernel/signaldata/CreateFilegroup.hpp	2005-09-28 15:01:37
+02:00
+++ 1.19/storage/ndb/include/kernel/signaldata/CreateFilegroup.hpp	2005-10-10 14:31:34
+02:00
@@ -65,7 +65,9 @@
     InvalidFormat = 740,
     OutOfFilegroupRecords = 765,
     InvalidExtentSize = 764,
-    InvalidUndoBufferSize = 763
+    InvalidUndoBufferSize = 763,
+    NoSuchLogfileGroup = 767,
+    InvalidFilegroupVersion = 768
   };
   
   Uint32 senderData;

--- 1.8/storage/ndb/include/kernel/signaldata/CreateFilegroupImpl.hpp	2005-08-26 13:26:48
+02:00
+++ 1.9/storage/ndb/include/kernel/signaldata/CreateFilegroupImpl.hpp	2005-10-10 14:31:34
+02:00
@@ -162,7 +162,8 @@
     FileError = 5,
     InvalidFileMetadata = 6,
     OutOfMemory = 7,
-    FileReadError = 8
+    FileReadError = 8,
+    FilegroupNotOnline = 9
   };
   
   Uint32 senderData;

--- 1.3/storage/ndb/include/kernel/signaldata/DropFilegroup.hpp	2005-10-06 17:30:22 +02:00
+++ 1.4/storage/ndb/include/kernel/signaldata/DropFilegroup.hpp	2005-10-10 14:31:35 +02:00
@@ -37,8 +37,8 @@
   
   Uint32 senderData;
   Uint32 senderRef;
-  Uint32 file_group_id;
-  Uint32 file_group_version;
+  Uint32 filegroup_id;
+  Uint32 filegroup_version;
 };
 
 struct DropFilegroupRef {
@@ -64,7 +64,9 @@
   enum ErrorCode {
     NoError = 0,
     Busy = 701,
-    NotMaster = 702
+    NotMaster = 702,
+    NoSuchFilegroup = 767,
+    FilegroupInUse = 768
   };
 
   Uint32 senderData;
@@ -147,7 +149,8 @@
   enum ErrorCode {
     NoError = 0,
     Busy = 701,
-    NoSuchFile = 763
+    NoSuchFile = 766,
+    DropUndoFileNotSupported = 769
   };
 
   Uint32 senderData;

--- 1.8/storage/ndb/include/kernel/signaldata/LgmanContinueB.hpp	2005-05-02 14:51:46
+02:00
+++ 1.9/storage/ndb/include/kernel/signaldata/LgmanContinueB.hpp	2005-10-10 14:31:35
+02:00
@@ -32,6 +32,7 @@
     ,STOP_UNDO_LOG = 7
     ,PROCESS_LOG_SYNC_WAITERS = 8
     ,FORCE_LOG_SYNC = 9
+    ,DROP_FILEGROUP = 10
   };
 };
 

--- 1.4/storage/ndb/include/kernel/signaldata/TsmanContinueB.hpp	2005-08-01 12:22:44
+02:00
+++ 1.5/storage/ndb/include/kernel/signaldata/TsmanContinueB.hpp	2005-10-10 14:31:35
+02:00
@@ -29,7 +29,8 @@
     LOAD_EXTENT_PAGES = 0,
     SCAN_TABLESPACE_EXTENT_HEADERS = 1,
     SCAN_DATAFILE_EXTENT_HEADERS = 2,
-    END_LCP = 3
+    END_LCP = 3,
+    RELEASE_EXTENT_PAGES = 4
   };
 };
 

--- 1.60/storage/ndb/src/kernel/blocks/lgman.cpp	2005-10-07 08:58:58 +02:00
+++ 1.61/storage/ndb/src/kernel/blocks/lgman.cpp	2005-10-10 14:31:35 +02:00
@@ -21,6 +21,7 @@
 #include <signaldata/FsOpenReq.hpp>
 #include <signaldata/FsCloseReq.hpp>
 #include <signaldata/CreateFilegroupImpl.hpp>
+#include <signaldata/DropFilegroupImpl.hpp>
 #include <signaldata/FsReadWriteReq.hpp>
 #include <signaldata/LCP.hpp>
 #include <signaldata/SumaImpl.hpp>
@@ -205,6 +206,23 @@
     force_log_sync(signal, ptr, signal->theData[2], signal->theData[3]);
     return;
   }
+  case LgmanContinueB::DROP_FILEGROUP:
+  {
+    jam();
+    Ptr<Logfile_group> ptr;
+    m_logfile_group_pool.getPtr(ptr, ptrI);
+    if (ptr.p->m_state & Logfile_group::LG_THREAD_MASK)
+    {
+      jam();
+      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 
+			  signal->length());
+      return;
+    }
+    Uint32 ref = signal->theData[2];
+    Uint32 data = signal->theData[3];
+    drop_filegroup_drop_files(signal, ptr, ref, data);
+    return;
+  }
   }
 }
 
@@ -289,7 +307,96 @@
 Lgman::execDROP_FILEGROUP_REQ(Signal* signal)
 {
   jamEntry();
-  ndbrequire(false);
+
+  jamEntry();
+
+  Uint32 errorCode = 0;
+  DropFilegroupImplReq req = *(DropFilegroupImplReq*)signal->getDataPtr();  
+  do 
+  {
+    Ptr<Logfile_group> ptr;
+    if (!m_logfile_group_hash.find(ptr, req.filegroup_id))
+    {
+      errorCode = DropFilegroupImplRef::NoSuchFilegroup;
+      break;
+    }
+    
+    if (ptr.p->m_version != req.filegroup_version)
+    {
+      errorCode = DropFilegroupImplRef::InvalidFilegroupVersion;
+      break;
+    }
+    
+    switch(req.requestInfo){
+    case DropFilegroupImplReq::Prepare:
+      break;
+    case DropFilegroupImplReq::Commit:
+      m_logfile_group_list.remove(ptr);
+      ptr.p->m_state |= Logfile_group::LG_DROPPING;
+      signal->theData[0] = LgmanContinueB::DROP_FILEGROUP;
+      signal->theData[1] = ptr.i;
+      signal->theData[2] = req.senderRef;
+      signal->theData[3] = req.senderData;
+      sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
+      return;
+    case DropFilegroupImplReq::Abort:
+      break;
+    default:
+      ndbrequire(false);
+    }
+  } while(0);
+  
+  if (errorCode)
+  {
+    DropFilegroupImplRef* ref = 
+      (DropFilegroupImplRef*)signal->getDataPtrSend();
+    ref->senderRef = reference();
+    ref->senderData = req.senderData;
+    ref->errorCode = errorCode;
+    sendSignal(req.senderRef, GSN_DROP_FILEGROUP_REF, signal,
+	       DropFilegroupImplRef::SignalLength, JBB);
+  }
+  else
+  {
+    DropFilegroupImplConf* conf = 
+      (DropFilegroupImplConf*)signal->getDataPtrSend();
+    conf->senderRef = reference();
+    conf->senderData = req.senderData;
+    sendSignal(req.senderRef, GSN_DROP_FILEGROUP_CONF, signal,
+	       DropFilegroupImplConf::SignalLength, JBB);
+  }
+}
+
+void
+Lgman::drop_filegroup_drop_files(Signal* signal,
+				 Ptr<Logfile_group> ptr,
+				 Uint32 ref, Uint32 data)
+{
+  jam();
+  ndbassert(! (ptr.p->m_state & Logfile_group::LG_THREAD_MASK));
+  ndbrequire(ptr.p->m_meta_files.isEmpty());
+  ndbrequire(ptr.p->m_outstanding_fs == 0);
+
+  LocalDLFifoList<Undofile> list(m_file_pool, ptr.p->m_files);
+  Ptr<Undofile> file_ptr;
+
+  if (list.first(file_ptr))
+  {
+    jam();
+    ndbrequire(! (file_ptr.p->m_state & Undofile::FS_OUTSTANDING));
+    file_ptr.p->m_create.m_senderRef = ref;
+    file_ptr.p->m_create.m_senderData = data;
+    create_file_abort(signal, ptr, file_ptr);
+    return;
+  }
+
+  free_logbuffer_memory(ptr);
+  m_logfile_group_hash.release(ptr);
+  DropFilegroupImplConf *conf = (DropFilegroupImplConf*)signal->getDataPtr();  
+  conf->senderData = data;
+  conf->senderRef = reference();
+  sendSignal(ref, GSN_DROP_FILEGROUP_CONF, signal, 
+	     DropFilegroupImplConf::SignalLength, JBB);
 }
 
 void
@@ -561,8 +668,9 @@
        */
       free.add(ptr);
       ptr.p->m_state = Undofile::FS_ONLINE;
+      lg_ptr.p->m_state |= Logfile_group::LG_FLUSH_THREAD;
       signal->theData[0] = LgmanContinueB::FLUSH_LOG;
-      signal->theData[1] = ptr.i;
+      signal->theData[1] = lg_ptr.i;
       sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
     }
   }
@@ -636,15 +744,28 @@
   Uint32 senderData = ptr.p->m_create.m_senderData;
   
   m_logfile_group_pool.getPtr(lg_ptr, ptr.p->m_logfile_group_ptr_i);
- 
-  LocalDLFifoList<Undofile> list(m_file_pool, lg_ptr.p->m_meta_files);
-  list.remove(ptr);
-  
-  CreateFileImplConf* conf= (CreateFileImplConf*)signal->getDataPtr();
-  conf->senderData = senderData;
-  conf->senderRef = reference();
-  sendSignal(senderRef, GSN_CREATE_FILE_CONF, signal, 
-	     CreateFileImplConf::SignalLength, JBB);
+
+  if (lg_ptr.p->m_state & Logfile_group::LG_DROPPING)
+  {
+    jam();
+    {
+      LocalDLFifoList<Undofile> list(m_file_pool, lg_ptr.p->m_files);
+      list.release(ptr);
+    }
+    drop_filegroup_drop_files(signal, lg_ptr, senderRef, senderData);
+  }
+  else
+  {
+    jam();
+    LocalDLFifoList<Undofile> list(m_file_pool, lg_ptr.p->m_meta_files);
+    list.release(ptr);
+
+    CreateFileImplConf* conf= (CreateFileImplConf*)signal->getDataPtr();
+    conf->senderData = senderData;
+    conf->senderRef = reference();
+    sendSignal(senderRef, GSN_CREATE_FILE_CONF, signal, 
+	       CreateFileImplConf::SignalLength, JBB);
+  }
 }
 
 void
@@ -821,6 +942,7 @@
       range.m_ptr_i++;
       range.m_idx--;
     }
+    map.next(it);
   }
   map.release();
 }
@@ -878,9 +1000,9 @@
     }
 
     if(ptr.p->m_last_sync_req_lsn < lsn && 
-       ! (ptr.p->m_state & Lgman::Logfile_group::LG_FORCE_SYNC))
+       ! (ptr.p->m_state & Lgman::Logfile_group::LG_FORCE_SYNC_THREAD))
     { 
-      ptr.p->m_state |= Lgman::Logfile_group::LG_FORCE_SYNC;
+      ptr.p->m_state |= Lgman::Logfile_group::LG_FORCE_SYNC_THREAD;
       signal->theData[0] = LgmanContinueB::FORCE_LOG_SYNC;
       signal->theData[1] = ptr.i;
       signal->theData[2] = lsn >> 32;
@@ -942,7 +1064,7 @@
      last.p->m_sync_lsn > force_lsn && 
      ptr.p->m_last_sync_req_lsn < last.p->m_sync_lsn)
   {
-    ndbassert(ptr.p->m_state & Lgman::Logfile_group::LG_FORCE_SYNC);
+    ndbassert(ptr.p->m_state & Lgman::Logfile_group::LG_FORCE_SYNC_THREAD);
     signal->theData[0] = LgmanContinueB::FORCE_LOG_SYNC;
     signal->theData[1] = ptr.i;
     signal->theData[2] = last.p->m_sync_lsn >> 32;
@@ -951,7 +1073,7 @@
   }
   else
   {
-    ptr.p->m_state &= ~(Uint32)Lgman::Logfile_group::LG_FORCE_SYNC;
+    ptr.p->m_state &= ~(Uint32)Lgman::Logfile_group::LG_FORCE_SYNC_THREAD;
   }
 }
 
@@ -982,14 +1104,14 @@
   
   if(removed && !list.isEmpty())
   {
-    ptr.p->m_state |= Logfile_group::LG_SYNC_WAITERS;
+    ptr.p->m_state |= Logfile_group::LG_SYNC_WAITERS_THREAD;
     signal->theData[0] = LgmanContinueB::PROCESS_LOG_SYNC_WAITERS;
     signal->theData[1] = ptr.i;
     sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
   }
   else
   {
-    ptr.p->m_state &= ~(Uint32)Logfile_group::LG_SYNC_WAITERS;
+    ptr.p->m_state &= ~(Uint32)Logfile_group::LG_SYNC_WAITERS_THREAD;
   }
 }
 
@@ -1151,10 +1273,18 @@
 	     consumer.m_current_page.m_ptr_i, consumer.m_current_page.m_idx,
 	     producer.m_current_page.m_ptr_i, producer.m_current_page.m_idx);
 #endif
-
-    signal->theData[0] = LgmanContinueB::FLUSH_LOG;
-    signal->theData[1] = ptr.i;
-    sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 2);
+    if (! (ptr.p->m_state & Logfile_group::LG_DROPPING))
+    {
+      jam();
+      signal->theData[0] = LgmanContinueB::FLUSH_LOG;
+      signal->theData[1] = ptr.i;
+      sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 2);
+    }
+    else
+    {
+      jam();
+      ptr.p->m_state &= ~(Uint32)Logfile_group::LG_FLUSH_THREAD;
+    }
     return;
   }
   
@@ -1247,11 +1377,19 @@
 
   ptr.p->m_pos[CONSUMER]= consumer;
   
-  signal->theData[0] = LgmanContinueB::FLUSH_LOG;
-  signal->theData[1] = ptr.i;
-  sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
-
-  if(tot > 0 && !ptr.p->m_log_buffer_waiters.isEmpty())
+  if (! (ptr.p->m_state & Logfile_group::LG_DROPPING))
+  {
+    signal->theData[0] = LgmanContinueB::FLUSH_LOG;
+    signal->theData[1] = ptr.i;
+    sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
+  }
+  else
+  {
+    ptr.p->m_state &= ~(Uint32)Logfile_group::LG_FLUSH_THREAD;
+  }
+  
+  if(tot > 0 && !ptr.p->m_log_buffer_waiters.isEmpty() &&
+     !(ptr.p->m_state & Logfile_group::LG_WAITERS_THREAD))
   {
     jam();
     process_log_buffer_waiters(signal, ptr);
@@ -1267,6 +1405,7 @@
 
   if(list.isEmpty())
   {
+    ptr.p->m_state &= (Uint32)Logfile_group::LG_WAITERS_THREAD;
     return;
   }
   
@@ -1285,10 +1424,15 @@
   
   if(removed && !list.isEmpty())
   {
+    ptr.p->m_state |= Logfile_group::LG_WAITERS_THREAD;
     signal->theData[0] = LgmanContinueB::PROCESS_LOG_BUFFER_WAITERS;
     signal->theData[1] = ptr.i;
     sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
   }
+  else
+  {
+    ptr.p->m_state &= (Uint32)Logfile_group::LG_WAITERS_THREAD;
+  }
 }
 
 Uint32
@@ -1449,7 +1593,7 @@
     lg_ptr.p->m_next_reply_ptr_i = ptr.i;
     lg_ptr.p->m_last_synced_lsn = lsn;
 
-    if(! (lg_ptr.p->m_state & Logfile_group::LG_SYNC_WAITERS))
+    if(! (lg_ptr.p->m_state & Logfile_group::LG_SYNC_WAITERS_THREAD))
     {
       process_log_sync_waiters(signal, lg_ptr);
     }
@@ -1470,17 +1614,18 @@
 
   Ptr<Logfile_group> ptr;
   m_logfile_group_list.first(ptr);
-
-  Uint32 entry= File_formats::Undofile::UNDO_LCP;
-  if(!ptr.isNull() && lcp_id != m_latest_lcp)
+  
+  Uint32 entry= lcp_id == m_latest_lcp ? 
+    File_formats::Undofile::UNDO_LCP : File_formats::Undofile::UNDO_LCP_FIRST;
+  if(!ptr.isNull() && ! (ptr.p->m_state &
Logfile_group::LG_CUT_LOG_THREAD))
   {
     jam();
-    entry= File_formats::Undofile::UNDO_LCP_FIRST;
+    ptr.p->m_state |= Logfile_group::LG_CUT_LOG_THREAD;
     signal->theData[0] = LgmanContinueB::CUT_LOG_TAIL;
     signal->theData[1] = ptr.i;
     sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
   }
-
+  
   if(!ptr.isNull())
   {
     Uint32 undo[3];
@@ -1636,8 +1781,15 @@
 
   validate_logfile_group(ptr, "cut log");
   
-  if(!done || m_logfile_group_list.next(ptr))
+  if (done)
+  {
+    ptr.p->m_state &= ~(Uint32)Logfile_group::LG_CUT_LOG_THREAD;
+    m_logfile_group_list.next(ptr); 
+  }
+  
+  if(!done || !ptr.isNull())
   {
+    ptr.p->m_state |= Logfile_group::LG_CUT_LOG_THREAD;
     signal->theData[0] = LgmanContinueB::CUT_LOG_TAIL;
     signal->theData[1] = ptr.i;
     sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
@@ -1656,6 +1808,8 @@
   /**
    * Filter all logfile groups in parallell
    */
+  return; // NOT IMPLETMENT YET
+  
   signal->theData[0] = LgmanContinueB::FILTER_LOG;
   while(!ptr.isNull())
   {

--- 1.38/storage/ndb/src/kernel/blocks/lgman.hpp	2005-08-31 08:41:50 +02:00
+++ 1.39/storage/ndb/src/kernel/blocks/lgman.hpp	2005-10-10 14:31:35 +02:00
@@ -154,14 +154,24 @@
     
     enum Logfile_group_state
     {
-      LG_ONLINE        = 0x1
-      ,LG_SORTING      = 0x2  // Sorting files
-      ,LG_SEARCHING    = 0x4  // Searching in last file
-      ,LG_EXEC_THREAD  = 0x8  // Execute thread is running
-      ,LG_READ_THREAD  = 0x10 // Read thread is running
-      ,LG_FORCE_SYNC   = 0x20
-      ,LG_SYNC_WAITERS = 0x40
+      LG_ONLINE               = 0x001
+      ,LG_SORTING             = 0x002  // Sorting files
+      ,LG_SEARCHING           = 0x004  // Searching in last file
+      ,LG_EXEC_THREAD         = 0x008  // Execute thread is running
+      ,LG_READ_THREAD         = 0x010 // Read thread is running
+      ,LG_FORCE_SYNC_THREAD   = 0x020
+      ,LG_SYNC_WAITERS_THREAD = 0x040
+      ,LG_CUT_LOG_THREAD      = 0x080
+      ,LG_WAITERS_THREAD      = 0x100
+      ,LG_FLUSH_THREAD        = 0x200
+      ,LG_DROPPING            = 0x400
     };
+
+    static const Uint32 LG_THREAD_MASK = Logfile_group::LG_FORCE_SYNC_THREAD |
+                                  Logfile_group::LG_SYNC_WAITERS_THREAD |
+                                  Logfile_group::LG_CUT_LOG_THREAD |
+                                  Logfile_group::LG_WAITERS_THREAD |
+                                  Logfile_group::LG_FLUSH_THREAD;
     
     Uint64 m_last_lsn;
     Uint64 m_last_sync_req_lsn;
@@ -265,6 +275,9 @@
 #else
   void validate_logfile_group(Ptr<Logfile_group> ptr, const char * = 0) {}
 #endif
+
+  void drop_filegroup_drop_files(Signal*, Ptr<Logfile_group>, 
+				 Uint32 ref, Uint32 data);
 };
 
 class Logfile_client {

--- 1.39/storage/ndb/src/kernel/blocks/pgman.cpp	2005-10-07 08:58:58 +02:00
+++ 1.40/storage/ndb/src/kernel/blocks/pgman.cpp	2005-10-10 14:31:35 +02:00
@@ -1071,14 +1071,15 @@
       return ptr.p->m_real_page_i;
     }
 
-    if (old_state & Page_entry::LOCKED)
+    if (old_state & Page_entry::LOCKED && 
+	! (page_req.m_flags & Page_request::UNLOCK_PAGE))
     {
       ndbassert(ptr.p->m_copy_real_page_i != m_lcp_copy_page);
       ndbrequire(ptr.p->m_copy_real_page_i != RNIL);
       return ptr.p->m_copy_real_page_i;
     }
   }
-
+  
   if (! (page_req.m_flags & Page_request::LOCK_PAGE))
   {
     ndbassert(! (new_state & Page_entry::LOCKED));
@@ -1112,6 +1113,11 @@
     new_state |= Page_entry::NO_HOOK;    
   }
 
+  if (page_req.m_flags & Page_request::UNLOCK_PAGE)
+  {
+    new_state &= ~(Uint32)Page_entry::LOCKED;
+  }
+  
   ptr.p->m_busy_count += busy_count;
   set_page_state(ptr, new_state);
 
@@ -1308,15 +1314,21 @@
   return out;
 }
 
-void
+int
 Pgman::drop_page(Ptr<Page_entry> ptr)
 {
   Uint16 state = ptr.p->m_state;
-  ndbrequire(! (state & (Page_entry::PAGEIN | Page_entry::PAGEOUT)));
-  ndbrequire(state & Page_entry::BOUND);
-  ndbrequire(state & Page_entry::MAPPED);
+  if (! (state & (Page_entry::PAGEIN | Page_entry::PAGEOUT)))
+  {
+    ndbrequire(state & Page_entry::BOUND);
+    ndbrequire(state & Page_entry::MAPPED);
+    
+    release_page_entry(ptr);
+    return 1;
+  }
   
-  release_page_entry(ptr);
+  ndbrequire(false);
+  return -1;
 }
 
 // page cache client

--- 1.32/storage/ndb/src/kernel/blocks/pgman.hpp	2005-10-07 08:58:58 +02:00
+++ 1.33/storage/ndb/src/kernel/blocks/pgman.hpp	2005-10-10 14:31:35 +02:00
@@ -113,6 +113,7 @@
       ,COMMIT_REQ   = 0x0100 // part of commit
       ,DIRTY_REQ    = 0x0200 // make page dirty wo/ update_lsn
       ,NO_HOOK      = 0x0400 // dont run load hook
+      ,UNLOCK_PAGE  = 0x0800
     };
 
     Uint32 m_block;
@@ -297,7 +298,7 @@
   void map_file_no(Uint32 file_no, Uint32 fd);
   void free_data_file(Uint32 file_no, Uint32 fd = RNIL);
 
-  void drop_page(Ptr<Page_entry>);
+  int drop_page(Ptr<Page_entry>);
   
 #ifdef VM_TRACE
   NdbOut debugOut;
@@ -329,6 +330,7 @@
     ,COMMIT_REQ = Pgman::Page_request::COMMIT_REQ
     ,DIRTY_REQ = Pgman::Page_request::DIRTY_REQ
     ,NO_HOOK = Pgman::Page_request::NO_HOOK
+    ,UNLOCK_PAGE = Pgman::Page_request::UNLOCK_PAGE
   };
   
   /**
@@ -345,9 +347,13 @@
 
   /**
    * Drop page
+   *
+   * @return -1 on error
+   *          0 is request is queued
+   *         >0 is ok
    */
-  void drop_page(Local_key, Uint32 page_id);
-
+  int drop_page(Local_key, Uint32 page_id);
+  
   /**
    * Create file record
    */
@@ -411,7 +417,7 @@
 }
 
 inline 
-void
+int
 Page_cache_client::drop_page(Local_key key, Uint32 page_id)
 {
   Ptr<Pgman::Page_entry> entry_ptr;
@@ -422,7 +428,7 @@
   assert(found);
   assert(entry_ptr.p->m_real_page_i == page_id);
 
-  m_pgman->drop_page(entry_ptr);
+  return m_pgman->drop_page(entry_ptr);
 }
 
 inline Uint32

--- 1.52/storage/ndb/src/kernel/blocks/tsman.cpp	2005-10-07 08:58:58 +02:00
+++ 1.53/storage/ndb/src/kernel/blocks/tsman.cpp	2005-10-10 14:31:35 +02:00
@@ -119,6 +119,13 @@
   case TsmanContinueB::END_LCP:
     end_lcp(signal, ptrI, signal->theData[2], signal->theData[3]);
     return;
+  case TsmanContinueB::RELEASE_EXTENT_PAGES:
+  {
+    Ptr<Datafile> ptr;
+    m_file_pool.getPtr(ptr, ptrI);
+    release_extent_pages(signal, ptr);
+    return;
+  }
   }
 }
 
@@ -296,6 +303,8 @@
     m_tablespace_hash.add(ptr);
     m_tablespace_list.add(ptr);
 
+    ptr.p->m_state = Tablespace::TS_ONLINE;
+
     CreateFilegroupImplConf* conf= 
       (CreateFilegroupImplConf*)signal->getDataPtr();
     conf->senderData = senderData;
@@ -316,6 +325,67 @@
 void
 Tsman::execDROP_FILEGROUP_REQ(Signal* signal){
   jamEntry();
+
+  Uint32 errorCode = 0;
+  DropFilegroupImplReq req = *(DropFilegroupImplReq*)signal->getDataPtr();  
+  Ptr<Tablespace> ptr;
+  do 
+  {
+    if (!m_tablespace_hash.find(ptr, req.filegroup_id))
+    {
+      errorCode = DropFilegroupImplRef::NoSuchFilegroup;
+      break;
+    }
+
+    if (ptr.p->m_version != req.filegroup_version)
+    {
+      errorCode = DropFilegroupImplRef::InvalidFilegroupVersion;
+      break;
+    }
+    
+    if (! (ptr.p->m_meta_files.isEmpty() && ptr.p->m_free_files.isEmpty()
&&
+	   ptr.p->m_full_files.isEmpty()))
+    {
+      errorCode = DropFilegroupImplRef::FilegroupInUse;
+      break;
+    }
+    
+    switch(req.requestInfo){
+    case DropFilegroupImplReq::Prepare:
+      ptr.p->m_state = Tablespace::TS_DROPPING;
+      break;
+    case DropFilegroupImplReq::Commit:
+      m_tablespace_list.remove(ptr);
+      m_tablespace_hash.release(ptr);
+      break;
+    case DropFilegroupImplReq::Abort:
+      ptr.p->m_state = Tablespace::TS_ONLINE;
+      break;
+    default:
+      ndbrequire(false);
+    }
+  } while(0);
+
+  if (errorCode)
+  {
+    ndbassert(false);
+    DropFilegroupImplRef* ref = 
+      (DropFilegroupImplRef*)signal->getDataPtrSend();
+    ref->senderRef = reference();
+    ref->senderData = req.senderData;
+    ref->errorCode = errorCode;
+    sendSignal(req.senderRef, GSN_DROP_FILEGROUP_REF, signal,
+	       DropFilegroupImplRef::SignalLength, JBB);
+  }
+  else
+  {
+    DropFilegroupImplConf* conf = 
+      (DropFilegroupImplConf*)signal->getDataPtrSend();
+    conf->senderRef = reference();
+    conf->senderData = req.senderData;
+    sendSignal(req.senderRef, GSN_DROP_FILEGROUP_CONF, signal,
+	       DropFilegroupImplConf::SignalLength, JBB);
+  }
 }
 
 bool 
@@ -354,6 +424,13 @@
       break;
     }
 
+    if (ptr.p->m_state != Tablespace::TS_ONLINE)
+    {
+      jam();
+      err = CreateFileImplRef::FilegroupNotOnline;
+      break;
+    }
+    
     Ptr<Datafile> file_ptr;
     switch(req->requestInfo){
     case CreateFileImplReq::Commit:
@@ -427,6 +504,51 @@
 static inline Uint64 DIV(Uint64 a, Uint64 b){ return (a + b - 1) / b;}
 
 void
+Tsman::release_extent_pages(Signal* signal, Ptr<Datafile> ptr)
+{
+  Uint32 page = ptr.p->m_create.m_extent_pages;
+  if (page > 0)
+  {
+    Page_cache_client::Request preq;
+    preq.m_page.m_file_no = ptr.p->m_file_no;
+    preq.m_page.m_page_no = page;
+    
+    preq.m_callback.m_callbackData = ptr.i;
+    preq.m_callback.m_callbackFunction = 
+      safe_cast(&Tsman::release_extent_pages_callback);
+    
+    int page_id;
+    int flags = Page_cache_client::UNLOCK_PAGE | Page_cache_client::NO_HOOK;
+    if((page_id = m_page_cache_client.get_page(signal, preq, flags)) > 0)
+    {
+      execute(signal, preq.m_callback, page_id);
+    } 
+    return;
+  }
+  
+  create_file_abort(signal, ptr);
+}
+
+void
+Tsman::release_extent_pages_callback(Signal* signal, 
+				     Uint32 ptrI,
+				     Uint32 page_id)
+{
+  Ptr<Datafile> ptr;
+  m_file_pool.getPtr(ptr, ptrI);
+  Local_key key;
+  key.m_file_no = ptr.p->m_file_no;
+  key.m_page_no = ptr.p->m_create.m_extent_pages;
+  ndbrequire(m_page_cache_client.drop_page(key, page_id));
+  ptr.p->m_create.m_extent_pages--;
+  
+  signal->theData[0] = TsmanContinueB::RELEASE_EXTENT_PAGES;
+  signal->theData[1] = ptr.i;
+  
+  sendSignal(reference(), GSN_CONTINUEB, signal, 2, JBB);
+}
+
+void
 Tsman::create_file_abort(Signal* signal, Ptr<Datafile> ptr)
 {
   if (ptr.p->m_fd == RNIL)
@@ -469,6 +591,7 @@
   }
   else if(ptr.p->m_state == Datafile::FS_DROPPING)
   {
+    m_file_hash.remove(ptr);
     m_page_cache_client.free_data_file(ptr.p->m_file_no, ptr.p->m_fd);
     DropFileImplConf* conf= (DropFileImplConf*)signal->getDataPtr();
     conf->senderData = senderData;
@@ -1135,45 +1258,58 @@
     case DropFileImplReq::Prepare:{
       if (find_file_by_id(file_ptr, fg_ptr.p->m_full_files, req.file_id))
       {
-	errorCode = DropFileImplRef::FileInUse;
-	break;
+	jam();
+	LocalDLList<Datafile> full(m_file_pool, fg_ptr.p->m_full_files);
+	full.remove(file_ptr);
       }
-      
-      if (!find_file_by_id(file_ptr, fg_ptr.p->m_free_files, req.file_id))
+      else if(find_file_by_id(file_ptr, fg_ptr.p->m_free_files, req.file_id))
+      {
+	jam();
+	LocalDLList<Datafile> free(m_file_pool, fg_ptr.p->m_free_files);
+	free.remove(file_ptr);
+      }
+      else
       {
 	errorCode = DropFileImplRef::NoSuchFile;
 	break;
       }
-
+      
+      LocalDLList<Datafile> meta(m_file_pool, fg_ptr.p->m_meta_files);
+      meta.add(file_ptr);
+      
       if (file_ptr.p->m_online.m_used_extent_cnt || 
 	  file_ptr.p->m_state != Datafile::FS_ONLINE)
       {
 	errorCode = DropFileImplRef::FileInUse;
 	break;
       }
-
-      file_ptr.p->m_state = Datafile::FS_DROPPING;
-      LocalDLList<Datafile> free(m_file_pool, fg_ptr.p->m_free_files);
-      LocalDLList<Datafile> meta(m_file_pool, fg_ptr.p->m_meta_files);
       
-      free.remove(file_ptr);
-      meta.add(file_ptr);
+      file_ptr.p->m_state = Datafile::FS_DROPPING;
       break;
     }
     case DropFileImplReq::Commit:
       ndbrequire(find_file_by_id(file_ptr, fg_ptr.p->m_meta_files, req.file_id));
+      file_ptr.p->m_create.m_extent_pages = 
+	file_ptr.p->m_online.m_offset_data_pages - 1;
       file_ptr.p->m_create.m_senderRef = req.senderRef;
       file_ptr.p->m_create.m_senderData = req.senderData;
-      create_file_abort(signal, file_ptr);
+      release_extent_pages(signal, file_ptr);
       return;
     case DropFileImplReq::Abort:{
       ndbrequire(find_file_by_id(file_ptr, fg_ptr.p->m_meta_files, req.file_id));
       file_ptr.p->m_state = Datafile::FS_ONLINE;
-      LocalDLList<Datafile> free(m_file_pool, fg_ptr.p->m_free_files);
       LocalDLList<Datafile> meta(m_file_pool, fg_ptr.p->m_meta_files);
-      
       meta.remove(file_ptr);
-      free.add(file_ptr);
+      if (file_ptr.p->m_online.m_first_free_extent != RNIL)
+      {
+	LocalDLList<Datafile> free(m_file_pool, fg_ptr.p->m_free_files);
+	free.add(file_ptr);
+      }
+      else
+      {
+	LocalDLList<Datafile> full(m_file_pool, fg_ptr.p->m_full_files);
+	full.add(file_ptr);
+      }
       break;
     }
     }
@@ -1181,8 +1317,6 @@
   
   if (errorCode)
   {
-    ndbout_c("drop_file_ref: %d", errorCode);
-
     DropFileImplRef* ref = (DropFileImplRef*)signal->getDataPtrSend();
     ref->senderRef = reference();
     ref->senderData = req.senderData;

--- 1.27/storage/ndb/src/kernel/blocks/tsman.hpp	2005-10-07 08:58:58 +02:00
+++ 1.28/storage/ndb/src/kernel/blocks/tsman.hpp	2005-10-10 14:31:35 +02:00
@@ -146,6 +146,14 @@
       Uint32 m_tablespace_id;
     };
     Uint32 m_version;
+    Uint32 m_state;
+
+    enum TablespaceState 
+    {
+      TS_CREATING = 0x1,
+      TS_ONLINE = 0x2,
+      TS_DROPPING = 0x4
+    };
 
     Uint32 m_extent_size;       // In pages
     DLList<Datafile>::Head m_free_files; // Files w/ free space
@@ -199,6 +207,9 @@
 
   bool find_file_by_id(Ptr<Datafile>&, DLList<Datafile>::Head&,
Uint32 id);
   void create_file_abort(Signal* signal, Ptr<Datafile>);
+
+  void release_extent_pages(Signal* signal, Ptr<Datafile> ptr);
+  void release_extent_pages_callback(Signal*, Uint32, Uint32);
 };
 
 class Tablespace_client

--- 1.108/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-10-07 08:58:58 +02:00
+++ 1.109/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-10-10 14:31:35 +02:00
@@ -164,6 +164,33 @@
     &Dbdict::dropObj_abort,
     &Dbdict::drop_file_abort_start, 0
   }
+
+  /**
+   * Drop filegroup
+   */
+  ,{ 
+    GSN_DROP_FILEGROUP_REQ,
+    GSN_DROP_OBJ_REQ, GSN_DROP_OBJ_REF, GSN_DROP_OBJ_CONF,
+    0, 0, 0, 0,
+    &Dbdict::drop_fg_prepare_start, 0,
+    &Dbdict::dropObj_commit,
+    &Dbdict::drop_fg_commit_start, &Dbdict::drop_fg_commit_complete,
+    &Dbdict::dropObj_abort,
+    &Dbdict::drop_fg_abort_start, 0
+  }
+
+  /**
+   * Drop undofile
+   */
+  ,{ 
+    GSN_DROP_FILE_REQ,
+    GSN_DROP_OBJ_REQ, GSN_DROP_OBJ_REF, GSN_DROP_OBJ_CONF,
+    0, 0, 0, 0,
+    &Dbdict::drop_undofile_prepare_start, 0,
+    0,
+    0, 0,
+    0, 0
+  }
 };
 
 Uint32
@@ -1027,7 +1054,8 @@
     jam();
     ok = true;
     ndbrequire(newVersion == oldVersion);
-    ndbrequire(oldState == SchemaFile::ADD_STARTED);
+    ndbrequire(oldState == SchemaFile::ADD_STARTED ||
+	       oldState == SchemaFile::DROP_TABLE_STARTED);
     break;
   case SchemaFile::ALTER_TABLE_COMMITTED:
     jam();
@@ -4966,6 +4994,13 @@
     safe_cast(&Dbdict::createTab_writeSchemaConf1);
   
   updateSchemaState(signal, tableId, &tabEntry, &callback);
+
+  if (tabPtr.p->m_tablespace_id != RNIL)
+  {
+    FilegroupPtr ptr;
+    ndbrequire(c_filegroup_hash.find(ptr, tabPtr.p->m_tablespace_id));
+    increase_ref_count(ptr.p->m_obj_ptr_i);
+  }
 }
 
 void getSection(SegmentedSectionPtr & ptr, Uint32 i);
@@ -5538,6 +5573,13 @@
   dropTabPtr.p->m_participantData.m_callback.m_callbackFunction = 
     safe_cast(&Dbdict::createTab_dropComplete);
   dropTab_nextStep(signal, dropTabPtr);  
+
+  if (tabPtr.p->m_tablespace_id != RNIL)
+  {
+    FilegroupPtr ptr;
+    ndbrequire(c_filegroup_hash.find(ptr, tabPtr.p->m_tablespace_id));
+    decrease_ref_count(ptr.p->m_obj_ptr_i);
+  }
 }
 
 void
@@ -5631,6 +5673,21 @@
   c_obj_hash.release(ptr);
 }
 
+void
+Dbdict::increase_ref_count(Uint32 obj_ptr_i)
+{
+  DictObject* ptr = c_obj_pool.getPtr(obj_ptr_i);
+  ptr->m_ref_count++;  
+}
+
+void
+Dbdict::decrease_ref_count(Uint32 obj_ptr_i)
+{
+  DictObject* ptr = c_obj_pool.getPtr(obj_ptr_i);
+  ndbrequire(ptr->m_ref_count);
+  ptr->m_ref_count--;  
+}
+
 void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
 			       ParseDictTabInfoRecord * parseP,
 			       bool checkExist) 
@@ -5748,6 +5805,7 @@
     obj_ptr.p->m_id = tablePtr.i;
     obj_ptr.p->m_type = tableDesc.TableType;
     obj_ptr.p->m_name = tablePtr.p->tableName;
+    obj_ptr.p->m_ref_count = 0;
     c_obj_hash.add(obj_ptr);
     tablePtr.p->m_obj_ptr_i = obj_ptr.i;
 
@@ -6576,6 +6634,13 @@
   dropTabPtr.p->m_participantData.m_callback.m_callbackFunction = 
     safe_cast(&Dbdict::dropTab_complete);
   dropTab_nextStep(signal, dropTabPtr);  
+
+  if (tablePtr.p->m_tablespace_id != RNIL)
+  {
+    FilegroupPtr ptr;
+    ndbrequire(c_filegroup_hash.find(ptr, tablePtr.p->m_tablespace_id));
+    decrease_ref_count(ptr.p->m_obj_ptr_i);
+  }
 }
 
 #include <DebuggerNames.hpp>
@@ -11831,6 +11896,7 @@
     obj_ptr.p->m_name = triggerPtr.p->triggerName;
     obj_ptr.p->m_id = triggerId;
     obj_ptr.p->m_type = triggerPtr.p->triggerType;
+    obj_ptr.p->m_ref_count = 0;
     c_obj_hash.add(obj_ptr);
     triggerPtr.p->m_obj_ptr_i = obj_ptr.i;
   }
@@ -13314,7 +13380,76 @@
 void
 Dbdict::execDROP_FILEGROUP_REQ(Signal* signal)
 {
-  ndbrequire(false);
+  jamEntry();
+  
+  if(!assembleFragments(signal)){
+    jam();
+    return;
+  }
+  
+  DropFilegroupReq * req = (DropFilegroupReq*)signal->getDataPtr();
+  DropFilegroupRef * ref = (DropFilegroupRef*)signal->getDataPtrSend();
+  Uint32 senderRef = req->senderRef;
+  Uint32 senderData = req->senderData;
+  Uint32 objId = req->filegroup_id;
+  Uint32 version = req->filegroup_version;
+  
+  do {
+    Ptr<Filegroup> filegroup_ptr;
+    if (!c_filegroup_hash.find(filegroup_ptr, objId))
+    {
+      ref->errorCode = DropFilegroupRef::NoSuchFilegroup;
+      ref->errorLine = __LINE__;
+      break;
+    }
+    
+    Ptr<SchemaTransaction> trans_ptr;
+    if (! c_Trans.seize(trans_ptr))
+    {
+      ref->errorCode = CreateFilegroupRef::Busy;
+      ref->errorLine = __LINE__;
+      break;
+    }
+    
+    const Uint32 trans_key = ++c_opRecordSequence;
+    trans_ptr.p->key = trans_key;
+    trans_ptr.p->m_senderRef = senderRef;
+    trans_ptr.p->m_senderData = senderData;
+    trans_ptr.p->m_nodes = c_aliveNodes;
+    trans_ptr.p->m_errorCode = 0;
+    c_Trans.add(trans_ptr);
+    
+    const Uint32 op_key = ++c_opRecordSequence;
+    trans_ptr.p->m_op.m_key = op_key;
+    trans_ptr.p->m_op.m_vt_index = 3;
+    trans_ptr.p->m_op.m_state = DictObjOp::Preparing;
+    
+    DropObjReq* drop_obj = (DropObjReq*)signal->getDataPtrSend();
+    drop_obj->op_key = op_key;
+    drop_obj->objVersion = version;
+    drop_obj->objId = objId;
+    drop_obj->objType = filegroup_ptr.p->m_type;
+    trans_ptr.p->m_op.m_obj_id = objId;
+    
+    drop_obj->senderRef = reference();
+    drop_obj->senderData = trans_key;
+    drop_obj->clientRef = senderRef;
+    drop_obj->clientData = senderData;
+    
+    drop_obj->requestInfo = 0;
+    
+    NodeReceiverGroup rg(DBDICT, trans_ptr.p->m_nodes);
+    SafeCounter tmp(c_counterMgr, trans_ptr.p->m_counter);
+    tmp.init<CreateObjRef>(rg, GSN_DROP_OBJ_REF, trans_key);
+    sendSignal(rg, GSN_DROP_OBJ_REQ, signal, 
+	       DropObjReq::SignalLength, JBB);
+    return;
+  } while(0);
+  
+  ref->senderData = senderData;
+  ref->masterNodeId = c_masterNodeId;
+  sendSignal(senderRef, GSN_DROP_FILEGROUP_REF,signal,
+	     DropFilegroupRef::SignalLength, JBB);
 }
 
 void
@@ -13494,7 +13629,7 @@
     
     //@todo check api failed
     sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILE_CONF, signal, 
-	       CreateFilegroupConf::SignalLength, JBB);
+	       CreateFileConf::SignalLength, JBB);
     
     break;
   }
@@ -13505,8 +13640,19 @@
     conf->fileId = trans_ptr.p->m_op.m_obj_id;
     
     //@todo check api failed
-    sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILE_CONF, signal, 
-	       CreateFilegroupConf::SignalLength, JBB);
+    sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILE_CONF, signal, 
+	       DropFileConf::SignalLength, JBB);
+    break;
+  }
+  case GSN_DROP_FILEGROUP_REQ:{
+    DropFilegroupConf * conf = (DropFilegroupConf*)signal->getDataPtr();
+    conf->senderRef = reference();
+    conf->senderData = trans_ptr.p->m_senderData;
+    conf->filegroupId = trans_ptr.p->m_op.m_obj_id;
+    
+    //@todo check api failed
+    sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILEGROUP_CONF, signal, 
+	       DropFilegroupConf::SignalLength, JBB);
     break;
   }
   default:
@@ -13588,6 +13734,39 @@
     
     break;
   }
+  case GSN_DROP_FILE_REQ:
+  {
+    DropFileRef * ref = (DropFileRef*)signal->getDataPtr();
+    ref->senderRef = reference();
+    ref->senderData = trans_ptr.p->m_senderData;
+    ref->masterNodeId = c_masterNodeId;
+    ref->errorCode = trans_ptr.p->m_errorCode;
+    ref->errorLine = 0;
+    ref->errorKey = 0;
+    
+    //@todo check api failed
+    sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILE_REF, signal, 
+	       DropFileRef::SignalLength, JBB);
+    
+    break;
+  }
+  case GSN_DROP_FILEGROUP_REQ:
+  {
+    //
+    DropFilegroupRef * ref = (DropFilegroupRef*)signal->getDataPtr();
+    ref->senderRef = reference();
+    ref->senderData = trans_ptr.p->m_senderData;
+    ref->masterNodeId = c_masterNodeId;
+    ref->errorCode = trans_ptr.p->m_errorCode;
+    ref->errorLine = 0;
+    ref->errorKey = 0;
+    
+    //@todo check api failed
+    sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILEGROUP_REF, signal, 
+	       DropFilegroupRef::SignalLength, JBB);
+
+    break;
+  }
   default:
     ndbrequire(false);
   }
@@ -13762,6 +13941,7 @@
   }
   
   SchemaFile::TableEntry tabEntry;
+  bzero(&tabEntry, sizeof(tabEntry));
   tabEntry.m_tableVersion = createObjPtr.p->m_obj_version;
   tabEntry.m_tableType    = createObjPtr.p->m_obj_type;
   tabEntry.m_tableState   = SchemaFile::ADD_STARTED;
@@ -14048,7 +14228,6 @@
   case DictTabInfo::LogfileGroup:
   {
     dropObjPtr.p->m_vt_index = 3;
-    ndbrequire(false); // not implemented
     Ptr<Filegroup> fg_ptr;
     ndbrequire(c_filegroup_hash.find(fg_ptr, objId));
     dropObjPtr.p->m_obj_ptr_i = fg_ptr.i;
@@ -14056,7 +14235,6 @@
   
   }
   case DictTabInfo::Datafile:
-  case DictTabInfo::Undofile:
   {
     dropObjPtr.p->m_vt_index = 2;
     Ptr<File> file_ptr;
@@ -14064,6 +14242,9 @@
     dropObjPtr.p->m_obj_ptr_i = file_ptr.i;
     break;
   }
+  case DictTabInfo::Undofile:
+    dropObjPtr.p->m_vt_index = 4;
+    return;
   default:
     ndbrequire(false);
   }
@@ -14076,25 +14257,50 @@
 void
 Dbdict::dropObj_prepare_start_done(Signal* signal, 
 				   Uint32 callbackData,
-				   Uint32 returnCode){
-
+				   Uint32 returnCode)
+{
   ndbrequire(returnCode == 0);
 
   DropObjRecordPtr dropObjPtr;  
   ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
 
-  dropObjPtr.p->m_callback.m_callbackFunction = 
-    safe_cast(&Dbdict::dropObj_prepare_complete_done);
+  Callback cb;
+  cb.m_callbackData = callbackData;
+  cb.m_callbackFunction = 
+    safe_cast(&Dbdict::dropObj_prepare_writeSchemaConf);
 
-  if(dropObjPtr.p->m_errorCode != 0 ||
-     f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete == 0)
+  if(dropObjPtr.p->m_errorCode != 0)
   {
     jam();
     dropObj_prepare_complete_done(signal, callbackData, 0);
     return;
   }
-  (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete)
-    (signal, dropObjPtr.p);
+  
+  Uint32 objId = dropObjPtr.p->m_obj_id;
+  XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0];
+  SchemaFile::TableEntry objEntry = *getTableEntry(xsf, objId);
+  objEntry.m_tableState = SchemaFile::DROP_TABLE_STARTED;
+  updateSchemaState(signal, objId, &objEntry, &cb);
+}
+
+void
+Dbdict::dropObj_prepare_writeSchemaConf(Signal* signal, 
+					Uint32 callbackData,
+					Uint32 returnCode)
+{
+  ndbrequire(returnCode == 0);
+
+  DropObjRecordPtr dropObjPtr;  
+  ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
+  
+  dropObjPtr.p->m_callback.m_callbackFunction = 
+    safe_cast(&Dbdict::dropObj_prepare_complete_done);
+  
+  if(f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete)
+    (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete)
+      (signal, dropObjPtr.p);
+  else
+    execute(signal, dropObjPtr.p->m_callback, 0);
 }
 
 void
@@ -14154,11 +14360,35 @@
   DropObjRecordPtr dropObjPtr;  
   ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
   
+  Uint32 objId = dropObjPtr.p->m_obj_id;
+  XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0];
+  SchemaFile::TableEntry objEntry = * getTableEntry(xsf, objId);
+  objEntry.m_tableState = SchemaFile::DROP_TABLE_COMMITTED;
+  
+  Callback callback;
+  callback.m_callbackData = dropObjPtr.p->key;
+  callback.m_callbackFunction = 
+    safe_cast(&Dbdict::dropObj_commit_writeSchemaConf);
+  
+  updateSchemaState(signal, objId, &objEntry, &callback);
+}
+
+void
+Dbdict::dropObj_commit_writeSchemaConf(Signal* signal, 
+				       Uint32 callbackData,
+				       Uint32 returnCode)
+{
+  jam();
+  ndbrequire(returnCode == 0);
+  
+  DropObjRecordPtr dropObjPtr;  
+  ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
+  
   dropObjPtr.p->m_callback.m_callbackFunction = 
     safe_cast(&Dbdict::dropObj_commit_complete_done);
-
-  if(f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete)
-    (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete)
+  
+  if(f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete)
+    (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete)
       (signal, dropObjPtr.p);
   else
     execute(signal, dropObjPtr.p->m_callback, 0);
@@ -14209,9 +14439,42 @@
   DropObjRecordPtr dropObjPtr;  
   ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
   
+  XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0];
+  SchemaFile::TableEntry objEntry = * getTableEntry(xsf, 
+						    dropObjPtr.p->m_obj_id);
+
+  Callback callback;
+  callback.m_callbackData = dropObjPtr.p->key;
+  callback.m_callbackFunction = 
+    safe_cast(&Dbdict::dropObj_abort_writeSchemaConf);
+  
+  if (objEntry.m_tableState == SchemaFile::DROP_TABLE_STARTED)
+  {
+    jam();
+    objEntry.m_tableState = SchemaFile::TABLE_ADD_COMMITTED;
+        
+    updateSchemaState(signal, dropObjPtr.p->m_obj_id, &objEntry, &callback);
+  }
+  else
+  {
+    execute(signal, callback, 0);
+  }
+}
+
+void
+Dbdict::dropObj_abort_writeSchemaConf(Signal* signal, 
+				      Uint32 callbackData,
+				      Uint32 returnCode)
+{
+  jam();
+  ndbrequire(returnCode == 0);
+  
+  DropObjRecordPtr dropObjPtr;  
+  ndbrequire(c_opDropObj.find(dropObjPtr, callbackData));
+  
   dropObjPtr.p->m_callback.m_callbackFunction = 
     safe_cast(&Dbdict::dropObj_abort_complete_done);
-
+  
   if(f_dict_op[dropObjPtr.p->m_vt_index].m_abort_complete)
     (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_abort_complete)
       (signal, dropObjPtr.p);
@@ -14255,7 +14518,6 @@
     
     if(status != SimpleProperties::Eof)
     {
-      ndbrequire(false);
       op->m_errorCode = CreateTableRef::InvalidFormat;
       break;
     }
@@ -14319,10 +14581,23 @@
       fg_ptr.p->m_tablespace.m_extent_size = fg.TS_ExtentSize;
       fg_ptr.p->m_tablespace.m_default_logfile_group_id = fg.TS_LogfileGroupId;
 
-      // Todo validate logfile group version
+      Ptr<Filegroup> lg_ptr;
+      if (!c_filegroup_hash.find(lg_ptr, fg.TS_LogfileGroupId))
+      {
+	op->m_errorCode = CreateFilegroupRef::NoSuchLogfileGroup;
+	goto error;
+      }
+
+      if (lg_ptr.p->m_version != fg.TS_LogfileGroupVersion)
+      {
+	op->m_errorCode = CreateFilegroupRef::InvalidFilegroupVersion;
+	goto error;
+      }
+      increase_ref_count(lg_ptr.p->m_obj_ptr_i);
       break;
     case DictTabInfo::LogfileGroup:
       fg_ptr.p->m_logfilegroup.m_undo_buffer_size = fg.LF_UndoBufferSize;
+      fg_ptr.p->m_logfilegroup.m_files.init();
       //fg.LF_UndoGrow = ;
       break;
     default:
@@ -14331,12 +14606,14 @@
 
     obj_ptr.p->m_id = op->m_obj_id;
     obj_ptr.p->m_type = fg.FilegroupType;
+    obj_ptr.p->m_ref_count = 0;
     c_obj_hash.add(obj_ptr);
     c_filegroup_hash.add(fg_ptr);
     
     op->m_obj_ptr_i = fg_ptr.i;
   } while(0);
   
+error:
   execute(signal, op->m_callback, 0);
 }
 
@@ -14443,7 +14720,6 @@
     FilegroupPtr fg_ptr;
     if(!c_filegroup_hash.find(fg_ptr, f.FilegroupId)){
       op->m_errorCode = CreateFileRef::NoSuchFilegroup;
-      ndbrequire(false);
       break;
     }
     
@@ -14483,8 +14759,7 @@
     }
     
     FilePtr filePtr;
-    LocalDLList<File> list(c_file_pool, fg_ptr.p->m_files);
-    if (! list.seize(filePtr)){
+    if (! c_file_pool.seize(filePtr)){
       op->m_errorCode = CreateFileRef::OutOfFileRecords;
       c_obj_pool.release(obj_ptr);
       break;
@@ -14495,10 +14770,24 @@
       if(!name.assign(f.FileName, len, hash)){
 	op->m_errorCode = CreateTableRef::TableNameTooLong;
 	c_obj_pool.release(obj_ptr);
-	list.release(filePtr);
+	c_file_pool.release(filePtr);
 	break;
       }
     }
+
+    switch(fg_ptr.p->m_type){
+    case DictTabInfo::Tablespace:
+      increase_ref_count(fg_ptr.p->m_obj_ptr_i);
+      break;
+    case DictTabInfo::LogfileGroup:
+    {
+      LocalDLList<File> list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files);
+      list.add(filePtr);
+      break;
+    }
+    default:
+      ndbrequire(false);
+    }
     
     /**
      * Init file
@@ -14512,6 +14801,7 @@
     
     obj_ptr.p->m_id = op->m_obj_id;
     obj_ptr.p->m_type = f.FileType;
+    obj_ptr.p->m_ref_count = 0;
     c_obj_hash.add(obj_ptr);
     c_file_hash.add(filePtr);
 
@@ -14689,11 +14979,22 @@
   FilegroupPtr fg_ptr;
   ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id));
   
+  switch(fg_ptr.p->m_type){
+  case DictTabInfo::Tablespace:
+    decrease_ref_count(fg_ptr.p->m_obj_ptr_i);
+    break;
+  case DictTabInfo::LogfileGroup:
+  {
+    LocalDLList<File> list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files);
+    list.remove(f_ptr);
+    break;
+  }
+  default:
+    ndbrequire(false);
+  }
+  
   release_object(f_ptr.p->m_obj_ptr_i);
   
-  LocalDLList<File> list(c_file_pool, fg_ptr.p->m_files);
-  list.release(f_ptr);
-
   execute(signal, op->m_callback, 0);
 }
 
@@ -14706,6 +15007,13 @@
 }
 
 void
+Dbdict::drop_undofile_prepare_start(Signal* signal, SchemaOp* op)
+{
+  op->m_errorCode = DropFileRef::DropUndoFileNotSupported;
+  execute(signal, op->m_callback, 0);  
+}
+
+void
 Dbdict::drop_file_commit_start(Signal* signal, SchemaOp* op)
 {
   send_drop_file(signal, op, DropFileImplReq::Commit);
@@ -14719,9 +15027,10 @@
   
   FilegroupPtr fg_ptr;
   ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id));
+
+  decrease_ref_count(fg_ptr.p->m_obj_ptr_i);
+  release_object(f_ptr.p->m_obj_ptr_i);
   
-  LocalDLList<File> list(c_file_pool, fg_ptr.p->m_files);
-  list.release(f_ptr);
   execute(signal, op->m_callback, 0);
 }
 
@@ -14844,5 +15153,109 @@
   ndbrequire(c_opDropObj.find(op_ptr, rep->senderData));
   
   execute(signal, op_ptr.p->m_callback, 0);  
+}
+
+void
+Dbdict::drop_fg_prepare_start(Signal* signal, SchemaOp* op)
+{
+  FilegroupPtr fg_ptr;
+  c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i);
+  
+  DictObject * obj = c_obj_pool.getPtr(fg_ptr.p->m_obj_ptr_i);
+  if (obj->m_ref_count)
+  {
+    op->m_errorCode = DropFilegroupRef::FilegroupInUse;
+    execute(signal, op->m_callback, 0);  
+  }
+  else
+  {
+    send_drop_fg(signal, op, DropFilegroupImplReq::Prepare);
+  }
+}
+
+void
+Dbdict::drop_fg_commit_start(Signal* signal, SchemaOp* op)
+{
+  FilegroupPtr fg_ptr;
+  c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i);
+  if (op->m_obj_type == DictTabInfo::LogfileGroup)
+  {
+    
+    /**
+     * Mark all undofiles as dropped
+     */
+    Ptr<File> filePtr;
+    LocalDLList<File> list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files);
+    XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0];
+    for(list.first(filePtr); !filePtr.isNull(); list.next(filePtr))
+    {
+      Uint32 objId = filePtr.p->key;
+      SchemaFile::TableEntry * tableEntry = getTableEntry(xsf, objId);
+      tableEntry->m_tableState = SchemaFile::DROP_TABLE_COMMITTED;
+      computeChecksum(xsf, objId / NDB_SF_PAGE_ENTRIES);
+      release_object(filePtr.p->m_obj_ptr_i);
+    }
+    list.release();
+  }
+  else if(op->m_obj_type == DictTabInfo::Tablespace)
+  {
+    FilegroupPtr lg_ptr;
+    ndbrequire(c_filegroup_hash.
+	       find(lg_ptr, 
+		    fg_ptr.p->m_tablespace.m_default_logfile_group_id));
+    
+    decrease_ref_count(lg_ptr.p->m_obj_ptr_i);
+  }
+  
+  send_drop_fg(signal, op, DropFilegroupImplReq::Commit);
+}
+
+void
+Dbdict::drop_fg_commit_complete(Signal* signal, SchemaOp* op)
+{
+  FilegroupPtr fg_ptr;
+  c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i);
+  
+  release_object(fg_ptr.p->m_obj_ptr_i);
+  
+  execute(signal, op->m_callback, 0);
+}
+
+void
+Dbdict::drop_fg_abort_start(Signal* signal, SchemaOp* op)
+{
+  send_drop_fg(signal, op, DropFilegroupImplReq::Abort);
+}
+
+void
+Dbdict::send_drop_fg(Signal* signal, SchemaOp* op, 
+		     DropFilegroupImplReq::RequestInfo type)
+{
+  DropFilegroupImplReq* req = (DropFilegroupImplReq*)signal->getDataPtrSend();
+  
+  FilegroupPtr fg_ptr;
+  c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i);
+  
+  req->senderData = op->key;
+  req->senderRef = reference();
+  req->requestInfo = type;
+  
+  req->filegroup_id = fg_ptr.p->key;
+  req->filegroup_version = fg_ptr.p->m_version;
+  
+  Uint32 ref= 0;
+  switch(op->m_obj_type){
+  case DictTabInfo::Tablespace:
+    ref = TSMAN_REF;
+    break;
+  case DictTabInfo::LogfileGroup:
+    ref = LGMAN_REF;
+    break;
+  default:
+    ndbrequire(false);
+  }
+  
+  sendSignal(ref, GSN_DROP_FILEGROUP_REQ, signal, 
+	     DropFilegroupImplReq::SignalLength, JBB);
 }
 

--- 1.45/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-10-06 17:30:22 +02:00
+++ 1.46/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-10-10 14:31:35 +02:00
@@ -59,6 +59,7 @@
 #include <Rope.hpp>
 #include <signaldata/DictObjOp.hpp>
 #include <signaldata/DropFilegroupImpl.hpp>
+#include <SLList.hpp>
 
 #ifdef DBDICT_C
 // Debug Macros
@@ -520,7 +521,6 @@
     bool equal(const File& obj) const { return key == obj.key;}
   };
   typedef Ptr<File> FilePtr;
-  typedef LocalDLList<File> FileList;
 
   struct Filegroup {
     Filegroup(){}
@@ -531,7 +531,6 @@
     Uint32 m_type;
     Uint32 m_version;
     RopeHandle m_name;
-    DLList<File>::Head m_files;
 
     union {
       struct {
@@ -541,6 +540,7 @@
       
       struct {
 	Uint32 m_undo_buffer_size;
+	DLList<File>::HeadPOD m_files;
       } m_logfilegroup;
     };
     
@@ -567,13 +567,14 @@
     DictObject() {}
     Uint32 m_id;
     Uint32 m_type;
+    Uint32 m_ref_count;
     RopeHandle m_name;  
-    struct {
-      Uint32 m_name_len;
-      const char * m_name_ptr;
-      RopePool * m_pool;
-    } m_key;
     union {
+      struct {
+	Uint32 m_name_len;
+	const char * m_name_ptr;
+	RopePool * m_pool;
+      } m_key;
       Uint32 nextPool;
       Uint32 nextList;
     };
@@ -609,6 +610,9 @@
   
   void release_object(Uint32 obj_ptr_i, DictObject* obj_ptr_p);
 
+  void increase_ref_count(Uint32 obj_ptr_i);
+  void decrease_ref_count(Uint32 obj_ptr_i);
+
 public:
   Dbdict(const class Configuration &);
   virtual ~Dbdict();
@@ -2428,12 +2432,15 @@
   void execDROP_OBJ_CONF(Signal* signal);
 
   void dropObj_prepare_start_done(Signal* signal, Uint32 callback, Uint32);
+  void dropObj_prepare_writeSchemaConf(Signal*, Uint32 callback, Uint32);
   void dropObj_prepare_complete_done(Signal*, Uint32 callbackData, Uint32);
   void dropObj_commit_start_done(Signal*, Uint32 callbackData, Uint32);
+  void dropObj_commit_writeSchemaConf(Signal*, Uint32 callback, Uint32);
   void dropObj_commit_complete_done(Signal*, Uint32 callbackData, Uint32);
   void dropObj_abort_start_done(Signal*, Uint32 callbackData, Uint32);
+  void dropObj_abort_writeSchemaConf(Signal*, Uint32 callback, Uint32);
   void dropObj_abort_complete_done(Signal*, Uint32 callbackData, Uint32);
-
+  
   void restartCreateObj(Signal*, Uint32, 
 			const SchemaFile::TableEntry *,
 			const SchemaFile::TableEntry *, bool);
@@ -2475,6 +2482,14 @@
   void drop_file_commit_complete(Signal* signal, SchemaOp*);
   void drop_file_abort_start(Signal* signal, SchemaOp*);
   void send_drop_file(Signal*, SchemaOp*, DropFileImplReq::RequestInfo);
+
+  void drop_fg_prepare_start(Signal* signal, SchemaOp*);
+  void drop_fg_commit_start(Signal* signal, SchemaOp*);
+  void drop_fg_commit_complete(Signal* signal, SchemaOp*);
+  void drop_fg_abort_start(Signal* signal, SchemaOp*);
+  void send_drop_fg(Signal*, SchemaOp*, DropFilegroupImplReq::RequestInfo);
+
+  void drop_undofile_prepare_start(Signal* signal, SchemaOp*);
 };
 
 inline bool

--- 1.6/storage/ndb/src/kernel/vm/DLList.hpp	2005-08-07 19:05:46 +02:00
+++ 1.7/storage/ndb/src/kernel/vm/DLList.hpp	2005-10-10 14:31:35 +02:00
@@ -30,10 +30,18 @@
   /**
    * List head
    */
-  struct Head {
-    Head();
+  struct HeadPOD {
     Uint32 firstItem;
     inline bool isEmpty() const { return firstItem == RNIL; }
+    inline void init () { firstItem = RNIL; }
+  };
+
+  struct Head : public HeadPOD {
+    Head();
+    Head& operator=(const HeadPOD& src) {
+      this->firstItem = src.firstItem;
+      return *this;
+    }
   };
   
   DLList(ArrayPool<T> & thePool);
@@ -164,7 +172,7 @@
 template <class T, class U = T>
 class LocalDLList : public DLList<T,U> {
 public:
-  LocalDLList(ArrayPool<T> & thePool, typename DLList<T,U>::Head &
_src)
+  LocalDLList(ArrayPool<T> & thePool, typename DLList<T,U>::HeadPOD &
_src)
     : DLList<T,U>(thePool), src(_src)
   {
     this->head = src;
@@ -174,7 +182,7 @@
     src = this->head;
   }
 private:
-  typename DLList<T,U>::Head & src;
+  typename DLList<T,U>::HeadPOD & src;
 };
 
 template <class T, class U>
@@ -186,7 +194,7 @@
 template <class T, class U>
 inline
 DLList<T,U>::Head::Head(){
-  firstItem = RNIL;
+  this->init();
 }
 
 /**

--- 1.6/storage/ndb/src/kernel/vm/SLList.hpp	2005-08-07 19:05:46 +02:00
+++ 1.7/storage/ndb/src/kernel/vm/SLList.hpp	2005-10-10 14:31:35 +02:00
@@ -30,9 +30,17 @@
   /**
    * List head
    */
-  struct Head {
-    Head();
+  struct HeadPOD {
     Uint32 firstItem;
+    void init() { firstItem = RNIL;}
+  };
+
+  struct Head : public HeadPOD {
+    Head();
+    Head& operator= (const HeadPOD& src) { 
+      this->firstItem = src.firstItem;
+      return *this;
+    }
   };
   
   SLList(ArrayPool<T> & thePool);
@@ -147,7 +155,7 @@
 template <class T, class U = T>
 class LocalSLList : public SLList<T,U> {
 public:
-  LocalSLList(ArrayPool<T> & thePool, typename SLList<T,U>::Head &
_src)
+  LocalSLList(ArrayPool<T> & thePool, typename SLList<T,U>::HeadPOD &
_src)
     : SLList<T,U>(thePool), src(_src)
   {
     this->head = src;
@@ -157,7 +165,7 @@
     src = this->head;
   }
 private:
-  typename SLList<T,U>::Head & src;
+  typename SLList<T,U>::HeadPOD & src;
 };
 
 template <class T, class U>
@@ -169,7 +177,7 @@
 template <class T, class U>
 inline
 SLList<T,U>::Head::Head(){
-  firstItem = RNIL;
+  this->init();
 }
 
 template <class T, class U>

--- 1.109/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2005-09-28 15:14:50 +02:00
+++ 1.110/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2005-10-10 14:31:35 +02:00
@@ -3609,7 +3609,7 @@
   req->senderData = 0;
   req->file_id = file.m_id;
   req->file_version = file.m_version;
-  
+
   int err[] = { DropFileRef::Busy, 0};
   DBUG_RETURN(dictSignal(&tSignal, 0, 0,
 	                 0, // master
@@ -3742,8 +3742,8 @@
   DropFilegroupReq* req = CAST_PTR(DropFilegroupReq, tSignal.getDataPtrSend());
   req->senderRef = m_reference;
   req->senderData = 0;
-  req->file_group_id = group.m_id;
-  req->file_group_version = group.m_version;
+  req->filegroup_id = group.m_id;
+  req->filegroup_version = group.m_version;
   
   int err[] = { DropFilegroupRef::Busy, DropFilegroupRef::NotMaster, 0};
   DBUG_RETURN(dictSignal(&tSignal, 0, 0,

--- 1.25/storage/ndb/src/ndbapi/Ndbif.cpp	2005-09-16 17:44:30 +02:00
+++ 1.26/storage/ndb/src/ndbapi/Ndbif.cpp	2005-10-10 14:31:35 +02:00
@@ -697,6 +697,10 @@
   case GSN_CREATE_FILE_CONF:
   case GSN_CREATE_FILEGROUP_REF:
   case GSN_CREATE_FILEGROUP_CONF:
+  case GSN_DROP_FILE_REF:
+  case GSN_DROP_FILE_CONF:
+  case GSN_DROP_FILEGROUP_REF:
+  case GSN_DROP_FILEGROUP_CONF:
   case GSN_WAIT_GCP_CONF:
   case GSN_WAIT_GCP_REF:
     NdbDictInterface::execSignal(&theDictionary->m_receiver,
@@ -1048,6 +1052,7 @@
 Ndb::check_send_timeout()
 {
   NDB_TICKS current_time = NdbTick_CurrentMillisecond();
+  assert(current_time >= the_last_check_time);
   if (current_time - the_last_check_time > 1000) {
     the_last_check_time = current_time;
     Uint32 no_of_sent = theNoOfSentTransactions;

--- 1.151/sql/ha_ndbcluster.cc	2005-09-16 17:44:30 +02:00
+++ 1.152/sql/ha_ndbcluster.cc	2005-10-10 14:31:34 +02:00
@@ -7543,140 +7543,167 @@
   }
   ndb= get_ndb();
   dict= ndb->getDictionary();
-  switch (info->ts_cmd_type)
+  switch (info->ts_cmd_type){
+  case (CREATE_TABLESPACE):
   {
-    case (CREATE_TABLESPACE):
+    NdbDictionary::Tablespace ndb_ts;
+    NdbDictionary::Datafile ndb_df;
+    if (set_up_tablespace(info, &ndb_ts))
     {
-      NdbDictionary::Tablespace ndb_ts;
-      NdbDictionary::Datafile ndb_df;
-      if (set_up_tablespace(info, &ndb_ts))
-      {
-        DBUG_RETURN(1);
-      }
-      if (set_up_datafile(info, &ndb_df))
-      {
-        DBUG_RETURN(1);
-      }
-      if (error= dict->createTablespace(ndb_ts))
-      {
-        DBUG_PRINT("error", ("createTablespace returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "TABLESPACE");
-        DBUG_RETURN(1);
-      }
-      DBUG_PRINT("info", ("Successfully created Tablespace"));
-      if (error= dict->createDatafile(ndb_df))
-      {
-        DBUG_PRINT("error", ("createDatafile returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "DATAFILE");
-        DBUG_RETURN(1);
-      }
-      break;
+      DBUG_RETURN(1);
+    }
+    if (set_up_datafile(info, &ndb_df))
+    {
+      DBUG_RETURN(1);
     }
-    case (ALTER_TABLESPACE):
+    if (error= dict->createTablespace(ndb_ts))
+    {
+      DBUG_PRINT("error", ("createTablespace returned %d", error));
+      my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "TABLESPACE");
+      DBUG_RETURN(1);
+    }
+    DBUG_PRINT("info", ("Successfully created Tablespace"));
+    if (error= dict->createDatafile(ndb_df))
+    {
+      DBUG_PRINT("error", ("createDatafile returned %d", error));
+      my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "DATAFILE");
+      DBUG_RETURN(1);
+    }
+    break;
+  }
+  case (ALTER_TABLESPACE):
+  {
+    if (info->ts_alter_tablespace_type == ALTER_TABLESPACE_ADD_FILE)
     {
       NdbDictionary::Datafile ndb_df;
       if (set_up_datafile(info, &ndb_df))
       {
-        DBUG_RETURN(1);
+	DBUG_RETURN(1);
       }
       if (error= dict->createDatafile(ndb_df))
       {
-        DBUG_PRINT("error", ("createDatafile returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "DATAFILE");
-        DBUG_RETURN(1);
+	DBUG_PRINT("error", ("createDatafile returned %d", error));
+	my_error(ER_ALTER_TABLESPACE_FAILED, MYF(0), "CREATE DATAFILE");
+	DBUG_RETURN(1);
       }
-      break;
     }
-    case (CREATE_LOGFILE_GROUP):
+    else if(info->ts_alter_tablespace_type == ALTER_TABLESPACE_DROP_FILE)
     {
-      NdbDictionary::LogfileGroup ndb_lg;
-      NdbDictionary::Undofile ndb_uf;
-      if (info->undo_file_name == NULL)
-      {
-        /*
-          REDO files in LOGFILE GROUP not supported yet
-        */
-        DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
-      }
-      if (set_up_logfile_group(info, &ndb_lg))
+      NdbDictionary::Datafile df = dict->getDatafile(0, 
+						     info->data_file_name);
+      if (strcmp(df.getPath(), info->data_file_name) == 0)
       {
-        DBUG_RETURN(1);
+	if (error= dict->dropDatafile(df))
+	{
+	  DBUG_PRINT("error", ("createDatafile returned %d", error));
+	  my_error(ER_ALTER_TABLESPACE_FAILED, MYF(0), " DROP DATAFILE");
+	  DBUG_RETURN(1);
+	}
       }
-      if (error= dict->createLogfileGroup(ndb_lg))
+      else
       {
-        DBUG_PRINT("error", ("createLogfileGroup returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "LOGFILE GROUP");
-        DBUG_RETURN(1);
+	DBUG_PRINT("error", ("No such datafile"));
+	my_error(ER_ALTER_TABLESPACE_FAILED, MYF(0), " NO SUCH FILE");
+	DBUG_RETURN(1);
       }
-      DBUG_PRINT("info", ("Successfully created Logfile Group"));
-      if (set_up_undofile(info, &ndb_uf))
-      {
-        DBUG_RETURN(1);
-      }
-      if (error= dict->createUndofile(ndb_uf))
-      {
-        DBUG_PRINT("error", ("createUndofile returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "UNDOFILE");
-        DBUG_RETURN(1);
-      }
-      break;
     }
-    case (ALTER_LOGFILE_GROUP):
+    else
     {
-      NdbDictionary::Undofile ndb_uf;
-      if (info->undo_file_name == NULL)
-      {
-        /*
-          REDO files in LOGFILE GROUP not supported yet
-        */
-        DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
-      }
-      if (set_up_undofile(info, &ndb_uf))
-      {
-        DBUG_RETURN(1);
-      }
-      if (error= dict->createUndofile(ndb_uf))
-      {
-        DBUG_PRINT("error", ("createUndofile returned %d", error));
-        my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "UNDOFILE");
-        DBUG_RETURN(1);
-      }
-      break;
+      DBUG_PRINT("error", ("Unsupported alter tablespace: %d", 
+			   info->ts_alter_tablespace_type));
+      DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
     }
-    case (DROP_TABLESPACE):
+    break;
+  }
+  case (CREATE_LOGFILE_GROUP):
+  {
+    NdbDictionary::LogfileGroup ndb_lg;
+    NdbDictionary::Undofile ndb_uf;
+    if (info->undo_file_name == NULL)
+    {
+      /*
+	REDO files in LOGFILE GROUP not supported yet
+      */
+      DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+    }
+    if (set_up_logfile_group(info, &ndb_lg))
     {
-      if (error= dict->dropTablespace(
-            dict->getTablespace(info->tablespace_name)))
-      {
-        DBUG_PRINT("error", ("dropTablespace returned %d", error));
-        my_error(ER_DROP_TABLESPACE_FAILED, MYF(0), "TABLESPACE");
-        DBUG_RETURN(1);
-      }
-      break;
+      DBUG_RETURN(1);
     }
-    case (DROP_LOGFILE_GROUP):
+    if (error= dict->createLogfileGroup(ndb_lg))
     {
-      if (error= dict->dropLogfileGroup(
-            dict->getLogfileGroup(info->tablespace_name)))
-      {
-        DBUG_PRINT("error", ("dropLogfileGroup returned %d", error));
-        my_error(ER_DROP_TABLESPACE_FAILED, MYF(0), "LOGFILE GROUP");
-        DBUG_RETURN(1);
-      }
-      break;
+      DBUG_PRINT("error", ("createLogfileGroup returned %d", error));
+      my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "LOGFILE GROUP");
+      DBUG_RETURN(1);
     }
-    case (CHANGE_FILE_TABLESPACE):
+    DBUG_PRINT("info", ("Successfully created Logfile Group"));
+    if (set_up_undofile(info, &ndb_uf))
     {
-      DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+      DBUG_RETURN(1);
     }
-    case (ALTER_ACCESS_MODE_TABLESPACE):
+    if (error= dict->createUndofile(ndb_uf))
     {
-      DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+      DBUG_PRINT("error", ("createUndofile returned %d", error));
+      my_error(ER_CREATE_TABLESPACE_FAILED, MYF(0), "UNDOFILE");
+      DBUG_RETURN(1);
     }
-    default:
+    break;
+  }
+  case (ALTER_LOGFILE_GROUP):
+  {
+    if (info->undo_file_name == NULL)
     {
+      /*
+	REDO files in LOGFILE GROUP not supported yet
+      */
       DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
     }
+    NdbDictionary::Undofile ndb_uf;
+    if (set_up_undofile(info, &ndb_uf))
+    {
+      DBUG_RETURN(1);
+    }
+    if (error= dict->createUndofile(ndb_uf))
+    {
+      DBUG_PRINT("error", ("createUndofile returned %d", error));
+      my_error(ER_ALTER_TABLESPACE_FAILED, MYF(0), "CREATE UNDOFILE");
+      DBUG_RETURN(1);
+    }
+    break;
+  }
+  case (DROP_TABLESPACE):
+  {
+    if (error= dict->dropTablespace(
+				    dict->getTablespace(info->tablespace_name)))
+    {
+      DBUG_PRINT("error", ("dropTablespace returned %d", error));
+      my_error(ER_DROP_TABLESPACE_FAILED, MYF(0), "TABLESPACE");
+      DBUG_RETURN(1);
+    }
+    break;
+  }
+  case (DROP_LOGFILE_GROUP):
+  {
+    if (error=
dict->dropLogfileGroup(dict->getLogfileGroup(info->logfile_group_name)))
+    {
+      DBUG_PRINT("error", ("dropLogfileGroup returned %d", error));
+      my_error(ER_DROP_TABLESPACE_FAILED, MYF(0), "LOGFILE GROUP");
+      DBUG_RETURN(1);
+    }
+    break;
+  }
+  case (CHANGE_FILE_TABLESPACE):
+  {
+    DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+  }
+  case (ALTER_ACCESS_MODE_TABLESPACE):
+  {
+    DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+  }
+  default:
+  {
+    DBUG_RETURN(HA_ADMIN_NOT_IMPLEMENTED);
+  }
   }
   DBUG_RETURN(FALSE);
 }

--- 1.7/mysql-test/t/ndb_basic_disk.test	2005-10-04 20:54:09 +02:00
+++ 1.8/mysql-test/t/ndb_basic_disk.test	2005-10-10 14:31:34 +02:00
@@ -266,3 +266,9 @@
 update t1 set c = '7'  where c = '6';
 select * from t1 order by 1;
 drop table t1;
+
+alter tablespace ts1 drop datafile 'datafile.dat' engine = ndb;
+alter tablespace ts1 drop datafile 'datafile02.dat' engine = ndb;
+drop tablespace ts1 engine = ndb;
+
+drop logfile group lg1 engine = ndb;

--- 1.51/storage/ndb/src/ndbapi/ndberror.c	2005-10-07 08:58:58 +02:00
+++ 1.52/storage/ndb/src/ndbapi/ndberror.c	2005-10-10 14:31:35 +02:00
@@ -372,7 +372,11 @@
   { 760,  DMEC, SE, "File already exists", },
   { 761,  DMEC, SE, "Unable to drop table as backup is in progress" },
   { 762,  DMEC, SE, "Unable to alter table as backup is in progress" },
-  { 763,  DMEC, SE, "Cant drop file, no such file" },
+  { 766,  DMEC, SE, "Cant drop file, no such file" },
+  { 767,  DMEC, SE, "Cant drop filegroup, no such filegroup" },
+  { 768,  DMEC, SE, "Cant drop filegroup, filegroup is used" },
+  { 769,  DMEC, SE, "Drop undofile not supported, drop logfile group instead" },
+  { 770,  DMEC, SE, "Cant drop file, file is used" }
   { 241,  HA_ERR_TABLE_DEF_CHANGED, SE, "Invalid schema object version" },
   { 283,  HA_ERR_NO_SUCH_TABLE, SE, "Table is being dropped" },
   { 284,  HA_ERR_TABLE_DEF_CHANGED, SE, "Table not defined in transaction coordinator" },
Thread
bk commit into 5.1 tree (jonas:1.2036)jonas10 Oct