List:Commits« Previous MessageNext Message »
From:pekka Date:January 20 2007 12:14pm
Subject:bk commit into 5.1 tree (pekka:1.2393)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of pekka. When pekka 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@stripped, 2007-01-20 13:14:30+01:00, pekka@stripped +3 -0
  ndb - wl#3600 dict op<->dict object + fix trigger name

  storage/ndb/include/kernel/signaldata/CreateTrig.hpp@stripped, 2007-01-20 13:13:49+01:00, pekka@stripped +2 -1
    wl#3600 dict op<->dict object + fix trigger name

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp@stripped, 2007-01-20 13:13:50+01:00, pekka@stripped +197 -39
    wl#3600 dict op<->dict object + fix trigger name

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp@stripped, 2007-01-20 13:13:50+01:00, pekka@stripped +29 -5
    wl#3600 dict op<->dict object + fix trigger name

# 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:	pekka
# Host:	clam.(none)
# Root:	/export/space/pekka/ndb/version/my52-wl3600-a

--- 1.6/storage/ndb/include/kernel/signaldata/CreateTrig.hpp	2007-01-16 12:39:53 +01:00
+++ 1.7/storage/ndb/include/kernel/signaldata/CreateTrig.hpp	2007-01-20 13:13:49 +01:00
@@ -91,7 +91,8 @@
     UnsupportedTriggerType = 4240,
     BadRequestType = 4247,
     InvalidName = 4248,
-    InvalidTable = 4249
+    InvalidTable = 4249,
+    OutOfStringBuffer = 773
   };
   STATIC_CONST( SignalLength = 11 );
 

--- 1.135/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2007-01-18 13:18:45 +01:00
+++ 1.136/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2007-01-20 13:13:50 +01:00
@@ -301,7 +301,12 @@
       const Uint32 size = name.size();
       char buf[1024];
       name.copy(buf);
-      ndbout_c("%s m_ref_count: %d", buf, iter.curr.p->m_ref_count); 
+      char active_op[40];
+      active_op[0] = 0;
+      if (iter.curr.p->m_op_ptr_i != RNIL)
+        sprintf(active_op, " active op: %x", iter.curr.p->m_op_ptr_i);
+      ndbout_c("%s: m_ref_count: %d%s",
+               buf, iter.curr.p->m_ref_count, active_op);
     }
   }    
   
@@ -3938,11 +3943,6 @@
     
     handleTabInfoInit(r, &parseRecord);
     releaseSections(signal);
-    {
-      Uint32 tableId = parseRecord.tablePtr.i;
-      Uint32 tableVersion = parseRecord.tablePtr.p->tableVersion;
-      D("execCREATE_TABLE_REQ" << V(tableId) << V(tableVersion));
-    }
 
     if (parseRecord.errorCode != 0) {
       jam();
@@ -4202,6 +4202,14 @@
   tabPtr.p->tableVersion = tableVersion;
   tabPtr.p->gciTableCreated = gci;
 
+  // link operation to object seized in handleTabInfoInit
+  {
+    DictObjectPtr obj_ptr;
+    Uint32 obj_ptr_i = tabPtr.p->m_obj_ptr_i;
+    bool ok = findDictObject(op_ptr, obj_ptr, obj_ptr_i);
+    ndbrequire(ok);
+  }
+
   SchemaFile::TableEntry tabEntry;
   tabEntry.m_tableVersion = tableVersion;
   tabEntry.m_tableType    = tabPtr.p->tableType;
@@ -6556,6 +6564,17 @@
   return old_ptr.p;
 }
 
+bool
+Dbdict::get_object(DictObjectPtr& obj_ptr, const char* name, Uint32 len, Uint32 hash)
+{
+  DictObject key;
+  key.m_key.m_name_ptr = name;
+  key.m_key.m_name_len = len;
+  key.m_key.m_pool = &c_rope_pool;
+  key.m_name.m_hash = hash;
+  return c_obj_hash.find(obj_ptr, key);
+}
+
 void
 Dbdict::release_object(Uint32 obj_ptr_i, DictObject* obj_ptr_p){
   Rope name(c_rope_pool, obj_ptr_p->m_name);
@@ -7296,6 +7315,14 @@
     return;
   }
 
+  // link operation to object
+  {
+    DictObjectPtr obj_ptr;
+    Uint32 obj_ptr_i = tablePtr.p->m_obj_ptr_i;
+    bool ok = findDictObject(op_ptr, obj_ptr, obj_ptr_i);
+    ndbrequire(ok);
+  }
+
   dropTabPtr.p->m_errorCode = 0;//
   dropTabPtr.p->m_requestType = impl_req->requestType;//
   dropTabPtr.p->m_coordinatorRef = impl_req->senderRef;//
@@ -8116,6 +8143,7 @@
 
   dropTabPtr.p->m_participantData.m_gsn = GSN_DROP_TAB_CONF;
 
+  unlinkDictObject(op_ptr);
   releaseTableObject(dropTabPtr.p->m_request.tableId);
 
   DropTabConf * conf = (DropTabConf*)signal->getDataPtr();  
@@ -8156,6 +8184,7 @@
   if (removeFromHash)
   {
     jam();
+    // wl3600_todo have to call releaseDictObject
     release_object(tablePtr.p->m_obj_ptr_i);
   }
   else
@@ -8196,7 +8225,7 @@
     def.erase();
   }
   list.release();
-}//releaseTableObject()
+}
 
 /**
  * DICT receives these on index create and drop.
@@ -13338,7 +13367,7 @@
   req->attributeMask = alterIndexPtr.p->m_attrMask;
 
   char triggerName[MAX_TAB_NAME_SIZE];
-  sprintf(triggerName, triggerTmpl.nameFormat, triggerNo);
+  sprintf(triggerName, triggerTmpl.nameFormat, impl_req->indexId);
 
   // name section
   Uint32 buffer[2 + ((MAX_TAB_NAME_SIZE + 3) >> 2)];    // SP string
@@ -14956,6 +14985,7 @@
   // check name is unique
   if (get_object(createTriggerPtr.p->m_triggerName) != 0) {
     jam();
+    D("duplicate trigger name: " << createTriggerPtr.p->m_triggerName);
     setError(error, CreateTrigRef::TriggerExists, __LINE__);
     return;
   }
@@ -15019,23 +15049,28 @@
   // fill in trigger data
   triggerPtr.p->triggerId = impl_req->triggerId;
   triggerPtr.p->tableId = impl_req->tableId;
-  triggerPtr.p->indexId = ~(Uint32)0; // caller connects to index
+  triggerPtr.p->indexId = RNIL; // caller connects to index
   triggerPtr.p->triggerInfo = impl_req->triggerInfo;
   triggerPtr.p->attributeMask = impl_req->attributeMask;
   triggerPtr.p->triggerState = TriggerRecord::TS_OFFLINE;
+  {
+    Rope name(c_rope_pool, triggerPtr.p->triggerName);
+    if (!name.assign(createTriggerPtr.p->m_triggerName)) {
+      jam();
+      setError(error, CreateTrigRef::OutOfStringBuffer, __LINE__);
+      return;
+    }
+  }
 
-#ifdef wl3600_todo // do object stuff later
+  // connect to new DictObject
   {
     Ptr<DictObject> obj_ptr;
-    ndbrequire(c_obj_hash.seize(obj_ptr));
-    obj_ptr.p->m_name = triggerPtr.p->triggerName;
-    obj_ptr.p->m_id = impl_req->triggerId; // XXX non-unique
-    obj_ptr.p->m_type = triggerPtr.p->triggerType;
-    obj_ptr.p->m_ref_count = 0;
-    c_obj_hash.add(obj_ptr);
+    seizeDictObject(op_ptr, obj_ptr, triggerPtr.p->triggerName);
+
+    obj_ptr.p->m_id = impl_req->triggerId; // wl3600_todo id
+    obj_ptr.p->m_type = TriggerInfo::getTriggerType(triggerPtr.p->triggerInfo);
     triggerPtr.p->m_obj_ptr_i = obj_ptr.i;
   }
-#endif
 }
 
 bool
@@ -15808,11 +15843,15 @@
   ndbrequire(impl_req->senderRef == numberToRef(DBDICT, c_masterNodeId));
   ndbrequire(impl_req->senderData == op_ptr.p->op_key);
 
-  // save name if any wl3600_todo use a requestType for this
-  if (signal->getNoOfSections() > 0) {
+  bool reqByName = false;
+  if (signal->getNoOfSections() > 0) { // wl3600_todo use requestType
     jam();
     ndbrequire(signal->getNoOfSections() == 1);
+    reqByName = true;
+  }
 
+  if (reqByName) {
+    jam();
     SegmentedSectionPtr ss_ptr;
     signal->getSection(ss_ptr, DropTrigImplReq::TRIGGER_NAME_SECTION);
     SimplePropertiesSectionReader r(ss_ptr, getSectionSegmentPool());
@@ -15833,35 +15872,54 @@
     const Uint32 bytesize = sizeof(dropTriggerPtr.p->m_triggerName);
     memcpy(dropTriggerPtr.p->m_triggerName, tableDesc.TableName, bytesize);
 
-#if wl3600_todo // do object stuff later
-    DictObject * obj_ptr_p = get_object(triggerName);
-    if (obj_ptr_p == 0){
+    // find object by name and link it to operation
+    DictObjectPtr obj_ptr;
+    if (!findDictObject(op_ptr, obj_ptr, dropTriggerPtr.p->m_triggerName)) {
       jam();
-      req->setTriggerId(RNIL);
-    } else {
+      setError(error, DropTrigRef::TriggerNotFound, __LINE__);
+      return;
+    }
+    if (impl_req->triggerId != RNIL &&
+        impl_req->triggerId != obj_ptr.p->m_id) {
       jam();
-      //ndbout_c("++++++++++ Found trigger %s", triggerPtr.p->triggerName);
-      TriggerRecordPtr triggerPtr;
-      c_triggerRecordPool.getPtr(triggerPtr, obj_ptr_p->m_id);
-      req->setTriggerId(triggerPtr.p->triggerId);
-      req->setTableId(triggerPtr.p->tableId);
+      // inconsistency in request
+      setError(error, DropTrigRef::TriggerNotFound, __LINE__);
+      return;
     }
-#endif
+    impl_req->triggerId = obj_ptr.p->m_id;
   }
 
-  // check the table wl3600_todo
-  // check the index if any wl3600_todo
-
-  // check the trigger
+  // check trigger id from user or via name
+  TriggerRecordPtr triggerPtr;
   {
-    const Uint32 triggerId = impl_req->triggerId;
     if (! (impl_req->triggerId < c_triggerRecordPool.getSize())) {
       jam();
       setError(error, DropTrigImplRef::TriggerNotFound, __LINE__);
       return;
     }
+    c_triggerRecordPool.getPtr(triggerPtr, impl_req->triggerId);
     // wl3600_todo state check
   }
+
+  // connect to object in request by id
+  if (!reqByName) {
+    jam();
+    DictObjectPtr obj_ptr;
+    if (!findDictObject(op_ptr, obj_ptr, triggerPtr.p->m_obj_ptr_i)) {
+      jam();
+      // broken trigger object wl3600_todo bad error code
+      setError(error, DropTrigImplRef::TriggerNotFound, __LINE__);
+      return;
+    }
+    ndbrequire(obj_ptr.p->m_id == triggerPtr.p->triggerId);
+
+    // fill in name just to be complete
+    ConstRope name(c_rope_pool, triggerPtr.p->triggerName);
+    name.copy(dropTriggerPtr.p->m_triggerName); //wl3600_todo length check
+  }
+
+  // check the table wl3600_todo
+  // check the index if any wl3600_todo
 }
 
 bool
@@ -16008,6 +16066,17 @@
   jam();
   D("dropTrigger_commit");
 
+  DropTriggerDataPtr dropTriggerPtr;
+  getOpData(op_ptr, dropTriggerPtr);
+  const DropTrigImplReq* impl_req = &dropTriggerPtr.p->m_request;
+
+  TriggerRecordPtr triggerPtr;
+  c_triggerRecordPool.getPtr(triggerPtr, impl_req->triggerId);
+
+  // remove trigger
+  releaseDictObject(op_ptr);
+  triggerPtr.p->triggerState = TriggerRecord::TS_NOT_DEFINED;
+ 
   schemaTrans_sendConf(signal, op_ptr.p->m_trans_ptr, 0);
 }
 
@@ -19993,14 +20062,17 @@
 Dbdict::releaseSchemaOp(SchemaOpPtr& op_ptr)
 {
   D("releaseSchemaOp" << V(op_ptr.i) << *op_ptr.p);
+
   const OpInfo& info = getOpInfo(op_ptr);
   (this->*(info.m_release))(op_ptr);
-  OpDataPtr& data_ptr = op_ptr.p->m_data_ptr;
-  DictObjectPtr& obj_ptr = data_ptr.p->m_obj_ptr;
-  if (!obj_ptr.isNull()) {
+
+  OpDataPtr data_ptr = op_ptr.p->m_data_ptr;
+  Uint32 obj_ptr_i = data_ptr.p->m_obj_ptr_i;
+  if (obj_ptr_i != RNIL) {
     jam();
-    obj_ptr.p->m_op_ptr.setNull();
+    unlinkDictObject(op_ptr);
   }
+
   c_schemaOpHash.release(op_ptr);
   op_ptr.setNull();
 }
@@ -20053,6 +20125,92 @@
   itAddLast(it, op_ptr);
   op_ptr.p->m_trans_ptr = trans_ptr;
   D("addSchemaOp" << *op_ptr.p);
+}
+
+// the link between SchemaOp and DictObject
+
+void
+Dbdict::getDictObject(SchemaOpPtr op_ptr, DictObjectPtr& obj_ptr)
+{
+  OpDataPtr data_ptr = op_ptr.p->m_data_ptr;
+  ndbrequire(data_ptr.p->m_obj_ptr_i != RNIL);
+  c_obj_pool.getPtr(obj_ptr, data_ptr.p->m_obj_ptr_i);
+}
+
+void
+Dbdict::linkDictObject(SchemaOpPtr op_ptr, DictObjectPtr obj_ptr)
+{
+  OpDataPtr data_ptr = op_ptr.p->m_data_ptr;
+  ndbrequire(data_ptr.p->m_obj_ptr_i == RNIL);
+  data_ptr.p->m_obj_ptr_i = obj_ptr.i;
+
+  obj_ptr.p->m_op_ptr_i = op_ptr.i;
+}
+
+void
+Dbdict::unlinkDictObject(SchemaOpPtr op_ptr)
+{
+  OpDataPtr data_ptr = op_ptr.p->m_data_ptr;
+
+  DictObjectPtr obj_ptr;
+  ndbrequire(data_ptr.p->m_obj_ptr_i != RNIL);
+  c_obj_pool.getPtr(obj_ptr, data_ptr.p->m_obj_ptr_i);
+
+  data_ptr.p->m_obj_ptr_i = RNIL;
+  obj_ptr.p->m_op_ptr_i = RNIL;
+}
+
+void
+Dbdict::seizeDictObject(SchemaOpPtr op_ptr, DictObjectPtr& obj_ptr,
+                        const RopeHandle& name)
+{
+  bool ok = c_obj_hash.seize(obj_ptr);
+  ndbrequire(ok);
+  new (obj_ptr.p) DictObject();
+
+  obj_ptr.p->m_name = name;
+  c_obj_hash.add(obj_ptr);
+  obj_ptr.p->m_ref_count = 0;
+
+  linkDictObject(op_ptr, obj_ptr);
+}
+
+bool
+Dbdict::findDictObject(SchemaOpPtr op_ptr, DictObjectPtr& obj_ptr,
+                       const char* name)
+{
+  if (get_object(obj_ptr, name)) {
+    jam();
+    linkDictObject(op_ptr, obj_ptr);
+    return true;
+  }
+  return false;
+}
+
+bool
+Dbdict::findDictObject(SchemaOpPtr op_ptr, DictObjectPtr& obj_ptr,
+                       Uint32 obj_ptr_i)
+{
+  if (obj_ptr_i != RNIL) {
+    jam();
+    c_obj_pool.getPtr(obj_ptr, obj_ptr_i);
+    linkDictObject(op_ptr, obj_ptr);
+    return true;
+  }
+  return false;
+}
+
+void
+Dbdict::releaseDictObject(SchemaOpPtr op_ptr)
+{
+  DictObjectPtr obj_ptr;
+  getDictObject(op_ptr, obj_ptr);
+
+  obj_ptr.p->m_op_ptr_i = RNIL;
+  release_object(obj_ptr.i);
+
+  OpDataPtr data_ptr = op_ptr.p->m_data_ptr;
+  data_ptr.p->m_obj_ptr_i = RNIL;
 }
 
 // SchemaTrans

--- 1.63/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2007-01-18 13:18:45 +01:00
+++ 1.64/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2007-01-20 13:13:50 +01:00
@@ -634,7 +634,9 @@
   RopePool c_rope_pool;
 
   struct DictObject {
-    DictObject() {}
+    DictObject() {
+      m_op_ptr_i = RNIL;
+    }
     Uint32 m_id;
     Uint32 m_type;
     Uint32 m_ref_count;
@@ -661,13 +663,14 @@
     }
 
     // active operation on this object
-    Ptr<struct SchemaOp> m_op_ptr;
+    Uint32 m_op_ptr_i;
   };
   typedef Ptr<DictObject> DictObjectPtr;
   
   DLHashTable<DictObject> c_obj_hash; // Name
   ArrayPool<DictObject> c_obj_pool;
-  
+
+  //1
   DictObject * get_object(const char * name){
     return get_object(name, strlen(name) + 1);
   }
@@ -678,6 +681,17 @@
   
   DictObject * get_object(const char * name, Uint32 len, Uint32 hash);
 
+  //2
+  bool get_object(DictObjectPtr& obj_ptr, const char * name){
+    return get_object(obj_ptr, name, strlen(name) + 1);
+  }
+  
+  bool get_object(DictObjectPtr& obj_ptr, const char * name, Uint32 len){
+    return get_object(obj_ptr, name, len, Rope::hash(name, len));
+  }
+  
+  bool get_object(DictObjectPtr&, const char* name, Uint32 len, Uint32 hash);
+
   void release_object(Uint32 obj_ptr_i){
     release_object(obj_ptr_i, c_obj_pool.getPtr(obj_ptr_i));
   }
@@ -1274,12 +1288,12 @@
     const Uint32* const m_impl_req_data;
 
     // DictObject operated on
-    DictObjectPtr m_obj_ptr;
+    Uint32 m_obj_ptr_i;
 
     OpData(const OpInfo& info, const Uint32* impl_req_data) :
       m_opInfo(info),
       m_impl_req_data(impl_req_data) {
-      m_obj_ptr.setNull();
+      m_obj_ptr_i = RNIL;
     }
   };
   typedef Ptr<OpData> OpDataPtr;
@@ -1477,6 +1491,16 @@
 
   // add operation to transaction OpList
   void addSchemaOp(SchemaTransPtr, SchemaOpPtr&);
+
+  // the link between SdhemaOp and DictObject
+
+  void getDictObject(SchemaOpPtr, DictObjectPtr&);
+  void linkDictObject(SchemaOpPtr op_ptr, DictObjectPtr obj_ptr);
+  void unlinkDictObject(SchemaOpPtr op_ptr);
+  void seizeDictObject(SchemaOpPtr, DictObjectPtr&, const RopeHandle& name);
+  bool findDictObject(SchemaOpPtr, DictObjectPtr&, const char* name);
+  bool findDictObject(SchemaOpPtr, DictObjectPtr&, Uint32 obj_ptr_i);
+  void releaseDictObject(SchemaOpPtr);
 
   // list of SchemaOp (sans pool)
   typedef DLFifoList<SchemaOp>::Head OpList;
Thread
bk commit into 5.1 tree (pekka:1.2393)pekka20 Jan