List:Commits« Previous MessageNext Message »
From:jon Date:June 23 2007 12:17pm
Subject:svn commit - mysqldoc@docsrva: r6901 - trunk/ndbapi
View as plain text  
Author: jstephens
Date: 2007-06-23 14:17:22 +0200 (Sat, 23 Jun 2007)
New Revision: 6901

Log:

Added info from WL task HLD/HLS to notes.



Modified:
   trunk/ndbapi/NdbRecord-notes-tmp.txt


Modified: trunk/ndbapi/NdbRecord-notes-tmp.txt
===================================================================
--- trunk/ndbapi/NdbRecord-notes-tmp.txt	2007-06-23 12:10:12 UTC (rev 6900)
+++ trunk/ndbapi/NdbRecord-notes-tmp.txt	2007-06-23 12:17:22 UTC (rev 6901)
Changed blocks: 1, Lines Added: 296, Lines Deleted: 0; 10873 bytes

@@ -1,3 +1,299 @@
+*****   WL#2223:  *****
+
+Pushed into 5.1-telco tree 2007-05-31 -> telco-6.2.3 (not yet released)
+
+HLD:
+
+Introduce NdbRecord
+NdbRecord is linear memory per operation
+NdbRecord can be mapped (almost) directly to mysql record
+
+Lots of code can be removed and
+Lots of optimizations can be added if using records.
+
+It's further more quite simple to make this backward compatible
+
+---
+
+a NdbRecord-object provides mapping to a full or a partial record stored in ndb
+a NdbRecord can also be used together with bitmap for access of partial NdbRecord
+
+a NdbRecord is prepared by API program
+a NdbRecord is validated and finalized by ndbapi
+a NdbRecord-object can be used simultanious
+      in several operations
+      in several transactions
+      in several threads
+      (i.e the actual NdbRecord object should not contain any data references)
+
+Usage of NdbRecord can be phased (as devliverables or internally as)
+* uk read
+* pk read
+* table scan
+* index scan
+* pk dml
+* uk dml
+* index bounds
+
+* wl1496 is concidered depandant on this wl, as it will be soo much simpler
+  to impl. once this is done
+
+---
+
+Logically readTuple(NdbRecord) <=> readTuples() getValue on each col in record
+          insertTuple(NdbRecord) <=> inserTuple() setValue on each col in record
+          etc...
+
+HLS (probably not so useful for docs but I'm including it here anyroad):
+
+NdbRecord *record= dict->createRecord(table, record_specification,
+number_of_coulmns, sizeof(record_specification[0]);
+
+NdbRecord *key_record= dict->createRecord(table, record_specification,
+number_of_key_coulmns, sizeof(record_specification[0]);
+
+char* buf0 = malloc(sizeof(TUPLE));
+char* buf1 = malloc(sizeof(TUPLE));
+char* buf2 = malloc(sizeof(TUPLE));
+
+// set key in buf0
+// set key in buf1
+
+ // Read all columns in record into buf2
+op0 = pTrans->readTuple(key_record, buf0, record, buf2,LM_Read, 0);
+
+ // Read all columns in record & columnmask
+op0 = pTrans->readTuple(key_record, buf0, record, buf2,LM_Read, columnmask);
+
+API:
+
+struct RecordSpecification {
+  /*
+    Column described by this entry (the column maximum size defines field
+    size in row).
+    Note that even when creating an NdbRecord for an index, the column
+    pointers must be to columns obtained from the underlying table, not
+    from the index itself.
+  */
+  const Column *column;
+  /* Offset of data from start of a row. */
+  Uint32 offset;
+  /* Offset from start of row of byte containing NULL bit. */
+  Uint32 nullbit_byte_offset;
+  /* NULL bit, 0-7. */
+  Uint32 nullbit_bit_in_byte;
+};
+
+class NdbDictionary {
+  ...
+  /*
+    Create an NdbRecord for use in table operations.
+  */
+  NdbRecord *createRecord(const Table *table,
+        const RecordSpecification *recSpec,
+        Uint32 length,
+        Uint32 elemSize);
+
+  /*
+    Create an NdbRecord for use in index operations.
+  */
+  NdbRecord *createRecord(const Index *index,
+                          const Table *table,
+        const RecordSpecification *recSpec,
+        Uint32 length,
+        Uint32 elemSize);
+  void releaseRecord(NdbRecord *rec);
+};
+
+class NdbTransaction {
+  ...
+  /* Primary key NdbRecord operations. */
+  NdbOperation *readTuple(const NdbRecord *key_rec, const char *key_row,
+        const NdbRecord *result_rec, char *result_row,
+        NdbOperation::LockMode lock_mode= NdbOperation::LM_Read,
+        const unsigned char *result_mask= 0);
+  NdbOperation *insertTuple(const NdbRecord *rec, const char *row,
+          const unsigned char *mask= 0);
+  NdbOperation *updateTuple(const NdbRecord *key_rec, const char *key_row,
+          const NdbRecord *attr_rec, const char *attr_row,
+          const unsigned char *mask= 0);
+  NdbOperation *writeTuple(const NdbRecord *key_rec, const char *key_row,
+         const NdbRecord *attr_rec, const char *attr_row,
+         const unsigned char *mask);
+  NdbOperation *deleteTuple(const NdbRecord *key_rec, const char *key_row);
+
+  /*
+    Scan a table, using NdbRecord to read out column data.
+
+    The result_record pointer must remain valid until after the call to
+    execute().
+
+    The result_mask pointer is optional, if present only columns for which
+    the corresponding bit in result_mask is set will be retrieved in the
+    scan. The result_mask is copied internally, so in contrast to
+    result_record need not be valid at execute().
+
+    The parallel argument is the desired parallelism, or 0 for maximum
+    parallelism (receiving rows from all fragments in parallel).
+  */
+  NdbScanOperation *
+  scanTable(const NdbRecord *result_record,
+            NdbOperation::LockMode lock_mode= NdbOperation::LM_Read,
+            const unsigned char *result_mask= 0,
+            Uint32 scan_flags= 0,
+            Uint32 parallel= 0,
+            Uint32 batch= 0);
+
+  /*
+    Do an index range scan (optionally ordered) of a table.
+
+    The key_record describes the index to be scanned. It must be a
+    primary key record for the index, ie. it must specify exactly the
+    key columns of the index.
+
+    The result_record describes the rows to be returned from the scan. For an
+    ordered index scan, result_record must be a key record for the index to
+    be scanned, that is it must include at least all of the column in the
+    index.
+
+    Both the key_record and the result_record must be created from the Index
+    to be scanned, not from the underlying table.
+
+    The call uses a callback function as a flexible way of specifying multiple
+    range bounds. The callback will be called once for each bound to define
+    lower and upper key value etc.
+
+    The callback received a private callback_data void *, and the index of the
+    bound (0 .. num_key_bounds). However, it is guaranteed that it will be
+    called in ordered sequence, so it is permissible to ignore the passed
+    bound_index and just return the values for the next bound (for example
+    if data is kept in a linked list).
+
+    The callback can return 0 to denote success, and -1 to denote error (the
+    latter causing the creation of the NdbIndexScanOperation to fail).
+
+    This multi-range method is only for use in mysqld code.
+  */
+private:
+  NdbIndexScanOperation *
+  scanIndex(const NdbRecord *key_record,
+            int (*get_bound_callback)(void *callback_data,
+                                      Uint32 bound_index,
+                                      NdbIndexScanOperation::IndexBound & bound),
+            void *callback_data,
+            Uint32 num_key_bounds,
+            const NdbRecord *result_record,
+            NdbOperation::LockMode lock_mode= NdbOperation::LM_Read,
+            const unsigned char *result_mask= 0,
+            Uint32 scan_flags= 0,
+            Uint32 parallel= 0,
+            Uint32 batch= 0);
+
+public:
+
+  /* A convenience wrapper for simpler specification of a single bound. */
+  NdbIndexScanOperation *
+  scanIndex(const NdbRecord *key_record,
+            const char *low_key,
+            Uint32 low_key_count,
+            bool low_inclusive,
+            const char * high_key,
+            Uint32 high_key_count,
+            bool high_inclusive,
+            const NdbRecord *result_record,
+            NdbOperation::LockMode lock_mode= NdbOperation::LM_Read,
+            const unsigned char *result_mask= 0,
+            Uint32 scan_flags= 0,
+            Uint32 parallel= 0,
+            Uint32 batch= 0);
+
+};
+
+class NdbScanOperation {
+  ...
+  /*
+    NdbRecord version of nextResult.
+    This sets a pointer to the next row in out_row (if returning 0). This
+    pointer is valid (only) until the next call to nextResult() with
+    fetchAllowed==true.
+    The NdbRecord object defining the row format was specified in the
+    NdbTransaction::scanTable (or scanIndex) call.
+  */
+  int nextResult(const char * & out_row,
+                 bool fetchAllowed = true, bool forceSend = false);
+
+  /*
+    NdbRecord versions of scan lock take-over operations.
+
+    Note that calling NdbRecord scan lock take-over on an NdbRecAttr-style
+    scan is not valid, nor is calling NdbRecAttr-style scan lock take-over
+    on an NdbRecord-style scan.
+  */
+
+  /*
+    Take over the lock without changing the row.
+    Optionally also read from the row (call with default value NULL for row
+    to not read any attributes.).
+    The NdbRecord * is required even when not reading any attributes.
+  */
+  NdbOperation *lockCurrentTuple(NdbTransaction *takeOverTrans,
+                                 const NdbRecord *record,
+                                 char *row= 0,
+                                 const unsigned char *mask= 0);
+
+  /*
+    Update the current tuple, NdbRecord version.
+    Values to update with are contained in the passed-in row.
+  */
+  NdbOperation *updateCurrentTuple(NdbTransaction *takeOverTrans,
+                                   const NdbRecord *record,
+                                   const char *row,
+                                   const unsigned char *mask= 0);
+
+  /* Delete the current tuple. */
+  NdbOperation *deleteCurrentTuple(NdbTransaction *takeOverTrans,
+                                   const NdbRecord *record);
+
+};
+
+class NdbIndexScanOperation {
+  ...
+  /* Structure used to describe index scan bounds, for NdbRecord scans. */
+  struct IndexBound {
+    /* Row containing lower bound, or NULL for scan from the start. */
+    const char *low_key;
+    /* Number of columns in lower bound, for bounding by partial prefix. */
+    Uint32 low_key_count;
+    /* True for less-than-or-equal, false for strictly less-than. */
+    bool low_inclusive;
+    /* Row containing upper bound, or NULL for scan to the end. */
+    const char * high_key;
+    /* Number of columns in upper bound, for bounding by partial prefix. */
+    Uint32 high_key_count;
+    /* True for greater-than-or-equal, false for strictly greater-than. */
+    bool high_inclusive;
+    /*
+      Value to identify this bound, may be read with get_range_no().
+      Must be < 8192 (set to zero if not using range_no).
+      Note that for ordered scans, the range_no must be strictly increasing
+      for each range, or the result set will not be sorted correctly.
+    */
+    Uint32 range_no;
+  };
+};
+
+
+
+*****   WL#3733: NdbRecord optimisation for mysqld  *****...
+
+
+Not muc to document other than that the optimisations went into
+5.1-telco tree 2007-05-31 -> telco-6.2.3 release.
+
+Just need to note improved performance.
+
+Grepping for references to NdbRecord in NDBAPI include files...
+
 jon@biollante:~/bk/mysql-5.1-telco/storage/ndb/include/ndbapi> grep -R -n 'NdbRecord' ./
 ./NdbScanOperation.hpp:180:    NdbRecord version of nextResult.
 ./NdbScanOperation.hpp:184:    The NdbRecord object defining the row format was specified in the


Thread
svn commit - mysqldoc@docsrva: r6901 - trunk/ndbapijon23 Jun