<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Drizzle</title>
	<link>http://planetdrizzle.org</link>
	<language>en</language>
	<description>Planet Drizzle - http://planetdrizzle.org</description>

<item>
	<title>Jay Pipes: Recent Work on Improving Drizzle’s Storage Engine API</title>
	<guid>http://www.joinfu.com/?p=343</guid>
	<link>http://www.joinfu.com/2010/03/recent-work-on-improving-drizzles-storage-engine-api/</link>
	<description>&lt;p&gt;Over the past six weeks or so, I have been working on cleaning up the pluggable storage engine API in Drizzle.  I&amp;#8217;d like to describe some of this work and talk a bit about the next steps I&amp;#8217;m taking in the coming months as we roll towards implementing &lt;a href=&quot;https://blueprints.launchpad.net/drizzle/+spec/replication-log-shipping&quot;&gt;Log Shipping in Drizzle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, how did it come about that I started working on the storage engine API?&lt;/p&gt;
&lt;h3&gt;From Commands to Transactions&lt;/h3&gt;
&lt;p&gt;Well, it really goes back to my work on Drizzle&amp;#8217;s replication system.  I had implemented a simple, fast, and extensible log which stored records of the data changes made to a server.  Originally, the log was called the Command Log, because the Google Protobuffer messages it contained were called &lt;tt&gt;&lt;a href=&quot;http://www.joinfu.com/2009/08/drizzle-replication-the-command-message/&quot;&gt;message::Command&lt;/a&gt;&lt;/tt&gt;s.  The API  for implementing replication plugins was very simple and within a month or so of debuting the API, quite a few replication plugins had been built, including one replicating to Memcached, a prototype one replicating to Gearman, and a filtering replicator plugin.&lt;/p&gt;
&lt;p&gt;In addition, &lt;a href=&quot;http://developian.blogspot.com&quot;&gt;Marcus Eriksson&lt;/a&gt; had created the &lt;a href=&quot;http://www.rabbitreplication.org/&quot;&gt;RabbitReplication&lt;/a&gt; project which could replicate from Drizzle to other data stores, including Cassandra and Project Valdemort.  However, Marcus did not actually implement any C/C++ plugins using the Drizzle replication API.  Instead, RabbitReplication simply read the new Command Log, which due to it simply being a file full of Google Protobuffer messages, was quick and easy to read into memory using a variety of different programming languages.  RabbitReplication is written in Java, and it was great to see other programming languages be able to read Drizzle&amp;#8217;s replication log so easily.  Marcus &lt;a href=&quot;http://developian.blogspot.com/2010/01/replicating-transactions-directly-to.html&quot; alt=&quot;Replicate Drizzle to RabbitMQ&quot;&gt;later coded up&lt;/a&gt; a C++ TransactionApplier plugin which replaces the Drizzle replication log and instead replicates the GPB messages directly to RabbitMQ.&lt;/p&gt;
&lt;p&gt;And there, you&amp;#8217;ll note that one of the plugins involved in Drizzle&amp;#8217;s replication system is called &lt;em&gt;Transaction&lt;/em&gt;Applier.  It used to be called CommandApplier. That was because the GPB Command messages were individual row change events for the most part.  However, I made a series of changes to the replication API and now the GPB messages sent through the APIs are of class &lt;tt&gt;&lt;a href=&quot;http://www.joinfu.com/2009/10/drizzle-replication-changes-in-api-to-support-group-commit/&quot;&gt;message::Transaction&lt;/a&gt;&lt;/tt&gt;.  &lt;tt&gt;message::Transaction&lt;/tt&gt; objects contain a transaction context, with information about the transaction&amp;#8217;s start and end time, it&amp;#8217;s transaction identifer, along with a series of &lt;tt&gt;message::Statement objects&lt;/tt&gt;, each of which representing a part of the data changes that the SQL transaction made.&lt;/p&gt;
&lt;p&gt;Thus, the Command Log now turned into the Transaction Log, and everywhere the term Command was used now was replaced with the terms Transaction and Statement (depending on whether you were talking about the entire Transaction or a piece of it).  Log entries were now written at COMMIT to the Transaction Log and were not written if no COMMIT occurred&lt;sup&gt;1&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;After finishing this work to make the transaction log write Transaction messages at commit time, I was keen to begin coding up the publisher and subscriber plugins which represent a node in the replication environment.  However, Brian had asked me to delay working on other replication features and ensure that the replication API could support fully distributed transactions via the X/Open XA distributed transaction protocol.  XA support had been removed from Drizzle when the MySQL binlog and original replication system was ripped out and needed some TLC.  Fair enough, I said.  So, off I went to work on XA.&lt;/p&gt;
&lt;h3&gt;If Only It Were Simple&amp;#8230;&lt;/h3&gt;
&lt;p&gt;As anyone who has worked on the MySQL source code or developed storage engines for MySQL knows, working with the MySQL pluggable storage engine API is sometimes not the easiest or most straightforward thing.  I think the biggest problem with the MySQL storage engine API is that, due to understandable historical reasons, it&amp;#8217;s an API that was designed with the MyISAM and HEAP storage engines in mind.  Much of the transactional pieces of the API seem to be a bolted-on afterthought and can be very confusing to work with.&lt;/p&gt;
&lt;p&gt;As an example, &lt;a href=&quot;http://pbxt.blogspot.com/&quot;&gt;Paul McCullagh&lt;/a&gt;, developer of the transactional storage engine &lt;a href=&quot;http://www.primebase.org/&quot;&gt;PBXT&lt;/a&gt;, recently &lt;a href=&quot;http://lists.mysql.com/internals/37662&quot;&gt;emailed&lt;/a&gt; the mysql internals mailing list asking how the storage engine could tell when a SQL statement started and ended.  You would think that such a seemingly basic functionality would have a simple answer.  You&amp;#8217;d be wrong.  &lt;a href=&quot;http://monty-says.blogspot.com&quot;&gt;Monty Widenius&lt;/a&gt; &lt;a href=&quot;http://lists.mysql.com/internals/37675&quot;&gt;answered&lt;/a&gt; like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Why not simply have a counter in your transaction object for how start_stmt &amp;#8211; reset();  When this is 0 then you know stmnt ended.&lt;/p&gt;
&lt;p&gt;In Maria we count number of calls to external_lock() and when the sum goes to 0 we know the transaction has ended.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To this, &lt;a href=&quot;http://mysqlha.blogspot.com/&quot;&gt;Mark Callaghan&lt;/a&gt; responded:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Why does the solution need to be so obscure?
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Monty &lt;a href=&quot;http://lists.mysql.com/internals/37689&quot;&gt;answered&lt;/a&gt; (emphasis mine):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Historic reasons.&lt;/p&gt;
&lt;p&gt;MySQL never kept a count of which handlers are used by a transaction, only which tables.&lt;/p&gt;
&lt;p&gt;So the original logic was that external_lock(lock/unlock) is called for each usage of the table, which is normally more than enough information for a handler to know when a statement starts/ends.&lt;/p&gt;
&lt;p&gt;The one case this didn&amp;#8217;t work was in the case someone does lock tables as then external_lock is not called per statement. It was to satisfy this case that we added a call to start_stmt() for each table.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;#8217;s of course possible to change things so that start_stmt() / end_stmt() would be called once per used handler, but this would be yet another overhead for the upper level to do which the current handlers that tracks call to external_lock() doesn&amp;#8217;t need.&lt;/strong&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, in Drizzle-land, we aren&amp;#8217;t beholden to &amp;#8220;historic reasons&amp;#8221; &lt;img src=&quot;http://www.joinfu.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;   So, after looking through the in-need-of-attention transaction processing code in the kernel, I decided that I would clean up the API so that storage engines did not have to jump through hoops to notify the kernel they participate in a transaction or just to figure out when a statement and a transaction started and ended.&lt;/p&gt;
&lt;p&gt;The resulting changes to the API are quite dramatic I think, but I&amp;#8217;ll leave it to the storage engine developers to tell me if the changes are good or not.  The following is a summary of the changes to the storage engine API that I committed in the last few weeks.&lt;/p&gt;
&lt;h3&gt;&lt;tt&gt;plugin::StorageEngine&lt;/tt&gt; Split Into Subclasses&lt;/h3&gt;
&lt;p&gt;The very first thing I did was to split the enormous base plugin class for a storage engine, &lt;tt&gt;plugin::StorageEngine&lt;/tt&gt;, into two other subclasses containing transactional elements.  &lt;tt&gt;plugin::TransactionalStorageEngine&lt;/tt&gt; is now the base class for all storage engines which implement SQL transactions:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;/**
 * A type of storage engine which supports SQL transactions.
 *
 * This class adds the SQL transactional API to the regular
 * storage engine.  In other words, it adds support for the
 * following SQL statements:
 *
 * START TRANSACTION;
 * COMMIT;
 * ROLLBACK;
 * ROLLBACK TO SAVEPOINT;
 * SET SAVEPOINT;
 * RELEASE SAVEPOINT;
 */&lt;/span&gt;
&lt;span&gt;class&lt;/span&gt; TransactionalStorageEngine &lt;span&gt;:&lt;/span&gt;&lt;span&gt;public&lt;/span&gt; StorageEngine
&lt;span&gt;&amp;#123;&lt;/span&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
  TransactionalStorageEngine&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt; name_arg,
                             &lt;span&gt;const&lt;/span&gt; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;bitset&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;HTON_BIT_SIZE&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;flags_arg&lt;span&gt;=&lt;/span&gt; HTON_NO_FLAGS&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;virtual&lt;/span&gt; ~TransactionalStorageEngine&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
...
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
  &lt;span&gt;void&lt;/span&gt; setTransactionReadWrite&lt;span&gt;&amp;#40;&lt;/span&gt;Session&lt;span&gt;&amp;amp;&lt;/span&gt; session&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;/*
   * Indicates to a storage engine the start of a
   * new SQL transaction.  This is called ONLY in the following
   * scenarios:
   *
   * 1) An explicit BEGIN WORK/START TRANSACTION is called
   * 2) After an explicit COMMIT AND CHAIN is called
   * 3) After an explicit ROLLBACK AND RELEASE is called
   * 4) When in AUTOCOMMIT mode and directly before a new
   *    SQL statement is started.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doStartTransaction&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, start_transaction_option_t options&lt;span&gt;&amp;#41;&lt;/span&gt;
  &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; session&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; options&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;/**
   * Implementing classes should override these to provide savepoint
   * functionality.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doSetSavepoint&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, NamedSavepoint &lt;span&gt;&amp;amp;&lt;/span&gt;savepoint&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doRollbackToSavepoint&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, NamedSavepoint &lt;span&gt;&amp;amp;&lt;/span&gt;savepoint&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doReleaseSavepoint&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, NamedSavepoint &lt;span&gt;&amp;amp;&lt;/span&gt;savepoint&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;/**
   * Commits either the &amp;quot;statement transaction&amp;quot; or the &amp;quot;normal transaction&amp;quot;.
   *
   * @param[in] The Session
   * @param[in] true if it's a real commit, that makes persistent changes
   *            false if it's not in fact a commit but an end of the
   *            statement that is part of the transaction.
   * @note
   *
   * 'normal_transaction' is also false in auto-commit mode where 'end of statement'
   * and 'real commit' mean the same event.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doCommit&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, &lt;span&gt;bool&lt;/span&gt; normal_transaction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;/**
   * Rolls back either the &amp;quot;statement transaction&amp;quot; or the &amp;quot;normal transaction&amp;quot;.
   *
   * @param[in] The Session
   * @param[in] true if it's a real commit, that makes persistent changes
   *            false if it's not in fact a commit but an end of the
   *            statement that is part of the transaction.
   * @note
   *
   * 'normal_transaction' is also false in auto-commit mode where 'end of statement'
   * and 'real commit' mean the same event.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doRollback&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, &lt;span&gt;bool&lt;/span&gt; normal_transaction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doReleaseTemporaryLatches&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session&lt;span&gt;&amp;#41;&lt;/span&gt;
  &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; session&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doStartConsistentSnapshot&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session&lt;span&gt;&amp;#41;&lt;/span&gt;
  &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; session&lt;span&gt;;&lt;/span&gt;
    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you can see, &lt;tt&gt;plugin::TransactionalStorageEngine&lt;/tt&gt; inherits from &lt;tt&gt;plugin::StorageEngine&lt;/tt&gt; and extends it with a series of private pure virtual methods that implement the SQL transaction parts of a query &amp;mdash; doCommit(), doRollback(), etc.  Implementing classes simply inherit from &lt;tt&gt;plugin::TransactionalStorageEngine&lt;/tt&gt; and implement their internal transaction processing in these private methods.&lt;/p&gt;
&lt;p&gt;In addition to the SQL transaction, however, is the concept of an XA transaction, which is for distributed transaction coordination.  The &lt;a href=&quot;http://en.wikipedia.org/wiki/X/Open_XA&quot;&gt;XA protocol&lt;/a&gt; is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Two-phase_commit&quot;&gt;two-phase commit protocol&lt;/a&gt; because it implements a PREPARE step before a COMMIT occurs.  This XA API is exposed via two other classes, &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; and &lt;tt&gt;plugin::XaStorageEngine&lt;/tt&gt;.  &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; derived classes implement the resource manager API of the XA protocol.  &lt;tt&gt;plugin::XaStorageEngine&lt;/tt&gt; is a storage engine subclass which, while also implementing SQL transactions, also implements XA transactions.&lt;/p&gt;
&lt;p&gt;Here is the &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; class:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;/**
 * An abstract interface class which exposes the participation
 * of implementing classes in distributed transactions in the XA protocol.
 */&lt;/span&gt;
&lt;span&gt;class&lt;/span&gt; XaResourceManager
&lt;span&gt;&amp;#123;&lt;/span&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
  XaResourceManager&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; ~XaResourceManager&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
...
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
  &lt;span&gt;/**
   * Does the COMMIT stage of the two-phase commit.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaCommit&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, &lt;span&gt;bool&lt;/span&gt; normal_transaction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;/**
   * Does the ROLLBACK stage of the two-phase commit.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaRollback&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, &lt;span&gt;bool&lt;/span&gt; normal_transaction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;/**
   * Does the PREPARE stage of the two-phase commit.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaPrepare&lt;span&gt;&amp;#40;&lt;/span&gt;Session &lt;span&gt;*&lt;/span&gt;session, &lt;span&gt;bool&lt;/span&gt; normal_transaction&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;/**
   * Rolls back a transaction identified by a XID.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaRollbackXid&lt;span&gt;&amp;#40;&lt;/span&gt;XID &lt;span&gt;*&lt;/span&gt;xid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;/**
   * Commits a transaction identified by a XID.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaCommitXid&lt;span&gt;&amp;#40;&lt;/span&gt;XID &lt;span&gt;*&lt;/span&gt;xid&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;/**
   * Notifies the transaction manager of any transactions
   * which had been marked prepared but not committed at
   * crash time or that have been heurtistically completed
   * by the storage engine.
   *
   * @param[out] Reference to a vector of XIDs to add to
   *
   * @retval
   *  Returns the number of transactions left to recover
   *  for this engine.
   */&lt;/span&gt;
  &lt;span&gt;virtual&lt;/span&gt; &lt;span&gt;int&lt;/span&gt; doXaRecover&lt;span&gt;&amp;#40;&lt;/span&gt;XID &lt;span&gt;*&lt;/span&gt; append_to, &lt;span&gt;size_t&lt;/span&gt; len&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and here is the &lt;tt&gt;plugin::XaStorageEngine&lt;/tt&gt; class:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot;&gt;&lt;span&gt;/**
 * A type of storage engine which supports distributed
 * transactions in the XA protocol.
 */&lt;/span&gt;
&lt;span&gt;class&lt;/span&gt; XaStorageEngine &lt;span&gt;:&lt;/span&gt;&lt;span&gt;public&lt;/span&gt; TransactionalStorageEngine,
                       &lt;span&gt;public&lt;/span&gt; XaResourceManager
&lt;span&gt;&amp;#123;&lt;/span&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
  XaStorageEngine&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt; name_arg,
                  &lt;span&gt;const&lt;/span&gt; std&lt;span&gt;::&lt;/span&gt;&lt;span&gt;bitset&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;HTON_BIT_SIZE&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;flags_arg&lt;span&gt;=&lt;/span&gt; HTON_NO_FLAGS&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span&gt;virtual&lt;/span&gt; ~XaStorageEngine&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  ...
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pretty clear.  A &lt;tt&gt;plugin::XaStorageEngine&lt;/tt&gt; inherits from both &lt;tt&gt;plugin::TransactionStorageEngine&lt;/tt&gt; and &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; because it implements both SQL transactions and XA transactions.  The &lt;tt&gt;InnobaseEngine&lt;/tt&gt; is a plugin which inherits from &lt;tt&gt;plugin::XaStorageEngine&lt;/tt&gt; because InnoDB supports SQL transactions as well as XA.&lt;/p&gt;
&lt;h3&gt;Explicit Statement and Transaction Boundaries&lt;/h3&gt;
&lt;p&gt;The second major change I made addressed the problem that Mark Callaghan noted in asking why finding out when a statement starts and ends was so obscure.  I added two new methods to &lt;tt&gt;plugin::StorageEngine&lt;/tt&gt; called &lt;tt&gt;doStartStatement()&lt;/tt&gt; and &lt;tt&gt;doEndStatement()&lt;/tt&gt;.  The kernel now explicitly tells storage engines when a SQL statement starts and ends.  This happens before any calls to &lt;tt&gt;Cursor::external_lock()&lt;/tt&gt; happen, and there are no exception cases.  In addition, the kernel now always tells transactional storage engines when a new SQL transaction is starting.  It does this via an explicit call to &lt;tt&gt;plugin::TransactionalStorageEngine::doStartTransaction()&lt;/tt&gt;.  No exceptions, and yes, even for DDL operations.&lt;/p&gt;
&lt;p&gt;What this means is that for a transactional storage engine, it no longer needs to &amp;#8220;count the calls to Cursor::external_lock()&amp;#8221; in order to know when a statement or transaction starts and ends.  For a SQL transaction, this means that there is a clear code call path and there is no need for the storage engine to track whether the session is in AUTOCOMMIT mode or not.  The kernel does all that work for the storage engine.  Imagine a Session executes a single INSERT statement against an InnoDB table while in AUTOCOMMIT mode.  This is what the call path looks like:&lt;/p&gt;
&lt;pre&gt;
 drizzled::Statement::Insert::execute()
 |
 -&gt; drizzled::mysql_lock_tables()
    |
    -&gt; drizzled::TransactionServices::registerResourceForTransaction()
       |
       -&gt; drizzled::plugin::TransactionalStorageEngine::startTransaction()
          |
          -&gt; InnobaseEngine::doStartTransaction()
       |
       -&gt; drizzled::plugin::StorageEngine::startStatement()
          |
          -&gt; InnobaseEngine::doStartStatement()
       |
       -&gt; drizzled::plugin::StorageEngine::getCursor()
          |
          -&gt; drizzled::Cursor::write_row()
             |
             -&gt; InnobaseCursor::write_row()
       |
       -&gt; drizzled::TransactionServices::autocommitOrRollback()
          |
          -&gt; drizzled::plugin::TransactionStorageEngine::commit()
             |
             -&gt; InnobaseEngine::doCommit()
&lt;/pre&gt;
&lt;p&gt;I think this will come as a welcome change to storage engine developers working with Drizzle.&lt;/p&gt;
&lt;h3&gt;No More Need for Engine to Call &lt;tt&gt;trans_register_ha()&lt;/tt&gt;&lt;/h3&gt;
&lt;p&gt;There was an interesting comment in the &lt;a href=&quot;http://bazaar.launchpad.net/~mysql/mysql-server/mysql-next-mr/annotate/head%3A/sql/handler.cc&quot;&gt;original documentation&lt;/a&gt; for the transaction processing code.  It read:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
  Roles and responsibilities&lt;br /&gt;
  &amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;&lt;/p&gt;
&lt;p&gt;  The server has no way to know that an engine participates in&lt;br /&gt;
  the statement and a transaction has been started&lt;br /&gt;
  in it unless the engine says so. Thus, in order to be&lt;br /&gt;
  a part of a transaction, the engine must &amp;#8220;register&amp;#8221; itself.&lt;br /&gt;
  This is done by invoking trans_register_ha() server call.&lt;br /&gt;
  Normally the engine registers itself whenever handler::external_lock()&lt;br /&gt;
  is called. trans_register_ha() can be invoked many times: if&lt;br /&gt;
  an engine is already registered, the call does nothing.&lt;br /&gt;
  In case autocommit is not set, the engine must register itself&lt;br /&gt;
  twice &amp;#8212; both in the statement list and in the normal transaction&lt;br /&gt;
  list.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That comment, and I&amp;#8217;ve read it dozens of times, always seemed strange to me.  I mean, does the server &lt;em&gt;really not know&lt;/em&gt; that an engine participates in a statement or transaction unless the engine tells it?  Of course not.&lt;/p&gt;
&lt;p&gt;So, I removed the need for a storage engine to &amp;#8220;register itself&amp;#8221; with the kernel.  Now, the transaction manager inside the Drizzle kernel (implemented in the TransactionServices component) automatically monitors which engines are participating in an SQL transaction and the engine doesn&amp;#8217;t need to do anything to register itself.&lt;/p&gt;
&lt;p&gt;In addition, due to the break-up of the &lt;tt&gt;plugin::StorageEngine&lt;/tt&gt; class and the XA API into &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt;, Drizzle&amp;#8217;s transaction manager can now coordinate XA transactions from &lt;em&gt;plugins other than storage engines&lt;/em&gt;.  Yep, that&amp;#8217;s right.  Any plugin which implements &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; can participate in an XA transaction and Drizzle will act as the transaction manager.  What&amp;#8217;s the first plugin that will do this?  Drizzle&amp;#8217;s transaction log.  The transaction log isn&amp;#8217;t a storage engine, but it &lt;em&gt;is&lt;/em&gt; able to participate in an XA transaction, so it will implement &lt;tt&gt;plugin::XaResourceManager&lt;/tt&gt; but not &lt;tt&gt;plugin::StorageEngine&lt;/tt&gt;.&lt;/p&gt;
&lt;h3&gt;Performance Impact of Code Changes&lt;/h3&gt;
&lt;p&gt;So, that &amp;#8220;yet another overhead&amp;#8221; Monty talked about in the quote above?  There wasn&amp;#8217;t any noticeable impact in performance or scalability at all.  So much for optimize-first coding.&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s Next?&lt;/h3&gt;
&lt;p&gt;The next thing I&amp;#8217;m working on is removing the notion of the &amp;#8220;statement transaction&amp;#8221;, which is also a historical by-product, this time because of BerkeleyDB.  Gee, I&amp;#8217;ve got a lot of work ahead of me&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;[1]&lt;/sup&gt; Actually, there is a way that a transaction that was rolled back can get written to the transaction log.  For bulk operations, the server can cut a Transaction message into multiple segments, and if the SQL transaction is rolled back, a special RollbackStatement message is written to the transaction log.&lt;/p&gt;</description>
	<pubDate>Sat, 13 Mar 2010 07:07:59 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: Understanding Drizzle user authentication options  Part 1</title>
	<guid>http://ronaldbradford.com/blog/?p=1976</guid>
	<link>http://ronaldbradford.com/blog/understanding-drizzle-authentication-options-part-1-2010-03-12/</link>
	<description>&lt;p&gt;A key differentiator in &lt;a href=&quot;http://drizzle.org&quot;&gt;Drizzle&lt;/a&gt; from it&amp;#8217;s original &lt;a href=&quot;http://mysql.com&quot;&gt;MySQL&lt;/a&gt; roots is user based authentication.  Gone is the host/user and schema/table/column model that was stored in the MyISAM based mysql.user table.&lt;/p&gt;
&lt;p&gt;Authentication is now completely pluggable, leveraging existing systems such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Pluggable_Authentication_Modules&quot;&gt;PAM&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/LDAP&quot;&gt;LDAP&lt;/a&gt; via PAM and &lt;a href=&quot;http://en.wikipedia.org/wiki/Basic_access_authentication&quot;&gt;Http authentication&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post I&amp;#8217;ll talk about &lt;b&gt;PAM authentication&lt;/b&gt; which is effectively your current Linux based user security.&lt;/p&gt;
&lt;p&gt;This information is based on the current &lt;a href=&quot;http://blog.drizzle.org/2010/03/02/drizzle-build-1317-source-tarball-has-been-released/&quot;&gt;build 1317&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Compiling for PAM support&lt;/h3&gt;
&lt;p&gt;Your Drizzle environment needs to be compiled with PAM support. You would have received the following warning during a configure.&lt;/p&gt;
&lt;pre&gt;
$ ./configure
...
checking for libpam... no
configure: WARNING: Couldn't find PAM development support, pam_auth will not be built. On Debian, libpam is in libpam0g-dev. On RedHat it's in pam-devel.
&lt;/pre&gt;
&lt;p&gt;The solution is provided in the warning message which is another great thing about Drizzle. The pre checks for dependencies and the optional messages like these far exceed the MySQL equivalent compilation process.  In my case:&lt;/p&gt;
&lt;pre&gt;
$ sudo yum install pam-devel
&lt;/pre&gt;
&lt;p&gt;When correctly configured, it should look like:&lt;/p&gt;
&lt;pre&gt;
checking for libpam... yes
checking how to link with libpam... -lpam
&lt;/pre&gt;
&lt;h3&gt;Working with PAM&lt;/h3&gt;
&lt;p&gt;You need to enable the PAM authentication plugin at drizzled startup.&lt;/p&gt;
&lt;pre&gt;
sbin/drizzled --plugin_add=auth_pam &amp;#038;
&lt;/pre&gt;
&lt;p&gt;Unfortunately connecting fails to work with &lt;/p&gt;
&lt;pre&gt;
time sbin/drizzle --user=testuser --password=***** --port=4427
real 0m0.003s
user 0m0.003s
sys 0m0.001s
&lt;/pre&gt;
&lt;p&gt;A look into the source at src/drizzle-2010.03.1317/plugin/auth_pam/auth_pam.cc shows a needed config file&lt;/p&gt;
&lt;pre&gt;
117     retval= pam_start(&quot;check_user&quot;, userinfo.name, &amp;#038;conv_info, &amp;#038;pamh);
&lt;/pre&gt;
&lt;h4&gt;Configuring PAM&lt;/h4&gt;
&lt;p&gt;In order to enable PAM with Drizzle you need to have the following system configuration.&lt;/p&gt;
&lt;pre&gt;
$ cat /etc/pam.d/check_user
auth    required        pam_unix.so
account required        pam_unix.so

$ time sbin/drizzle --user=testuser --password=***** --port=4427
ERROR 1045 (28000): Access denied for user 'testuser'@'127.0.0.1' (using password: YES)

real 0m2.055s
user 0m0.002s
sys 0m0.002s
&lt;/pre&gt;
&lt;p&gt;This did some validation but still failed.&lt;/p&gt;
&lt;p&gt;It seems &lt;a href=&quot;https://bugs.launchpad.net/drizzle/+bug/484069&quot;&gt;Bug #484069&lt;/a&gt; may fix this problem, however this is not currently in the main line!&lt;/p&gt;
&lt;p&gt;Stay Tuned!&lt;/p&gt;
&lt;p&gt;&lt;!--&lt;br /&gt;
You first need to ensure the pam plugin is active by checking the data dictionary plugin table.&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; select * from data_dictionary.plugins where plugin_name=&amp;#8217;pam&amp;#8217;;
+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+
| PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_AUTHOR | PLUGIN_DESCRIPTION       | PLUGIN_LICENSE |
+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+
| pam         | 0.1            | ACTIVE        | Brian Aker    | PAM based authenication. | GPL            |
+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;-+
1 row in set (0 sec)
&lt;/pre&gt;
&lt;p&gt;--&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 12 Mar 2010 22:46:09 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: Understanding Drizzle user authentication options  Part 2</title>
	<guid>http://ronaldbradford.com/blog/?p=2639</guid>
	<link>http://ronaldbradford.com/blog/understanding-drizzle-user-authentication-options-part-2010-03-12/</link>
	<description>&lt;p&gt;A key differentiator in &lt;a href=&quot;http://drizzle.org&quot;&gt;Drizzle&lt;/a&gt; from it&amp;#8217;s original &lt;a href=&quot;http://mysql.com&quot;&gt;MySQL&lt;/a&gt; roots is user based authentication.  Gone is the host/user and schema/table/column model that was stored in the MyISAM based mysql.user table.&lt;/p&gt;
&lt;p&gt;Authentication is now completely pluggable, leveraging existing systems such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Pluggable_Authentication_Modules&quot;&gt;PAM&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/LDAP&quot;&gt;LDAP&lt;/a&gt; via PAM and &lt;a href=&quot;http://en.wikipedia.org/wiki/Basic_access_authentication&quot;&gt;Http authentication&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post I&amp;#8217;ll talk about &lt;b&gt;HTTP authentication&lt;/b&gt; which requires an external http server to implement successfully.  You can look at &lt;a href=&quot;http://ronaldbradford.com/blog/understanding-drizzle-authentication-options-part-1-2010-03-12/&quot;&gt;Part 1&lt;/a&gt; for PAM authentication.&lt;/p&gt;
&lt;h4&gt;Compiling for http auth support&lt;/h4&gt;
&lt;p&gt;By default during compilation you may find.&lt;/p&gt;
&lt;pre&gt;
checking for libcurl... no
configure: WARNING: libcurl development lib not found: not building auth_http plugin. On Debian this is found in libcurl4-gnutls-dev. On RedHat it's in libcurl-devel.
&lt;/pre&gt;
&lt;p&gt;In my case I needed:&lt;/p&gt;
&lt;pre&gt;
$ sudo yum install curl-devel
&lt;/pre&gt;
&lt;p&gt;NOTE: &lt;a href=&quot;https://bugs.launchpad.net/drizzle/+bug/527255&quot;&gt;Bug #527255&lt;/a&gt; talks about issues of the message being incorrect for libcurl-devel however this appears it may be valid in Fedora Installs&lt;/p&gt;
&lt;p&gt;After successfully installing the necessary pre-requisite you should see.&lt;/p&gt;
&lt;pre&gt;
checking for libcurl... yes
checking how to link with libcurl... -lcurl
checking if libcurl has CURLOPT_USERNAME... no
&lt;/pre&gt;
&lt;h3&gt;HTTP Authentication&lt;/h3&gt;
&lt;p&gt;We need to enable the plugin at server startup.&lt;/p&gt;
&lt;pre&gt;
$ sbin/drizzled --mysql-protocol-port=3399 --plugin_add=auth_http &amp;#038;
&lt;/pre&gt;
&lt;p&gt;You need to ensure the auth_http plugin is active by checking the data dictionary plugin table.&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; select * from data_dictionary.plugins where plugin_name='auth_http';
+-------------+----------------+-----------+-------------+
| PLUGIN_NAME | PLUGIN_TYPE    | IS_ACTIVE | MODULE_NAME |
+-------------+----------------+-----------+-------------+
| auth_http   | Authentication | TRUE      |             |
+-------------+----------------+-----------+-------------+
&lt;/pre&gt;
&lt;p&gt;The auth_http plugin also has the following system variables.&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; SHOW GLOBAL VARIABLES LIKE '%http%';
+------------------+-------------------+
| Variable_name    | Value             |
+------------------+-------------------+
| auth_http_enable | OFF               |
| auth_http_url    | http://localhost/ |
+------------------+-------------------+
2 rows in set (0 sec)
&lt;/pre&gt;
&lt;p&gt;In order to configure Http authentication, you need to have the following settings added to your drizzled.cnf file. For example:&lt;/p&gt;
&lt;pre&gt;
$ cat etc/drizzled.cnf
[drizzled]
auth_http_enable=TRUE
auth_http_url=http://thedrizzler.com/auth
&lt;/pre&gt;
&lt;p&gt;NOTE: Replace the domain name with something you have, even localhost.&lt;/p&gt;
&lt;p&gt;A Drizzle restart gives us&lt;/p&gt;
&lt;pre&gt;
$ bin/drizzle -e &quot;SHOW GLOBAL VARIABLES LIKE 'auth_http%'&quot;
+------------------+-----------------------------+
| Variable_name    | Value                       |
+------------------+-----------------------------+
| auth_http_enable | ON                          |
| auth_http_url    | http://thedrizzler.com/auth |
+------------------+-----------------------------+
&lt;/pre&gt;
&lt;p&gt;By default, currently if the settings result in an invalid url, then account validation does not fail and you can still login.  It is recommended that you always configure pam authentication as well as a fall back.&lt;/p&gt;
&lt;pre&gt;
$ wget -O tmp http://thedrizzler.com/auth
--17:32:32--  http://thedrizzler.com/auth
Resolving thedrizzler.com... 208.43.73.220
Connecting to thedrizzler.com|208.43.73.220|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
17:32:32 ERROR 404: Not Found.

$ bin/drizzle
drizzle &gt; exit
&lt;/pre&gt;
&lt;h3&gt;Configuring passwords&lt;/h3&gt;
&lt;p&gt;To correctly configured your web server to perform the HTTP auth, you can use this Apache syntax as an example.&lt;/p&gt;
&lt;p&gt;The following is added to the VirtualHost entry in your web browser.&lt;/p&gt;
&lt;pre&gt;
&amp;lt;Directory /var/www/drizzle/auth&gt;
AllowOverride FileInfo All AuthConfig
AuthType Basic
AuthName &quot;Drizzle Access Only&quot;
AuthUserFile /home/drizzle/.authentication
Require valid-user
&amp;lt;/Directory&gt;
&lt;/pre&gt;
&lt;pre&gt;
$ sudo su -
$ mkdir /var/www/drizzle/auth
$ touch /var/www/drizzle/auth/index.htm
$ apachectl graceful
&lt;/pre&gt;
&lt;p&gt;We check we now need permissions for the URL.&lt;/p&gt;
&lt;pre&gt;
$ wget -O tmp http://thedrizzler.com/auth
--17:35:48--  http://thedrizzler.com/auth
Resolving thedrizzler.com... 208.43.73.220
Connecting to thedrizzler.com|208.43.73.220|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Authorization failed.
&lt;/pre&gt;
&lt;p&gt;You need to create the username/password for access.&lt;/p&gt;
&lt;pre&gt;
$ htpasswd -cb /home/drizzle/.authentication testuser sakila
$ cat /home/drizzle/.authentication
testuser:85/7CbdeVql4E
&lt;/pre&gt;
&lt;p&gt;Confirm that the http auth with correct user/password works.&lt;/p&gt;
&lt;pre&gt;
$ wget -O tmp http://thedrizzler.com/auth --user=testuser --password=sakila
--17:37:45--  http://thedrizzler.com/auth
Resolving thedrizzler.com... 208.43.73.220
Connecting to thedrizzler.com|208.43.73.220|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
&lt;/pre&gt;
&lt;h3&gt;Drizzle HTTP Authentication in action&lt;/h3&gt;
&lt;p&gt;By default we now can&amp;#8217;t login&lt;/p&gt;
&lt;pre&gt;
$ bin/drizzle
ERROR 1045 (28000): Access denied for user ''@'127.0.0.1' (using password: NO)
&lt;/pre&gt;
&lt;pre&gt;
$ bin/drizzle --user=testuser --password=sakila999
ERROR 1045 (28000): Access denied for user 'testuser'@'127.0.0.1' (using password: YES)

$ bin/drizzle --user=testuser --password=sakila
Welcome to the Drizzle client..  Commands end with ; or \g.
Your Drizzle connection id is 6
Server version: 7 Source distribution (trunk)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

drizzle&gt;
&lt;/pre&gt;</description>
	<pubDate>Fri, 12 Mar 2010 22:45:26 +0000</pubDate>
</item>
<item>
	<title>Stephen O'Grady: The View from NoSQL Live: Three Takeaways</title>
	<guid>http://redmonk.com/sogrady/?p=3511</guid>
	<link>http://feedproxy.google.com/~r/tecosystems/~3/io1DTLNdQKA/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fredmonk.com%2Fsogrady%2F2010%2F03%2F12%2Fnosql-live%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fredmonk.com%2Fsogrady%2F2010%2F03%2F12%2Fnosql-live%2F&amp;amp;source=sogrady&amp;amp;style=compact&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;div id=&quot;__ss_3398507&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/timanglade/crossroads-inroads-pitfalls-bylaws&quot; title=&quot;Crossroads, Inroads, Pitfalls &amp;amp; Bylaws&quot;&gt;Crossroads, Inroads, Pitfalls &amp;amp; Bylaws&lt;/a&gt;&lt;/strong&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/timanglade&quot;&gt;Tim Anglade&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NoSQL Live was a very different show than I&amp;#8217;ve been to in recent months. It had very little in common with, for example, &lt;a href=&quot;http://redmonk.com/sogrady/2009/10/02/hadoopworld/&quot;&gt;HadoopWorld&lt;/a&gt;, where the audience was largely already intimately familiar with the technology and value proposition. The NoSQL Live audience, by contrast, to judge from the questions, was mostly there to learn. With many of the usual suspects from the NoSQL world in attendance, along with substantial representation from projects like Cassandra, HBase, memcache, Riak, Voldemort and so on, the show certainly did not lack for subject matter expertise. &lt;/p&gt;
&lt;p&gt;But the number of those generally unfamiliar with NoSQL was as surprising as it was gratifying. Gratifying because it serves as a proxy for interest: besides the experts, there were a substantial number of people there looking to get up to speed on the space. Which they certainly had an opportunity to do. &lt;/p&gt;
&lt;p&gt;Adam Marcus, a graduate student at MIT&amp;#8217;s Computer Science and Artificial Intelligence Laboratory, did a much better job that I could have taking notes on the show &lt;a href=&quot;http://blog.marcua.net/post/442594842/notes-from-nosql-live-boston-2010&quot;&gt;here&lt;/a&gt;, so I won&amp;#8217;t rehash that. Instead, three quick takeaways from the show. &lt;/p&gt;
&lt;h2&gt;The NoSQL Term is a Problem&lt;/h2&gt;
&lt;p&gt;In his remarks to open the show, Dwight Merriman &amp;#8211; the CEO at 10gen (the company behind MongoDB) &amp;#8211; asserted that while the term &amp;#8220;NoSQL&amp;#8221; had problems, for better or for worse, the name had stuck. Which might indeed be true, and if so the projects may as well make the best of the situation, as he suggested. But if that&amp;#8217;s true, the so-called NoSQL projects &amp;#8211; all of them &amp;#8211; are going to have problems. &lt;/p&gt;
&lt;p&gt;Witness Merriman&amp;#8217;s definition of NoSQL: no joins and light transactional semantics. Even were we to accept that definition &amp;#8211; and even that is problematic as the support varies from project to project &amp;#8211; we still have issues. Clearly column databases are differentiated from graph databases, just as both are differentiated from key value stores and document databases. &lt;/p&gt;
&lt;p&gt;Currently, however, they are all referred to &amp;#8211; marketed, even &amp;#8211; under the blanket NoSQL. Hence some of the confusion heard from users yesterday, who were struggling to grasp why all these NoSQL tools had seemingly nothing in common with one another. &lt;/p&gt;
&lt;p&gt;The good news is that there is &amp;#8211; as evidenced by this and other NoSQL events &amp;#8211; substantial interest and traction in data storage software that is not a relational database. The problem is that the naming is likely to become a serious problem if it isn&amp;#8217;t already. &lt;/p&gt;
&lt;p&gt;Consider slide 13 of Tim Anglade&amp;#8217;s excellent presentation embedded above. If he&amp;#8217;s correct, and we&amp;#8217;re just this side of the Gartner&amp;#8217;s trough of disillusionment &amp;#8211; and I believe that&amp;#8217;s a reasonable assertion &amp;#8211; the NoSQL term is going to be one of the reasons for the fall. Most of the current NoSQL adopters are sufficiently up to date on developments in the data persistence space that the name is not much of an issue. The next wave of adopters is guaranteed to be less familiar with the distinctions between the project approaches and more frustrated by the inherent educational challenges therein. &lt;/p&gt;
&lt;p&gt;I know quibbling over a name seems inane to a great many technologists out there, but you&amp;#8217;d be surprised at how much difference a name makes in this industry. Remember what the mere application of the term Ajax did to discussion of that technical approach? Now consider if Ajax had attempted to encompass that and native client side development. That&amp;#8217;s what NoSQL is doing at present, and it&amp;#8217;s a problem. &lt;/p&gt;
&lt;h2&gt;MySQL is a Target&lt;/h2&gt;
&lt;p&gt;Mark Callaghan recently &lt;a href=&quot;http://mysqlha.blogspot.com/2010/03/plays-well-with-others.html&quot;&gt;said&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I think that MySQL+memcached is still the default choice and I don&amp;#8217;t think it is going away in the high-scale market.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://oddments.org/&quot;&gt;Eric Day&lt;/a&gt;, Drizzle developer, likewise said that that project is complementary to many NoSQL efforts when I spoke to him on Monday. Clearly his new employer (and yes, more on that later) believes that, significantly contributing as it does to both NoSQL (Cassandra) and SQL (Drizzle) projects. &lt;/p&gt;
&lt;p&gt;I think they&amp;#8217;re right. The maturity of the MySQL ecosystem and its basic ubiquity will not easily be thrown over, if ever. That said, the commentary from Twitter&amp;#8217;s Ryan King was really eye-opening. &lt;/p&gt;
&lt;p&gt;It&amp;#8217;s no secret that Twitter has been moving slowly towards Cassandra and away from MySQL. This is from &lt;a href=&quot;http://nosql.mypopescu.com/post/407159447/cassandra-twitter-an-interview-with-ryan-king&quot;&gt;an interview&lt;/a&gt; that King did previously with myNoSQL, describing the motivations:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We have a lot of data, the growth factor in that data is huge and the rate of growth is accelerating.&lt;/p&gt;
&lt;p&gt;We have a system in place based on shared mysql + memcache but its quickly becoming prohibitively costly (in terms of manpower) to operate. We need a system that can grow in a more automated fashion and be highly available.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;After yesterday, we can add to that some numbers. Twitter&amp;#8217;s Cassandra infrastructure is at 45 nodes, which is handling &amp;#8211; in parallel with the MySQL/memcached infrastructure &amp;#8211; some 600/700 Tweets (i.e. writes) /second (&lt;a href=&quot;http://blog.twitter.com/2010/02/measuring-tweets.html&quot;&gt;50M/day&lt;/a&gt;) with massive spikes (like for SXSW, for example) and nine or ten billion rows. &lt;/p&gt;
&lt;p&gt;The MySQL infrastructure &amp;#8211; largely thanks to a massive memcached presence, according to what we heard yesterday &amp;#8211; was still handling this load. But much of the real pain comes apparently in manageability. The MySQL cluster could, in the words of King, &amp;#8220;never be taken down,&amp;#8221; as the restarts were too painful. The Cassandra nodes, meanwhile, are rebooted regularly with rolling restarts. &lt;/p&gt;
&lt;p&gt;What does this mean? Nothing, yet. Twitter is a traffic outlier than 99% of MySQL or NoSQL users will never see. But the number of higher traffic properties that are leaving MySQL based infrastructure for NoSQL alternatives is worth monitoring, just as was their original takeup of MySQL. &lt;/p&gt;
&lt;h2&gt;NoSQL and the Cloud&lt;/h2&gt;
&lt;p&gt;One of the panels yesterday was on the subject of NoSQL in the Cloud. The panelists were Benjamin Day (consultant with Azure experience), Jonathan Ellis (Rackspace, Cassandra lead), Adam Kocoloski (Cloudant, a CouchDB vendor), and Daniel Rinehart (Allurent, a startup using AWS&amp;#8217; SimpleDB). &lt;/p&gt;
&lt;p&gt;Predictably, opinions varied on the suitability of NoSQL technologies for the cloud. The vendors offering or leveraging NoSQL services in the cloud &amp;#8211; Allure/Cloudant/Rackspace &amp;#8211; were more or less positive on the concept. Ellis, meanwhile, was less enthusiastic, urging workload based deployment: elastic, transient needs to the cloud, general, sustained workloads to the datacenter. &lt;/p&gt;
&lt;p&gt;What I was surprised to hear little about, except from a questioner, is the question of operations. For many cloud users, questions of workload or the suitability for a given technology such as NoSQL to the cloud come second. The primary concern is operational costs, or the lackthereof. Put simply: the cloud takes important operational elements and makes them someone else&amp;#8217;s problem. This may be even more compelling with NoSQL, because the relative immaturity of the projects means that they are often suboptimally packaged. Being able to spin up a prebuilt image on AWS or Rackspace is likely to be significantly preferable to an alternative of hand assembling all of the necessary pieces of your NoSQL infrastructure. &lt;/p&gt;
&lt;p&gt;This is why I find services like Bradford Stephens&amp;#8217; &lt;a href=&quot;http://www.roadtofailure.com/2010/02/15/announcing-the-drawn-to-scale-platform/&quot;&gt;Drawn to Scale&lt;/a&gt; interesting (again, more on them later): being able to offload the operational costs &amp;#8211; both in dollars and learning curve &amp;#8211; of software that can more efficiently attack large or unstructured datasets is likely to be an interesting proposition. &lt;/p&gt;
&lt;p&gt;Whether NoSQL technologies are ideally suited to multi-tenant cloud environments, then, seems to be besides the point: they will be used there &amp;#8211; heavily &amp;#8211; regardless. If they&amp;#8217;re not well suited to that, from a customer&amp;#8217;s perspective, that&amp;#8217;s the provider&amp;#8217;s problem. &lt;/p&gt;
&lt;p&gt;Anyway, thanks to the folks from 10gen, Cloudant, Hashrocket, O&amp;#8217;Reilly, GigaOm, myNoSQL et al who put on the conference. Well worth the trip down. &lt;/p&gt;
&lt;div class=&quot;acc_license&quot;&gt;&lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--&lt;rdf:RDF xmlns=&quot;http://creativecommons.org/ns#&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;&lt;Work rdf:about=&quot;&quot;&gt;&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot; /&gt;&lt;/Work&gt;&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Attribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Reproduction&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Distribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#DerivativeWorks&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#ShareAlike&quot; /&gt;&lt;prohibits rdf:resource=&quot;http://creativecommons.org/ns#CommercialUse&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Notice&quot; /&gt;&lt;/License&gt;&lt;/rdf:RDF&gt;--&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=io1DTLNdQKA:FBJKn_16P_g:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=io1DTLNdQKA:FBJKn_16P_g:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=io1DTLNdQKA:FBJKn_16P_g:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=io1DTLNdQKA:FBJKn_16P_g:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=io1DTLNdQKA:FBJKn_16P_g:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/io1DTLNdQKA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Fri, 12 Mar 2010 17:10:42 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Log Buffer #182, a Carnival of the Vanities for DBAs</title>
	<guid>http://www.pythian.com/news/?p=9417</guid>
	<link>http://www.pythian.com/news/9417/log-buffer-182-a-carnival-of-the-vanities-for-dbas/</link>
	<description>&lt;p&gt;This is the 182nd edition of Log Buffer, the weekly review of database blogs.  Make sure to read the whole edition so you do not miss where to submit your SQL limerick!&lt;/p&gt;
&lt;p&gt;This week started out with &lt;a href=&quot;http://www.pythian.com/news/author/sheeri/&quot;&gt;me&lt;/a&gt; posting about &lt;a href=&quot;http://www.pythian.com/news/9207/international-womens-day/&quot;&gt;International Women&amp;#8217;s Day&lt;/a&gt;, and has me personally attending &lt;a href=&quot;http://www.confoo.ca&quot;&gt;Confoo&lt;/a&gt; (Montreal) which is an excellent conference I hope to return to next year.  I learned a lot from confoo, especially the &lt;a href=&quot;http://www.pythian.com/news/9387/liveblogging-at-confoo-blending-nosql-and-sql/&quot;&gt;blending nosql and sql&lt;/a&gt; session I attended.&lt;/p&gt;
&lt;p&gt;This week was also the &lt;a href=&quot;http://www.hotsos.com/sym10.html&quot;&gt;Hotsos Symposium&lt;/a&gt;.  &lt;a href=&quot;http://oracledoug.com/serendipity/index.php&quot;&gt;Doug&amp;#8217;s Oracle Blog&lt;/a&gt; has a &lt;a href=&quot;http://oracledoug.com/serendipity/index.php?/plugin/tag/hotsos+2010&quot;&gt;series of posts about Hotsos&lt;/a&gt;.  If all this talk about conferences has gotten you excited, &lt;a href=&quot;http://www.commandprompt.com/blogs/joshua_drake/&quot;&gt;Joshua Drake&lt;/a&gt; notes that &lt;a href=&quot;http://www.commandprompt.com/blogs/joshua_drake/2010/03/14_days_and_the_hotel_is_almost_full_for_postgresql_conference_east/&quot;&gt;14 days and the hotel is almost full for postgresql conference east&lt;/a&gt; which is &lt;a href=&quot;http://www.postgresqlconference.org/&quot;&gt;March 25th-28th in Philadelphia&lt;/a&gt;.  And the &lt;a href=&quot;http://blogs.oracle.com/databaseinsider/&quot;&gt;Oracle database insider&lt;/a&gt; notes that the &lt;a href=&quot;http://blogs.oracle.com/databaseinsider/2010/03/oracle_openworld_2010_call_for.html&quot;&gt;Oracle OpenWorld call for papers&lt;/a&gt; is now open.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/&quot;&gt;Susan Visser&lt;/a&gt; this week (ending tomorrow) is also &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/SusanVisser/entry/read_an_e_book_week_march_7_1312?lang=en&quot;&gt;read an e-book week&lt;/a&gt;.  So if you have not already done so, read an e-book!  She links a coupon for an e-book in the post.&lt;br /&gt;
&lt;span id=&quot;more-9417&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://db2portal.blogspot.com/&quot;&gt;Craig Mullins&lt;/a&gt; notes that the mainframe is a good career choice in &lt;a href=&quot;http://db2portal.blogspot.com/2010/03/mainframes-safe-it-career-choice.html&quot;&gt;Mainframes: The Safe IT Career Choice&lt;/a&gt;.  He notes that the mainframe is still not dead:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;People having been predicting the death of the mainframe since the advent of client/server in the late 1980s. That is more than 20 years! Think of all the things that have died in that timespan while the mainframe keeps on chugging away: IBM&amp;#8217;s PC business, Circuit City, Koogle peanut butter, public pay phones, Johnny Cash&amp;#8230; the list is endless.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In other career-related news, &lt;a href=&quot;http://antoniocangiano.com/&quot;&gt;Antonio Cangiano&lt;/a&gt; is &lt;a href=&quot;http://antoniocangiano.com/2010/03/05/heads-up-ibm-is-looking-for-top-notch-student-hackers/&quot;&gt;looking for [2] top-notch student hackers&lt;/a&gt; for a 16-month internship at IBM in Toronto starting in May.  All the details, including how to apply, are in Cangiano&amp;#8217;s blog post.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://it.toolbox.com/blogs/db2zos/&quot;&gt;Willie Favero&lt;/a&gt; wants to know how you &amp;#8220;solve the batch dilemma&amp;#8221; for issues like &amp;#8220;shrinking your batch window, designing your batch to play nicely with &amp;#8230; OLTP&amp;#8221; in &lt;a href=&quot;http://it.toolbox.com/blogs/db2zos/hows-your-batch-workload-doing-37343&quot;&gt;how&amp;#8217;s your batch workload doing?&lt;/a&gt;  Perhaps Favero should read the &lt;a href=&quot;http://blogs.oracle.com/theshortenspot/2010/03/updated_batch_best_practices.html&quot;&gt;updated batch best practices&lt;/a&gt; posted by &lt;a href=&quot;http://blogs.oracle.com/theshortenspot/&quot;&gt;Anthony Shorten&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/idm/&quot;&gt;Bryan Smith&lt;/a&gt; surveys a more personal question by asking if you &lt;a href=&quot;http://www.urbandictionary.com/products.php?defid=1793756&quot;&gt;go both ways&lt;/a&gt; and &amp;#8220;manage both DB2 for Linux, UNIX, and Windows and DB2 for z/OS&amp;#8221; in &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/idm/entry/don_t_ask_don_t_tell_bi_platform_dbas?utm_source=feedburner&amp;#038;utm_medium=feed&amp;#038;utm_campaign=Feed%3A+ManagingTheDataLifecycle+%28Data+Studio+Team%29&amp;#038;lang=en&quot;&gt;don&amp;#8217;t ask, don&amp;#8217;t tell, bi-platform DBAs&lt;/a&gt;.  This week&amp;#8217;s Log Buffer editor admits to being a tri-platform DBA &amp;#8212; she has tried many platforms, and in fact, many databases (MySQL, Oracle, DB2, SQL Server, Sybase, Postgres and Ingres)!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.oracle.com/gridautomation/&quot;&gt;Hari Prasanna Srinivasan&lt;/a&gt; promotes a patching survey in &lt;a href=&quot;http://blogs.oracle.com/gridautomation/2010/03/oracle_really_wants_to_hear_fr.html&quot;&gt;Oracle really wants to hear from you! Patching Survey&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.4loeser.net/&quot;&gt;Henrik Loeser&lt;/a&gt; explains what a deadlock and a hot spot are by using a real life analogy taken from a police report in &lt;a href=&quot;http://blog.4loeser.net/2010/03/deadlock-and-hot-spot-in-real-life.html&quot;&gt;deadlock and hot spot in real life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sqlblog.com/blogs/jamie_thomson/&quot;&gt;Jamie Thomson&lt;/a&gt; asks &lt;a href=&quot;http://sqlblog.com/blogs/jamie_thomson/archive/2010/03/08/why-do-you-abbreviate-schema-names.aspx&quot;&gt;why do you abbreviate schema names?&lt;/a&gt;.  &lt;a href=&quot;http://code.openark.org/blog/&quot;&gt;Shlomi Noach&lt;/a&gt; tries to solve the issue that &amp;#8220;there is no consistent convention as for how to write [about table aliases in] an SQL query&amp;#8221; in &lt;a href=&quot;http://code.openark.org/blog/mysql/proper-sql-table-alias-use-conventions&quot;&gt;proper sql table alias use conventions&lt;/a&gt;.  Noach also gives us a &lt;a href=&quot;http://code.openark.org/blog/mysql/tip-faster-than-truncate&quot;&gt;tip: faster than truncate&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://lpetr.org/blog/archives/&quot;&gt;Leons Petrazickis&lt;/a&gt; reminds us that &amp;#8220;rulesets are chains&amp;#8221; and it is important to have your rulesets in the proper order in &lt;a href=&quot;http://lpetr.org/blog/archives/iptables-firewall-pitfall&quot;&gt;iptables firewall pitfall&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyone interested in &lt;a href=&quot;http://buytaert.net/the-history-of-mysql-ab&quot;&gt;the history of MySQL AB&lt;/a&gt; will be informed after reading &lt;a href=&quot;http://buytaert.net/&quot;&gt;Dries Buytaert&lt;/a&gt;&amp;#8217;s article.&lt;br /&gt;
&lt;a href=&quot;http://gtowey.blogspot.com/&quot;&gt;Gavin Towey&lt;/a&gt; shares his software that helps centrally manage 120 MySQL servers in &lt;a href=&quot;http://gtowey.blogspot.com/2010/03/qshpl-distributed-query-tool.html&quot;&gt;qsh.pl: distributed query tool&lt;/a&gt;  For those who want to learn more about column-oriented databases, particularly in MySQL, &lt;a href=&quot;http://infinidb.org/infinidb-blog/&quot;&gt;Robin Schumacher of the InfiniDB blog&lt;/a&gt; announces that there is a &lt;a href=&quot;http://infinidb.org/infinidb-blog/mysql-university-session-recording-on-mysql-column-databases-now-available.html&quot;&gt;MySQL University session recording on MySQL column databases now available&lt;/a&gt;.  MySQL join-fu expert &lt;a href=&quot;http://www.joinfu.com/&quot;&gt;Jay Pipes&lt;/a&gt; has moved his blog to &lt;a href=&quot;http://www.joinfu.com&quot;&gt;www.joinfu.com&lt;/a&gt; and starts with &lt;a href=&quot;http://www.joinfu.com/2010/03/a-sql-puzzle/&quot;&gt;An SQL Puzzle&lt;/a&gt; and of course &lt;a href=&quot;http://www.joinfu.com/2010/03/a-follow-up-on-the-sql-puzzle/&quot;&gt;a follow up on the sql puzzle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://izoratti.blogspot.com/&quot;&gt;Ivan Zoratti&lt;/a&gt; is happy that &lt;a href=&quot;http://izoratti.blogspot.com/2010/03/finally-slides-posted-for-dw-breakfast.html&quot;&gt;finally, slides posted for the MySQL DW breakfast&lt;/a&gt;.  &lt;a href=&quot;http://venublog.com/&quot;&gt;Venu Anuganti&lt;/a&gt; gives you tips on one of the most common MySQL frustrations:  optimizing subqueries in &lt;a href=&quot;http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/&quot;&gt;how to improve subqueries derived tables performance&lt;/a&gt;.  &lt;a href=&quot;http://swanhart.livejournal.com/&quot;&gt;Justin Swanhart&lt;/a&gt; posts the way in which he &lt;a href=&quot;http://swanhart.livejournal.com/131541.html&quot;&gt;Gets Linux performance information from your MySQL database without shell access&lt;/a&gt; and &lt;a href=&quot;http://swanhart.livejournal.com/131788.html&quot;&gt;emulates a &amp;#8216;top&amp;#8217; CPU summary using /proc/stat and MySQL&lt;/a&gt; using the same method.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.oracleappsblog.com/index.php&quot;&gt;Oracle Apps blog&lt;/a&gt; has an &lt;a href=&quot;http://www.oracleappsblog.com/index.php/weblog/introduction-to-oracle-user-productivity-kit-upk/&quot;&gt;introduction to Oracle user productivity kit&lt;/a&gt; (UPK).  Even though in this editor&amp;#8217;s opinion the article is very sales-pitchy, it has valuable information, and does indeed live up to its promise:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;UPK is a software tool that can capture all the steps in a system process. It records every keystroke, every click of the mouse, each menu option chosen and each button pressed. All this is done in the UPK Recorder by going through the transaction and pressing “printscreen” after every user action. From this, without any further effort from the developer, UPK builds a number of valuable outputs.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://sqlblog.com/blogs/allen_white/&quot;&gt;Allen White&lt;/a&gt; gives a great tip on how to optimize queries in &lt;a href=&quot;http://sqlblog.com/blogs/allen_white/archive/2010/03/05/keep-your-data-clean.aspx&quot;&gt;keep your data clean&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.oracle.com/UPGRADE/&quot;&gt;Mike Dietrich&lt;/a&gt; reminds you to &lt;a href=&quot;http://blogs.oracle.com/UPGRADE/2010/03/remove_old_parameters_and_even.html&quot;&gt;remove &amp;#8220;old&amp;#8221; parameters and events from your init.ora&lt;/a&gt; when upgrading, &amp;#8220;as keeping them will definitely slow down the database performance in the new release.&amp;#8221;  He shows evidence of slowness when this is not done.  Dietrich also shows how you can be &lt;a href=&quot;http://blogs.oracle.com/UPGRADE/2010/03/gathering_workload_statistics.html&quot;&gt;gathering workload statistics&lt;/a&gt; &amp;#8220;to give the optimizer some good knowledge about how powerful your IO-system might be&amp;#8221;, especially &amp;#8220;a few days after upgrading to the new release&amp;#8230;while a real workload is running.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://krow.livejournal.com/&quot;&gt;Brian Aker&lt;/a&gt; shows the exciting features coming soon in Drizzle in &lt;a href=&quot;http://krow.livejournal.com/686178.html&quot;&gt;Drizzle, Cherry, Roadmap for our Next Release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Maybe you are thinking of migrating, not upgrading&amp;#8230;..&lt;a href=&quot;http://radar.oreilly.com/&quot;&gt;The O&amp;#8217;Reilly Radar&lt;/a&gt; shows how to asses an Oracle to MySQL migration in &lt;a href=&quot;http://radar.oreilly.com/2010/03/oracle-to-mysql.html&quot;&gt;MySQL migration and risk management&lt;/a&gt;.  Actually, that article interviews &lt;a href=&quot;http://ronaldbradford.com&quot;&gt;Ronald Bradford&lt;/a&gt; on the subject &amp;#8212; Bradford has been prolific lately, updating &lt;a href=&quot;http://ronaldbradford.com/blog/tag/my-cnf/&quot;&gt;free my.cnf advice series&lt;/a&gt; and &lt;a href=&quot;http://ronaldbradford.com/blog/tag/mysql4oracledba/&quot;&gt;&amp;#8220;Don&amp;#8217;t Assume&amp;#8221;: MySQL for the Oracle DBA series&lt;/a&gt;.  &lt;a href=&quot;http://blogs.oracle.com/stevenChan/&quot;&gt;Nick Quarmby&lt;/a&gt; also talks about migrating Oracle, but not to a new database, just to a new platform, in his &lt;a href=&quot;http://blogs.oracle.com/stevenChan/2010/03/migrating_oracle_applications_to_new_platforms.html&quot;&gt;primer on migrating Oracle Applications to new platforms&lt;/a&gt;.  And the big news comes from &lt;a href=&quot;http://www.dataprix.com/en/blogs/carlos&quot;&gt;Carlos of dataprix&lt;/a&gt; that &lt;a href=&quot;http://www.dataprix.com/en/blogs/carlos/twitter-will-migrate-mysql-cassandra-db&quot;&gt;Twitter will migrate from MySQL to Cassandra DB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sqlskills.com/BLOGS/PAUL/&quot;&gt;Paul S. Randal&lt;/a&gt; explains his way of &lt;a href=&quot;http://www.sqlskills.com/BLOGS/PAUL/post/Benchmarking-1-TB-table-population-%28part-4-network-optimization%29.aspx&quot;&gt;benchmarking: 1 Tb table population&lt;/a&gt; on SQL Server.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.petefinnigan.com/weblog/entries/&quot;&gt;Pete Finnigan&lt;/a&gt; shares his slides from &lt;a href=&quot;http://www.petefinnigan.com/weblog/archives/00001314.htm&quot;&gt;a webinar on how to secure oracle&lt;/a&gt;, and &lt;a href=&quot;http://blogs.oracle.com/security/&quot;&gt;Denis Pilipchuk&lt;/a&gt; shares his &lt;a href=&quot;http://blogs.oracle.com/security/2010/03/approaches_for_discovering_sec.html&quot;&gt;approaches for discovering security vulnerabilities in software applications&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://thoughts.j-davis.com/&quot;&gt;Jeff Davis&lt;/a&gt; shares his thoughts about &lt;a href=&quot;http://thoughts.j-davis.com/2010/03/07/scalability-and-the-relational-model/&quot;&gt;scalability and the relational model&lt;/a&gt;.  &lt;a href=&quot;http://www.xzilla.net/&quot;&gt;Robert Treat&lt;/a&gt; responds &lt;a href=&quot;http://www.xzilla.net/blog/2010/Mar/Actually,-the-Relational-Model-doesnt-scale.html&quot;&gt;actually, the relational model doesn&amp;#8217;t scale&lt;/a&gt; and &lt;a href=&quot;http://www.xaprb.com/&quot;&gt;Baron Schwartz&lt;/a&gt; counters with &lt;a href=&quot;http://www.xaprb.com/blog/2010/03/08/nosql-doesnt-mean-non-relational/&quot;&gt;NoSQL doesn&amp;#8217;t mean non-relational&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sqlblog.com/blogs/buck_woody/&quot;&gt;Buck Woody&lt;/a&gt; explains &amp;#8220;whenever you want to know something about SQL Server’s configuration, whether that’s the Instance itself or a database, you have a few options&amp;#8221; &amp;#8212; and of course what those options are &amp;#8212; in &lt;a href=&quot;http://sqlblog.com/blogs/buck_woody/archive/2010/03/11/system-variables-stored-procedures-or-functions-for-meta-data.aspx&quot;&gt;system variables, stored procedures or functions for meta data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This week&amp;#8217;s &lt;a href=&quot;http://www.straightpathsql.com/archives/2010/03/invitation-for-t-sql-tuesday-004-io/&quot;&gt;T-SQL Tuesday&lt;/a&gt; topic was I/O.  There are many links to great blog posts in the comments; three random posts I chose to highlight: &lt;a href=&quot;http://sqlblog.com/blogs/michael_zilberstein/&quot;&gt;Michael Zilberstein&lt;/a&gt; talks about &lt;a href=&quot;http://sqlblog.com/blogs/michael_zilberstein/archive/2010/03/09/23065.aspx&quot;&gt;IO capacity planning&lt;/a&gt;, while &lt;a href=&quot;http://sqlblog.com/blogs/kalen_delaney/&quot;&gt;Kalen Delaney&lt;/a&gt; talks about using STATISTICS IO in &lt;a href=&quot;http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/09/tsql-tuesday-4-io.aspx&quot;&gt;I/O, you know&lt;/a&gt;, and &lt;a href=&quot;http://sqlblog.com/blogs/merrill_aldrich/&quot;&gt;Merrill Aldrich&lt;/a&gt; chimes in with information on &lt;a href=&quot;http://sqlblog.com/blogs/merrill_aldrich/archive/2010/03/08/t-sql-tuesday-004-real-world-ssd-s.aspx&quot;&gt;real world SSD&amp;#8217;s&lt;/a&gt;.  Aldrich also begs folks not to waste resources and make more work for developers and DBAs in &lt;a href=&quot;http://sqlblog.com/blogs/merrill_aldrich/archive/2010/03/11/dear-isv-you-re-keeping-me-awake-nights-with-your-varchar-dates.aspx&quot;&gt;dear ISV, you&amp;#8217;re keeping me awake nights with your VARCHAR() dates&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And we end with a bit of fin:  &lt;a href=&quot;http://sqlblog.com/blogs/paul_nielsen/&quot;&gt;Paul Nielsen&lt;/a&gt; wants us all to have a bit of fun; he has posted an SQL limerick and asks readers to create there own in &lt;a href=&quot;http://sqlblog.com/blogs/paul_nielsen/archive/2010/03/11/there-once-was-in-dublin-a-query.aspx&quot;&gt;there once was in Dublin a query&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 12 Mar 2010 17:01:59 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: The Art of &quot;What is going on inside of my database?&quot;</title>
	<guid>http://krow.livejournal.com/686599.html</guid>
	<link>http://krow.livejournal.com/686599.html</link>
	<description>Yesterday we were having a conversation on IRC about the need for more useful information about the internals of the database.&lt;br /&gt;&lt;br /&gt;&quot;SHOW STATUS&quot; is just too primitive in its design to provide the sort of detailed information you need to do operations. Yesterday we got a bug request over the number of &quot;open tables&quot; found after a particular query. The user had assumed the number was off, but what they hadn't realized was that the number was accurate (in this particular case, MySQL fudges a number on open tables because it can't handle count its derived tables).&lt;br /&gt;&lt;br /&gt;One of the patches coming into the tree right now fully exposes the contents of the table cache and table definition cache to the user. You can see who holds what locks on what tables, and you can see the actual count on table access per table.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;

drizzle&amp;gt; select * from TABLE_DEFINITION_CACHE;
+-----------------+------------------------+---------+-------------+----------------+
| TABLE_SCHEMA    | TABLE_NAME             | VERSION | TABLE_COUNT | IS_NAME_LOCKED |
+-----------------+------------------------+---------+-------------+----------------+
| data_dictionary | schema_names           |       1 |           1 | FALSE          |
| data_dictionary | table_definition_cache |       1 |           1 | FALSE          |
| data_dictionary | show_tables            |       1 |           1 | FALSE          |
+-----------------+------------------------+---------+-------------+----------------+
3 rows in set (0 sec)

drizzle&amp;gt; select * from TABLE_CACHE;
+------------+-----------------+------------------------+-----------+----------------+---------+----------------+------+----------------+------------+----------------+
| SESSION_ID | TABLE_SCHEMA    | TABLE_NAME             | ARCHETYPE | ENGINE         | VERSION | IS_NAME_LOCKED | ROWS | AVG_ROW_LENGTH | TABLE_SIZE | AUTO_INCREMENT |
+------------+-----------------+------------------------+-----------+----------------+---------+----------------+------+----------------+------------+----------------+
|          0 | data_dictionary | schema_names           | FUNCTION  | FunctionEngine |       1 | FALSE          |  100 |            260 |          0 |              0 |
|          0 | data_dictionary | show_tables            | FUNCTION  | FunctionEngine |       1 | FALSE          |  100 |            260 |          0 |              0 |
|          1 | data_dictionary | table_cache            | FUNCTION  | FunctionEngine |       1 | FALSE          |  100 |           1113 |          0 |              0 |
|          0 | data_dictionary | table_definition_cache | FUNCTION  | FunctionEngine |       1 | FALSE          |  100 |            559 |          0 |              0 |
+------------+-----------------+------------------------+-----------+----------------+---------+----------------+------+----------------+------------+----------------+
4 rows in set (0 sec)

drizzle&amp;gt; select * from TABLE_DEFINITION_CACHE WHERE TABLE_COUNT &amp;gt; 1;
Empty set (0 sec)

drizzle&amp;gt; select * from TABLE_DEFINITION_CACHE WHERE TABLE_COUNT &amp;gt; 0;
+-----------------+------------------------+---------+-------------+----------------+
| TABLE_SCHEMA    | TABLE_NAME             | VERSION | TABLE_COUNT | IS_NAME_LOCKED |
+-----------------+------------------------+---------+-------------+----------------+
| data_dictionary | schema_names           |       1 |           1 | FALSE          |
| data_dictionary | table_cache            |       1 |           1 | FALSE          |
| data_dictionary | table_definition_cache |       1 |           1 | FALSE          |
| data_dictionary | show_tables            |       1 |           1 | FALSE          |
+-----------------+------------------------+---------+-------------+----------------+
4 rows in set (0 sec)

drizzle&amp;gt; select count(*) from TABLE_DEFINITION_CACHE WHERE TABLE_COUNT  &amp;gt; 0;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0 sec)

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The term &quot;ARCHETYPE&quot; is the base primitive about what sort of table was used. It is more detailed then the ANSI &quot;TABLE_TYPE&quot; that exists in I_S. We still have a debate on what exactly this term should mean. One of the things I enjoy about working on Drizzle? I am not stuck in a room full of people who will spend hours on this sort of &lt;a href=&quot;http://bikeshed.com/&quot;&gt;bike shed&lt;/a&gt; decisions. &lt;br /&gt;&lt;br /&gt;Version gives you the current definition count for the table. Right now that number is still based on &quot;since opened&quot; but we will soon be storing the metadata for this so you will know how many times in the life of an object it has been changed.&lt;br /&gt;&lt;br /&gt;We are still working out the details to SHOW TABLE STATUS. Our SHOW commands are just query rewrites to tables.&lt;br /&gt;&lt;br /&gt;Here is a partial example of the new table that is outputted from a SHOW TABLE STATUS:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
+---------+--------+-------------------+-----------
| Session | Schema | Name              | Type
+---------+--------+-------------------+-----------
|       0 | Schema | b                 | STANDARD
|       0 | Schema | show_tables       | FUNCTION
|       1 | Schema | show_table_status | FUNCTION
|       0 | Schema | schema_names      | FUNCTION
|       0 | Schema | dfsdf             | STANDARD
|       1 | Schema | b                 | TEMPORARY
|       1 | Schema | a                 | TEMPORARY
+---------+--------+-------------------+-----------+
7 rows in set (0 sec)

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Notice Session? Notice that type can be Temporary?  With our system you can see the current owner of the open table and we now include whatever temporary tables you have in your own session. We have also included a larger table which you can see just your own temporary tables (and most likely I will soon create a table so that you can see all temporary tables open across all sessions). The current &quot;Type&quot; in SHOW TABLE STATUS is an Archetype so we will be changing that so that terms match up across the database. Consistency in design is an awesome thing :)&lt;br /&gt;&lt;br /&gt;There is a lot more to come!&lt;br /&gt;&lt;br /&gt;P.S. Just wait until I push the code for tracking locks in Drizzle, I demoed it at SCALE and got a lot of both positive and constructive feedback on it.</description>
	<pubDate>Fri, 12 Mar 2010 16:50:02 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Location for Drizzle Developer Day 2010</title>
	<guid>http://blog.drizzle.org/?p=581</guid>
	<link>http://blog.drizzle.org/2010/03/11/location-for-drizzle-developer-day-2010/</link>
	<description>&lt;p&gt;We finally have our location for Drizzle Developer Day 2010,  this year it will be at the &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;#038;source=s_q&amp;#038;hl=en&amp;#038;geocode=&amp;#038;q=Santa+Clara+Convention+Center&amp;#038;sll=37.427227,-122.130124&amp;#038;sspn=0.009116,0.01899&amp;#038;ie=UTF8&amp;#038;hq=Santa+Clara+Convention+Center&amp;#038;hnear=&amp;#038;z=12&amp;#038;iwloc=A&quot; target=&quot;_blank&quot;&gt;Santa Clara Convention Center&lt;/a&gt;, rooms 209 and 210. As we previously announced the event will be Friday April 16th right after the MySQL User Conference, 9:30 a.m. to 5:00 p.m.&lt;/p&gt;
&lt;p&gt;Please make sure and sign up at &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010_signup&quot; target=&quot;_blank&quot;&gt;http://drizzle.org/wiki/Drizzle_Developer_Day_2010_signup&lt;/a&gt;. Space will be limited and it is filling up fast. &lt;/p&gt;
&lt;p&gt;Also, to make this day a success, please provide your input on discussion topics at &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010&quot; target=&quot;_blank&quot;&gt;http://drizzle.org/wiki/Drizzle_Developer_Day_2010&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hope to see you there!&lt;/p&gt;</description>
	<pubDate>Fri, 12 Mar 2010 03:12:13 +0000</pubDate>
</item>
<item>
	<title>Jay Pipes: A Follow Up on the SQL Puzzle</title>
	<guid>http://www.joinfu.com/?p=340</guid>
	<link>http://www.joinfu.com/2010/03/a-follow-up-on-the-sql-puzzle/</link>
	<description>&lt;h3&gt;Or&amp;#8230;What the Heck is Wrong with &lt;tt&gt;CREATE TABLE IF NOT EXISTS ... SELECT&lt;/tt&gt;?&lt;/h3&gt;
&lt;p&gt;So, earlier this week, I &lt;a href=&quot;http://joinfu.com/2010/03/a-sql-puzzle&quot;&gt;blogged about&lt;/a&gt; an SQL puzzle that had come up in my current work on Drizzle&amp;#8217;s new transaction log.&lt;/p&gt;
&lt;p&gt;I posed the question to readers what the &amp;#8220;correct&amp;#8221; result of the following would be:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;sql&quot;&gt;&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; t1 &lt;span&gt;&amp;#40;&lt;/span&gt;a int&lt;span&gt;,&lt;/span&gt; b int&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; t1 &lt;span&gt;VALUES&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TEMPORARY&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; t2 &lt;span&gt;&amp;#40;&lt;/span&gt;a int&lt;span&gt;,&lt;/span&gt; b int&lt;span&gt;,&lt;/span&gt; &lt;span&gt;PRIMARY&lt;/span&gt; &lt;span&gt;KEY&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
BEGIN;
&lt;span&gt;INSERT&lt;/span&gt; &lt;span&gt;INTO&lt;/span&gt; t2 &lt;span&gt;VALUES&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;
&lt;span&gt;CREATE&lt;/span&gt; &lt;span&gt;TEMPORARY&lt;/span&gt; &lt;span&gt;TABLE&lt;/span&gt; &lt;span&gt;IF&lt;/span&gt; &lt;span&gt;NOT&lt;/span&gt; &lt;span&gt;EXISTS&lt;/span&gt; t2 &lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;PRIMARY&lt;/span&gt; &lt;span&gt;KEY&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;a&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;SELECT&lt;/span&gt; &lt;span&gt;*&lt;/span&gt; &lt;span&gt;FROM&lt;/span&gt; t1;
&amp;nbsp;
&lt;span&gt;# The above statement will correctly produce an ERROR 23000: Duplicate entry '1' for key 'PRIMARY'&lt;/span&gt;
&lt;span&gt;# What should the below result be?&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;SELECT&lt;/span&gt; &lt;span&gt;*&lt;/span&gt; &lt;span&gt;FROM&lt;/span&gt; t2;
COMMIT;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A number of readers responded, and, to be fair, most everyone was &amp;#8220;correct&amp;#8221; in their own way.   Why?  Well, because the way that MySQL deals with calls to &lt;tt&gt;CREATE TABLE ... SELECT&lt;/tt&gt;, &lt;tt&gt;CREATE TABLE IF NOT EXISTS ... SELECT&lt;/tt&gt; and their temporary-table counterparts is completely stupid, as I learned this week.  Rob Wultsch &lt;a href=&quot;http://www.joinfu.com/2010/03/a-sql-puzzle/#comment-214877&quot;&gt;essentially sums up&lt;/a&gt; my feelings about the behaviour of DDL statements in regards to transactions in a session:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Implicit commit is evil and stupid. Ideally we the server should error and roll back, imho.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;The Officially Correct Answer (at least in MySQL)&lt;/h3&gt;
&lt;p&gt;OK, so here&amp;#8217;s the &amp;#8220;official&amp;#8221; correct answer:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;CREATE TABLE IF NOT EXISTS ... SELECT&lt;/tt&gt; does &lt;em&gt;not&lt;/em&gt; first check for the existence of the table in question.  Instead, if the table in question does exist, &lt;tt&gt;CREATE TABLE IF NOT EXISTS ... SELECT&lt;/tt&gt; behaves like an &lt;tt&gt;INSERT INTO ... SELECT&lt;/tt&gt; statement.  Yep, you heard right.  &lt;strong&gt;&lt;em&gt;So, instead of throwing a warning when it notices that the table exists, MySQL instead attempts to insert rows from the &lt;tt&gt;SELECT&lt;/tt&gt; query into the existing table&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here is the official MySQL explanation:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
 For CREATE TABLE &amp;#8230; SELECT, if IF NOT EXISTS is given and the table already exists, MySQL handles the statement as follows:&lt;br /&gt;
    * The table definition given in the CREATE TABLE part is ignored. No error occurs, even if the definition does not match that of the existing table.&lt;br /&gt;
    * If there is a mismatch between the number of columns in the table and the number of columns produced by the SELECT part, the selected values are assigned to the rightmost columns. For example, if the table contains n columns and the SELECT produces m columns, where m  n, the selected values are assigned to the m rightmost columns in the table. Each of the initial n – m columns is assigned its default value, either that specified explicitly in the column definition or the implicit column data type default if the definition contains no default. If the SELECT part produces too many columns (m &gt; n), an error occurs.&lt;br /&gt;
    * If strict SQL mode is enabled and any of these initial columns do not have an explicit default value, the statement fails with an error.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, given the above manual explanation, the correct answer to the original blog post is:&lt;/p&gt;
&lt;pre&gt;
  a  |  b
100 | 100
&lt;/pre&gt;
&lt;p&gt;partly because there is an implicit COMMIT directly before the CREATE TABLE is executed (committing the 100,100 record to the table) and the primary key violation kills off the INSERTs of 1,1 in InnoDB.  For a MyISAM table, the 1,1 record would be in the table, since MyISAM has no idea what a ROLLBACK is.&lt;/p&gt;
&lt;h3&gt;I Think Drizzle Should Follow PostgreSQL&amp;#8217;s Example Here&lt;/h3&gt;
&lt;p&gt;On implicit commits before DDL operations, I believe they should all go bye-bye.  DDL should be transactional in Drizzle and if a statement cannot be executed in a transaction, it should throw an error if there is an active transaction.  Period.&lt;/p&gt;
&lt;p&gt;For behaviour of &lt;tt&gt;CREATE TABLE ... SELECT&lt;/tt&gt; acting like an &lt;tt&gt;INSERT INTO ... SELECT&lt;/tt&gt;, that entire code path should be ripped out.&lt;/p&gt;
&lt;p&gt;PostgreSQL&amp;#8217;s DDL operations, IMHO, are sane.  Sane is good.  PostgreSQL allows quite a bit of flexibility by implementing the SQL standard&amp;#8217;s &lt;tt&gt;&lt;a href=&quot;http://www.postgresql.org/docs/current/static/sql-createtable.html&quot;&gt;CREATE TABLE&lt;/a&gt;&lt;/tt&gt; and &lt;tt&gt;&lt;a href=&quot;http://www.postgresql.org/docs/current/static/sql-createtableas.html&quot;&gt;CREATE TABLE AS&lt;/a&gt;&lt;/tt&gt; statements.  I believe Drizzle should scrap all the DDL table-creation code and instead implement PostgreSQL&amp;#8217;s much-nicer DDL methods.  There, I said it.  Slashdot MySQL haters, there ya go.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 22:12:35 +0000</pubDate>
</item>
<item>
	<title>Ronald Bradford - 42SQL: Drizzles Data Dictionary and Global Status</title>
	<guid>http://ronaldbradford.com/blog/?p=2617</guid>
	<link>http://ronaldbradford.com/blog/drizzles-data-dictionary-and-global-status-2010-03-11/</link>
	<description>&lt;p&gt;With the recent news by Brian about the &lt;a href=&quot;http://krow.livejournal.com/685840.html&quot;&gt;Data Dictionary&lt;/a&gt; in Drizzle replacing the INFORMATION_SCHEMA, I was looking into the server status variables (aka INFORMATION_SCHEMA.GLOBAL_STATUS) and I came across an interesting discovery.&lt;/p&gt;
&lt;pre&gt;
select * from data_dictionary.global_status;
...
| Table_locks_immediate      | 0              |
| Table_locks_waited         | 0              |
| Threads_connected          | 8134064        |
| Uptime                     | 332            |
| Uptime_since_flush_status  | 332            |
+----------------------------+----------------+
51 rows in set (0 sec)
&lt;/pre&gt;
&lt;p&gt;This only retrieved 51 rows, which is way less then previous.  What I wanted was clearly missing, all the old com_ status variables. Looking at what the data_dictionary actually has available revealed a new table.&lt;/p&gt;
&lt;pre&gt;
drizzle&gt; select * from data_dictionary.global_statements;
+-----------------------+----------------+
| VARIABLE_NAME         | VARIABLE_VALUE |
+-----------------------+----------------+
| admin_commands        | 0              |
| alter_db              | 0              |
| alter_table           | 0              |
| analyze               | 0              |
| begin                 | 0              |
| change_db             | 1              |
| check                 | 0              |
| checksum              | 0              |
| commit                | 0              |
| create_db             | 0              |
| create_index          | 0              |
| create_table          | 0              |
| delete                | 0              |
| drop_db               | 0              |
| drop_index            | 0              |
| drop_table            | 0              |
| empty_query           | 0              |
| flush                 | 0              |
| insert                | 0              |
| insert_select         | 0              |
| kill                  | 0              |
| load                  | 0              |
| release_savepoint     | 0              |
| rename_table          | 0              |
| replace               | 0              |
| replace_select        | 0              |
| rollback              | 0              |
| rollback_to_savepoint | 0              |
| savepoint             | 0              |
| select                | 10             |
| set_option            | 0              |
| show_create_db        | 0              |
| show_create_table     | 0              |
| show_errors           | 0              |
| show_warnings         | 0              |
| truncate              | 0              |
| unlock_tables         | 0              |
| update                | 0              |
+-----------------------+----------------+
38 rows in set (0 sec)
&lt;/pre&gt;
&lt;p&gt;Kudos to this.  Looking at list I saw an obvious omission, of &amp;#8220;ping&amp;#8221;. Something that caught me out some years ago with huge (300-500 per second admin_commands).  I&amp;#8217;m also a fan of Mark&amp;#8217;s recent work &lt;a href=&quot;http://www.markleith.co.uk/?p=327&quot;&gt;An evening hack &amp;#8211; Com_ping&lt;/a&gt; in MySQL. &lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 21:33:14 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Writing A Storage Engine for Drizzle, Part 2: CREATE TABLE</title>
	<guid>http://www.flamingspork.com/blog/?p=1813</guid>
	<link>http://www.flamingspork.com/blog/2010/03/12/writing-a-storage-engine-for-drizzle-part-2-create-table/</link>
	<description>&lt;p&gt;The DDL code paths for Drizzle are increasingly different from MySQL. For example, the embedded_innodb StorageEngine CREATE TABLE code path is completely different than what it would have to be for MySQL. This is because of a number of reasons, the primary one being that Drizzle uses a protobuf message to describe the table format instead of several data structures and a FRM file.&lt;/p&gt;
&lt;p&gt;We are pretty close to having the table protobuf message format being final (there&amp;#8217;s a few bits left to clean up, but expect them done Real Soon Now (TM)). You can see the definition (which is pretty simple to follow) in &lt;a href=&quot;http://bazaar.launchpad.net/~drizzle-developers/drizzle/development/annotate/head:/drizzled/message/table.proto&quot;&gt;drizzled/message/table.proto&lt;/a&gt;. Also check out my &lt;a href=&quot;http://www.flamingspork.com/blog/2009/12/12/the-table-protobuf-message-format/&quot;&gt;series of blog posts on the table message&lt;/a&gt; (more posts coming, I promise!).&lt;/p&gt;
&lt;p&gt;Drizzle allows either your StorageEngine or the Drizzle kernel to take care of storage of table metadata. You tell the Drizzle kernel that your engine will take care of metadata itself by specifying HTON_HAS_DATA_DICTIONARY to the StorageEngine constructor. If you don&amp;#8217;t specify HTON_HAS_DATA_DICTIONARY, the Drizzle kernel stores the serialized Table protobuf message in a &amp;#8220;table_name.dfe&amp;#8221; file in a directory named after the database. If you have specified that you have a data dictionary, you&amp;#8217;ll also have to implement some other methods in your StorageEngine. We&amp;#8217;ll cover these in a later post.&lt;/p&gt;
&lt;p&gt;If you ever dealt with creating a table in MySQL, you may recognize this method:&lt;/p&gt;
&lt;pre&gt;virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;&lt;/pre&gt;
&lt;p&gt;This is not how we do things in Drizzle. We now have this function in StorageEngine that you have to implement:&lt;/p&gt;
&lt;pre&gt;int doCreateTable(Session* session, const char *path,
                  Table&amp;amp; table_obj,
                  drizzled::message::Table&amp;amp; table_message)&lt;/pre&gt;
&lt;p&gt;The existence of the Table parameter is largely historic and at some point will go away. In the Embedded InnoDB engine, we don&amp;#8217;t use the Table parameter at all. Shortly we&amp;#8217;ll also get rid of the path parameter, instead having the table schema in the Table message and helper functions to construct path names.&lt;/p&gt;
&lt;p&gt;Methods name &amp;#8220;doFoo&amp;#8221; (such as doCreateTable) mean that there is a method named foo() (such as createTable()) in the base class. It does some base work (such as making sure the table_message is filled out and handling any errors) while the &amp;#8220;real&amp;#8221; work is done by your StorageEngine in the doCreateTable() method.&lt;/p&gt;
&lt;p&gt;The Embedded InnoDB engine goes through the table message and constructs a data structure for the Embedded InnoDB library to create a table. The ARCHIVE storage engine is much simpler, and it pretty much just creates the header of the ARZ file, mostly ignoring the format of the table. The best bet is to look at the code from one of these engines, depending on what type of engine you&amp;#8217;re working on. This code, along with the table message definition should be more than enough&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 14:27:34 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: And the answer is ….. Rackspace Cloud!</title>
	<guid>http://blog.drizzle.org/?p=567</guid>
	<link>http://blog.drizzle.org/2010/03/11/and-the-answer-is-rackspace-cloud/</link>
	<description>&lt;p&gt;A lot of you have been wondering where the Drizzle developers who were working at Sun have landed after the Oracle acquisition. As I&amp;#8217;m sure you have seen by now we are very happy to now be working on Drizzle at &lt;a href=&quot;http://www.rackspacecloud.com/&quot; target=&quot;_blank&quot;&gt;Rackspace Cloud&lt;/a&gt;. Check out the blogs from &lt;a href=&quot;http://oddments.org/?p=282&quot; target=&quot;_blank&quot;&gt;Eric&lt;/a&gt;, &lt;a href=&quot;http://www.joinfu.com/2010/03/happiness-is-a-warm-cloud/&quot; target=&quot;_blank&quot;&gt;Jay&lt;/a&gt;, &lt;a href=&quot;http://inaugust.com/post/77&quot; target=&quot;_blank&quot;&gt;Monty&lt;/a&gt; and &lt;a href=&quot;http://www.flamingspork.com/blog/2010/03/11/continuing-the-journey/&quot; target=&quot;_blank&quot;&gt;Stewart&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;-Lee&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 12:46:31 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Continuing the journey</title>
	<guid>http://www.flamingspork.com/blog/?p=1752</guid>
	<link>http://www.flamingspork.com/blog/2010/03/11/continuing-the-journey/</link>
	<description>&lt;p&gt;A couple of months ago (December 1st for those playing along at home) it marked five years to the day that I started at &lt;a href=&quot;http://www.mysql.com&quot;&gt;MySQL AB&lt;/a&gt; (&lt;del datetime=&quot;2010-03-10T03:09:15+00:00&quot;&gt;now &lt;a href=&quot;http://www.sun.com&quot;&gt;Sun&lt;/a&gt;&lt;/del&gt;, now &lt;a href=&quot;http://www.oracle.com&quot;&gt;Oracle&lt;/a&gt;). A good part of me is really surprised it was for that long and other parts surprised it wasn&amp;#8217;t longer. Through MySQL and Sun, I met some pretty amazing people, worked with some really smart ones and formed really solid and awesome friendships. Of course, not everything was perfect (sometimes not even close), but we did have some fun.&lt;/p&gt;
&lt;p&gt;Up until November 2008 (that&amp;#8217;s 3 years and 11 months for those playing at home) I worked on &lt;a href=&quot;http://www.mysql.com/cluster&quot;&gt;MySQL Cluster&lt;/a&gt;. Still love the product and love how much better we&amp;#8217;re making Drizzle so it&amp;#8217;ll be the best SQL interface to NDB :)&lt;/p&gt;
&lt;p&gt;The ideas behind Drizzle had been talked about for a while&amp;#8230; and with my experience with internals of the MySQL server, I thought that some change and dramatic improvement was sorely needed.&lt;/p&gt;
&lt;p&gt;Then, in 2008, Brian created a tree. I was soon sending in patches at nights, we announced to the whole world at OSCON and it captured a lot of attention.&lt;/p&gt;
&lt;p&gt;Since November 2008 I&amp;#8217;ve been working on &lt;a href=&quot;http://drizzle.org&quot;&gt;Drizzle&lt;/a&gt; full time. It was absolutely awesome that I had the opportunity to spend all my days hacking on Drizzle &amp;#8211; both directly with fantastic people and for fantastic people.&lt;/p&gt;
&lt;p&gt;But&amp;#8230; the Sun set&amp;#8230; which was exciting and sad at the same time.&lt;/p&gt;
&lt;p&gt;Never to fear! There were plenty of places wanting Drizzle hackers (and MySQL hackers). For me, it came down to this: &amp;#8220;real artists ship&amp;#8221;. While there were other places where I would no doubt be happy and work on something really cool, the only way I could end up working out where I should really be was: what is the best way to have Drizzle make a stable release that we&amp;#8217;d see be suitable for deployment? So, Where Am I Now?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.rackspacecloud.com&quot;&gt;Rackspace&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Where I&amp;#8217;ll again be spending all my time hacking Drizzle.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 07:42:46 +0000</pubDate>
</item>
<item>
	<title>Monty Taylor: [RH]acker</title>
	<guid>http://inaugust.com/post/77</guid>
	<link>http://inaugust.com/post/77</link>
	<description>&lt;div&gt;As I'm sure everyone has figured out by now, I've joined Rackspace where I&amp;nbsp;will continue to work on Drizzle. I'm honestly thrilled with my new home,&amp;nbsp;and there are a myriad of reasons for that. I think the one that I'm&amp;nbsp;most excited about is that they are already the thing that all of the hype was about MySQL and RedHat and IBM wanting to become:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;A Service Company&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Rackspace doesn't want you to run Rackspace-Apache or RackspaceDB or EC-Rackspace. They want you to be able to run bog-standard Apache. And Linux. And MySQL. And PHP. And Drizzle. Then, Rackspace wants to be the best at providing you the service you need around those.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;No ludicrous MySQL Enterprise &amp;quot;we'll sell you a license to a free product, and then we'll include bundled with that a subscription a piece of non-free monitoring software&amp;quot; upselling. Rackspace actually wants to provide you a valuable service, and they want to do such a good job at it that you will happily pay them to do it.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For developers, there is a wonderful upside to this: Rackspace doesn't want a special internal Rackspace-only version of anything. It has no value that way. They want the good software to be ubiquitous so that they can compete in the service arena. This means that they don't want assignment of copyright. This means they don't have crazy policies about what Free Software projects you can and cannot contribute to.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Rackspace goes one step further than &amp;quot;do no evil&amp;quot; ... they actually want you to try to improve the state of the art - which goes right to the core of why I'm involved with Free Software in the first place.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I truly believe that Free will always win over Restricted, that Open beats Closed and that Sharing will always improve the world before Hoarding. I've always contended that a company can be successful and make the world a better place and that the two are not mutually exclusive.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I am thrilled to now be a part of a company where I can do my best to prove it.&amp;nbsp;&lt;/div&gt;</description>
	<pubDate>Thu, 11 Mar 2010 00:39:14 +0000</pubDate>
	<author>Monty Taylor</author>
</item>
<item>
	<title>Brian Aker: Google Summer of Code projects, Drizzle</title>
	<guid>http://krow.livejournal.com/686581.html</guid>
	<link>http://krow.livejournal.com/686581.html</link>
	<description>I've been doing &lt;a href=&quot;http://socghop.appspot.com/&quot;&gt;Google Summer of Code&lt;/a&gt; projects with students since its creation. As far as intern programs go, it has been one of the most successful I have ever worked with.&lt;br /&gt;&lt;br /&gt;Last year was particularly awesome in that with &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt; we were able to have students work on projects that made it back into Drizzle. While I have always seen good work created, it has always been hit or miss on whether the student's work has made it back into the project. Last year though we got more code in then ever before and I believe this year will be the same. We have had students go on to jobs thanks to the work they did on Drizzle.&lt;br /&gt;&lt;br /&gt;Interning gives you real experience, and it provides resume material which differentiates students who are going on to work in the software engineering field. Working on open source means that you have real experience on your resume, experience that an employer can see. There are many positions open in the Drizzle/MySQL ecosystem and students who have real world experience should have any easy time finding work with the knowledge you will gain from this program.&lt;br /&gt;&lt;br /&gt;For Drizzle we have worked out a partial list for this year:&lt;br /&gt;&lt;a href=&quot;http://drizzle.org/wiki/Soc&quot;&gt;http://drizzle.org/wiki/Soc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't see anything you like? I am happy to add new projects or work with students on libmemcached or Gearman.&lt;br /&gt;&lt;br /&gt;Are you interested in working on a different project? Apache, Linux, &lt;a href=&quot;http://www.postgresql.org/developer/summerofcode&quot;&gt;Postgres&lt;/a&gt;? Talk to those projects and ask them to either participate or suggest ideas on projects to them.</description>
	<pubDate>Wed, 10 Mar 2010 18:25:25 +0000</pubDate>
</item>
<item>
	<title>Padraig O'Sullivan: Out of Tree Plugins in Drizzle</title>
	<guid>http://schacon.github.com//2010/03/10/out-of-tree-plugin</guid>
	<link>http://feedproxy.google.com/~r/posulliv/~3/9ordVJX3l8w/out-of-tree-plugin.html</link>
	<description>This week I've been working on porting the prototype MySQL storage engine developed at &lt;a href=&quot;http://akibainc.com&quot;&gt;Akiban&lt;/a&gt; to Drizzle. While doing this, I discovered that in Drizzle, it is
possible to build a plugin out of tree. When I say out of tree, I mean that I can develop a plugin
for drizzle and build it without having a copy of the drizzle source code. This is amazingly awesome
and is mostly due to the awesome build system that &lt;a href=&quot;http://inaugust.com/&quot;&gt;Monty&lt;/a&gt; has put together.
This build system is called &lt;a href=&quot;https://launchpad.net/pandora-build&quot;&gt;Pandora Build&lt;/a&gt; and if
you are ever working on a project that needs to use autoconf related tools, you should really check it out.
Its friggin awesome. It lets you concentrate on development instead of having to spend a bunch of
time trying to get a good build environment set up.&lt;br /&gt;

Anyway, here I am going to go through an example of how to build a drizzle plugin out of tree. The
code is available at lp:~posulliv/drizzle/out-of-tree-example if anyone is interested in looking at
it. I am going to take an existing plugin in the drizzle source tree I developed and show how to
build it out of tree. The plugin I'm going to work with is the &lt;a href=&quot;http://posulliv.github.com/2009/09/29/viewing-memcached-statistics-from-drizzle.html&quot;&gt;memcached_stats&lt;/a&gt;
plugin.&lt;br /&gt;

Before starting, its worth noting that Monty is working on creating a one-step tool for taking a
plugin that is currently in drizzle's source tree (that is, in the plugin directory of a drizzle
tree) and making it possible to build that plugin out of tree. His goal is that there need be no
changes in content between a directory that's in the drizzle source tree and one that's outside the
source tree.&lt;br /&gt;

For this post, we will assume that we are working in a directory named mc-stats-plugin. Before
starting. this directory just contains source files. We will be adding all the build-related files
that are needed to build it.&lt;br /&gt;

The first thing that is needed is a plugin.ini file for a plugin. For an out-of-tree plugin, a
name and url is required. Thus, the plugin.ini file for this plugin will look like:

&lt;pre&gt;
[plugin]
name=memcached_stats
title=Memcached Stats in DATA_DICTIONARY tables
description=Some DATA_DICTIONARY tables that provide Memcached stats
url=http://memcached.org/
version=0.1
disabled=yes
load_by_default=no
author=Padraig O Sullivan
license=PLUGIN_LICENSE_BSD
headers=stats_table.h analysis_table.h sysvar_holder.h
sources=memcached_stats.cc stats_table.cc analysis_table.cc
build_conditional=&quot;${ac_cv_libmemcached}&quot; = &quot;yes&quot; -a &quot;x${MEMCACHED_BINARY}&quot; != &quot;xno&quot;
ldflags=${LTLIBMEMCACHED}
&lt;/pre&gt;

Once that's done, we need to create a config directory and copy a few files from drizzle's trunk:

&lt;pre&gt;
$ cp $DRIZZLE_SRC_ROOT/config/config.rpath ./config/.
$ cp $DRIZZLE_SRC_ROOT/config/pandora-plugin ./config/.
$ cp -R $DRIZZLE_SRC_PORT/m4 .
&lt;/pre&gt;

Like I said before, Monty is working on a tool that will automate the steps above. Now, we can
proceed and start compiling our plugin:

&lt;pre&gt;
$ ./config/pandora-plugin
$ autoreconf -i
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'.
libtoolize: copying file `config/config.guess'
libtoolize: copying file `config/config.sub'
libtoolize: copying file `config/install-sh'
libtoolize: copying file `config/ltmain.sh'
libtoolize: putting macros in `m4'.
libtoolize: copying file `m4/libtool.m4'
libtoolize: copying file `m4/ltoptions.m4'
libtoolize: copying file `m4/ltsugar.m4'
libtoolize: copying file `m4/ltversion.m4'
libtoolize: copying file `m4/lt~obsolete.m4'
libtoolize: Remember to add `LT_INIT' to configure.ac.
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
configure.ac:7: installing `config/compile'
configure.ac:7: installing `config/missing'
Makefile.am: installing `config/depcomp'
$ ./configure
...
$ make
make  all-am
make[1]: Entering directory `/home/posulliv/repos/drizzle/mc-stats-plugin'
  CXX    libmemcached_stats_plugin_la-memcached_stats.lo
  CXX    libmemcached_stats_plugin_la-stats_table.lo
  CXX    libmemcached_stats_plugin_la-analysis_table.lo
  CXXLD  libmemcached_stats_plugin.la
make[1]: Leaving directory `/home/posulliv/repos/drizzle/mc-stats-plugin'
$
&lt;/pre&gt;

Now, our plugin is built. To install it, we simply do a make install and give the
--plugin_add=memcached_stats option to drizzled when we start the server.&lt;br /&gt;

I just think this process
makes my life a whole lot easier and I wanted to bring some attention to how easy drizzle makes
developing plugins.</description>
	<pubDate>Wed, 10 Mar 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Drizzle BoF at the MySQL Conference and Expo</title>
	<guid>http://www.flamingspork.com/blog/?p=1830</guid>
	<link>http://www.flamingspork.com/blog/2010/03/09/drizzle-bof-at-the-mysql-conference-and-expo/</link>
	<description>&lt;p&gt;At the &lt;a href=&quot;http://en.oreilly.com/mysql2010/&quot;&gt;2010 O&amp;#8217;Reilly MySQL Conference and Expo&lt;/a&gt; there will be a Drizzle BoF!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s currently scheduled for 7pm on April 13th.&lt;/p&gt;
&lt;p&gt;Come along, it will be awesome.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Mar 2010 04:46:39 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Drizzling from the Rackspace Cloud</title>
	<guid>http://oddments.org/?p=282</guid>
	<link>http://oddments.org/?p=282</link>
	<description>&lt;p&gt;Since &lt;a href=&quot;http://oddments.org/?p=238&quot;&gt;I left Sun&lt;/a&gt; back in January, folks have been asking what was next. I&amp;#8217;m happy to say that I&amp;#8217;m going to continue hacking on open source projects like &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt; and &lt;a href=&quot;http://gearman.org/&quot;&gt;Gearman&lt;/a&gt;, but now at the &lt;a href=&quot;http://www.rackspacecloud.com/&quot;&gt;Rackspace Cloud&lt;/a&gt;. Not only will I be there, but I get to continue working closely with a few of the amazing Drizzle hackers who have also joined, including &lt;a href=&quot;http://inaugust.com/&quot;&gt;Monty Taylor&lt;/a&gt;, &lt;a href=&quot;http://jpipes.com/index.php&quot;&gt;Jay Pipes&lt;/a&gt;, &lt;a href=&quot;http://www.flamingspork.com/blog/&quot;&gt;Stewart Smith&lt;/a&gt;, and Lee Bieber.&lt;/p&gt;
&lt;p&gt;Why Rackspace Cloud? Late last year I was considering what I wanted to do next with the Oracle acquisition looming near, and this was one of the options that presented itself. Rackspace had been a supporter of Drizzle from early on by offering virtual machines to develop and test on, and when talking to some folks more closely, something really hit home. Rackspace provides first-class service and &amp;#8220;fanatical&amp;#8221; support &amp;#8211; they are not a software company. One might ask why an open source software developer would be interested in a company that doesn&amp;#8217;t create software or vice-versa, and the answer is that Rackspace wants to find ways to offer the best possible service now and into the future. What better way than to help develop the next generation of service software and get a jump start into integrating this into their architecture? Both the open source community and Rackspace win.&lt;/p&gt;
&lt;p&gt;Another thing I learned while talking with Rackspace is that one of their core principles is transparency. This applies to both customer and employees, and anyone within an open source community can appreciate this. The more I learned about the company and the folks within it, the more impressed I was at the lack of internal barriers or &amp;#8220;need-to-know&amp;#8221; information. One of Drizzle&amp;#8217;s core goals is also transparency, from discussing design decisions on public mailing lists and IRC, to having the entire project management infrastructure hosted out in the open at &lt;a href=&quot;https://launchpad.net/drizzle&quot;&gt;Launchpad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What does this mean for the Drizzle project? It means continued support for a number of core developers, more infrastructure for development, and most importantly in my eyes, more context. One of the Drizzle tag-lines is &amp;#8220;A Lightweight SQL Database for Cloud and Web,&amp;#8221; so what better place to develop a database designed for the cloud than on one of the fastest growing cloud platforms. We&amp;#8217;ll get a detailed look at the demands, get feedback from cloud customers, and have the perfect test bed for offering new services. We&amp;#8217;ll also be able to work closely with a top-notch group of DBAs, developers, and sysadmins in one of the most demanding service architectures out there. This invaluable context will help the Drizzle developers make more informed decisions moving forward, which also means better software for the community.&lt;/p&gt;
&lt;p&gt;Personally, this also means getting back to my hosting roots. Before Sun, I worked at &lt;a href=&quot;http://www.concentric.com/&quot;&gt;Concentric&lt;/a&gt; for almost 10 years in a clustered hosting environment. I&amp;#8217;m very familiar with many of the multi-tenant scalability concerns Rackspace has, and I&amp;#8217;m excited to be working in this type of environment again. We&amp;#8217;ve already been working closely with the MySQL DBAs at Rackspace to learn what the biggest pain points are for a multi-tenant architecture, and we&amp;#8217;ll be taking steps to address these as it will help anyone wanting to run Drizzle in a cloud-like environment. Drizzle&amp;#8217;s modular architecture has already proved useful, as some of these concerns are easily answered with &amp;#8220;oh, we have a plugin point for that.&amp;#8221;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m excited, this is going to be a fun ride.&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 16:57:20 +0000</pubDate>
</item>
<item>
	<title>Jay Pipes: Happiness is a Warm Cloud</title>
	<guid>http://joinfu.com/2010/03/happiness-is-a-warm-cloud</guid>
	<link>http://www.joinfu.com/2010/03/happiness-is-a-warm-cloud/</link>
	<description>&lt;p&gt;
Although a few folks knew about where I and many of the Sun Drizzle team had ended up, we&amp;#8217;ve waited until today to &amp;#8220;officially&amp;#8221; tell folks what&amp;#8217;s up.  We &amp;mdash; &lt;a href=&quot;http://inaugust.com&quot; title=&quot;Monty Taylor&quot;&gt;Monty Taylor&lt;/a&gt;, &lt;a href=&quot;http://oddments.org&quot; title=&quot;Eric Day&quot;&gt;Eric Day&lt;/a&gt;, &lt;a href=&quot;http://flamingspork.com&quot; title=&quot;Stewart Smith&quot;&gt;Stewart Smith&lt;/a&gt;, Lee Bieber, and myself &amp;mdash; are all now &amp;#8220;Rackers&amp;#8221;, working at &lt;a href=&quot;http://www.rackspacecloud.com/&quot; title=&quot;Rackspace Cloud&quot;&gt;Rackspace Cloud&lt;/a&gt;.  And yep, we&amp;#8217;re still workin&amp;#8217; on Drizzle.  That&amp;#8217;s the short story.  Read on for the longer one &lt;img src=&quot;http://www.joinfu.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;
&lt;/p&gt;
&lt;h3&gt;An Interesting Almost 3 Years at MySQL&lt;/h3&gt;
&lt;p&gt;
I left my previous position of Community Relations Manager at MySQL to begin working on &lt;a href=&quot;http://krow.livejournal.com&quot; title=&quot;Brian Aker&quot;&gt;Brian Aker&lt;/a&gt;&amp;#8217;s newfangled Drizzle project in October 2008.
&lt;/p&gt;
&lt;p&gt;
Many people at MySQL still think that I abandoned MySQL when I did so.  I did not.  I merely had gotten frustrated with the slow pace of change in the MySQL engineering department and its resistance to transparency.  Sure, over the 3 years I was at MySQL, the engineering department opened up a bit, but it was far from the ideal level of transparency I had hoped to inspire when I joined MySQL.
&lt;/p&gt;
&lt;p&gt;
For almost 3 years, I had sent numerous emails to the MySQL internal email discussion lists asking the engineering and marketing departments, both headed by Zack Urlocker, to recognize the importance and necessity of major refactoring of the MySQL kernel, and the need to modularize the kernel or risk having more modular databases overtake MySQL as the key web infrastructure database.  The focus was always on the short term; on keeping up with the Jones&amp;#8217; as far as features went, and I railed against this kind of roadmap, instead pushing the idea of breaking up the server into modules that could be blackboxed and developed independently of the kernel.  My ideas were met with mostly kind responses, but nothing ever materialized as far as major refactoring efforts were concerned.
&lt;/p&gt;
&lt;p&gt;
I remember Jim Winstead casually responding to one of my emails, &lt;em&gt;&amp;#8220;Congratulations, you&amp;#8217;ve just reinvented Apache 2.0&amp;#8243;&lt;/em&gt;.  And, yes, Jim, that was kind of the point&amp;#8230;
&lt;/p&gt;
&lt;p&gt;
The MySQL source code base had gotten increasingly unmaintainable over the years, and key engineers were extremely resistant to changing the internals of MySQL and modernizing it.  There were some good reasons for being resistant, and some poor reasons (such as &amp;#8220;this is the way we&amp;#8217;ve always done it&amp;#8221;).  Overall, it&amp;#8217;s tough to question the strategy that Zack, Marten Mickos, and others had regarding the short term gains.  After all, they managed to maneuver MySQL into a winning position that Sun Microsystems thought was worth one billion dollars.  Because of this, it&amp;#8217;s tough to argue with them. &lt;img src=&quot;http://www.joinfu.com/wp-includes/images/smilies/icon_neutral.gif&quot; alt=&quot;:|&quot; class=&quot;wp-smiley&quot; /&gt;
&lt;/p&gt;
&lt;h3&gt;Working on Drizzle since October 2008 (officially)&lt;/h3&gt;
&lt;p&gt;
I&amp;#8217;m not the kind of person which likes to wait for years to see change, and so the Drizzle project interested me because it was not concerned with backwards compatibility with MySQL, it wasn&amp;#8217;t concerned with having a roadmap that was dependent on the whims of a few big customers, and it was very much interested in challenging the assumptions built into a 20 year-old code base.  This is a project I could sink my teeth into.  And I did.
&lt;/p&gt;
&lt;p&gt;
Many folks have said that the only reason Drizzle is still around is because Sun continued to pay for a number of engineers to work on Drizzle as &amp;#8220;an experiment of sorts&amp;#8221; and that Drizzle has no customers and therefore nothing to lose and everything to gain.  This was true, no doubt about it.  At Sun CTO Labs, the few of us did have the ability to code on Drizzle without the pressure-cooker of product marketing and sales demands.  &lt;strong&gt;&lt;em&gt;We were lucky.&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;strike&gt;4&lt;/strike&gt; &lt;strike&gt;6&lt;/strike&gt; &lt;strike&gt;9&lt;/strike&gt; 10 Months in Purgatory&lt;/h3&gt;
&lt;p&gt;
So, around rolls April 2009.  The stock market and worldwide economy had collapsed and recession was in the air.  There&amp;#8217;s one thing that is absolutely certain in recession economies: &lt;em&gt;companies that have poor leadership and direction and &lt;a href=&quot;http://www.siliconbeat.com/2008/10/22/patience-of-suns-largest-shareholders-seems-to-be-wearing-thin/&quot;&gt;are beholden to the interests of a large stockholder&lt;/a&gt; will seek an end to their misery through acquisition by a larger, stronger firm&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
And Sun Microsystems was no different.  JAVA stock plummeted to two dollars a share, and Jonathan Schwartz and the Sun board began shopping Sun around to the highest bidder.  IBM was courted along with other tech giants.  So was Oracle.
&lt;/p&gt;
&lt;p&gt;
And it was with a bit of a hangover that I awoke at the MySQL conference in April 2009 to the news that Oracle had purchased Sun Microsystems.  Joy.  We&amp;#8217;d just gone through 14 months of ongoing integration with Sun Microsystems and now it was going to start all over again.
&lt;/p&gt;
&lt;p&gt;
Anyone who follows &lt;a href=&quot;http://planetmysql.org&quot; title=&quot;Planet MySQL&quot;&gt;PlanetMySQL&lt;/a&gt; knows about the ensuing battle in the European Commission&amp;#8217;s court regarding monopoly of Oracle in the database market with its acquisition of MySQL.  Monty Widenius, Eben Moglen, even Richard Stallman, weighed in on the pros and cons of Oracle&amp;#8217;s impending control over MySQL.
&lt;/p&gt;
&lt;p&gt;
All the while, us Sun Microsystems employees had to hold our tongues and try to keep our jobs as Sun laid off thousands more workers while the EC battle ensued.  Not fun.  It was the employment equivalent of purgatory.  And the time just dragged on, with many employees, including myself and the Sun Drizzle team, not having a clue as to what would happen to us.  Management was completely silent about future plans.  Oracle made zero attempts to outline its future strategy regarding software, and thus most software employees simply kept on doing their work not knowing if the pink slip was arriving tomorrow or not.  Lots of fun that was.
&lt;/p&gt;
&lt;h3&gt;Oracle Doesn&amp;#8217;t Need Our Services &amp;mdash; Larry Don&amp;#8217;t Need No Stinkin&amp;#8217; Cloud&lt;/h3&gt;
&lt;p&gt;
The acquisition finally closed and very shortly afterwards, I got a call from my boss, Lee Bieber, that Oracle wouldn&amp;#8217;t be needing our services.  Monty, Eric, and Stewart had already resigned; none of them had any desire to work for Oracle.  Lee and I had decided to see what they had in mind for us.  Apparently, not much.
&lt;/p&gt;
&lt;p&gt;
Larry Ellison has gone on record that the whole &amp;#8220;cloud thing&amp;#8221; is faddish.  I don&amp;#8217;t know whether Larry understands that cloud computing and infrastructure-as-a-service, platform-as-a-service, and database-as-a-service will eventually put his beloved Oracle cash cow in its place or not.  I don&amp;#8217;t know whether Oracle is planning on embracing the cloud environments which will continue to eat up the market share of more traditional in-house environments upon which their revenue streams depend.  I really don&amp;#8217;t.
&lt;/p&gt;
&lt;p&gt;
But what I &lt;em&gt;do&lt;/em&gt; know is that Rackspace is betting that providing these services is what the future of technology will be about.
&lt;/p&gt;
&lt;h3&gt;Happiness is a Warm Cloud&lt;/h3&gt;
&lt;p&gt;
Our team has landed at Rackspace Cloud.  I&amp;#8217;ve now been down to San Antonio twice to meet with key individuals with whom we&amp;#8217;ll be working closely.  Rackspace is not shy about why the wanted to acquire our team.  They see Drizzle as a database that will provide them an infrastructure piece that will be modular and scalable enough to meet the needs of their very diverse Cloud customers, of which there are many tens of thousands.
&lt;/p&gt;
&lt;p&gt;
Rackspace recognizes that the pain points they feel with traditional MySQL cannot be solved with simple hacks and workarounds, and that to service the needs of so many customers, they will need a database server that thinks of itself as a friendly piece of their infrastructure and not the driver of its applications.  Drizzle&amp;#8217;s core principles of flexibility and focus on scalability align with the goals Rackspace Cloud has for its platform&amp;#8217;s future.
&lt;/p&gt;
&lt;p&gt;
Rackspace is also heavily invested in &lt;a href=&quot;http://incubator.apache.org/cassandra/&quot; title=&quot;Cassandra Project&quot;&gt;Cassandra&lt;/a&gt;, and sees integration of Drizzle and Cassandra as being a key way to add value to its platforms and therefore for its customers.
&lt;/p&gt;
&lt;p&gt;
Rackspace is all about the customers, and this is a really cool thing to experience.  It&amp;#8217;s typical for companies to claim they are all about the customer &amp;mdash; in fact, every company I&amp;#8217;ve ever worked for has claimed this.  Rackspace is the first company I&amp;#8217;ve worked for where you actually feel this spirit, though.  You can see the fanaticism of Rackers and how they view what they do always in terms of service to the customer.  It&amp;#8217;s infectious, and I&amp;#8217;m pretty psyched to be on their team.
&lt;/p&gt;
&lt;p&gt;
Anyway, that&amp;#8217;s my story and I&amp;#8217;m stickin&amp;#8217; to it.  See y&amp;#8217;all on the nets.&lt;/p&gt;</description>
	<pubDate>Mon, 08 Mar 2010 14:31:34 +0000</pubDate>
</item>
<item>
	<title>Eric Day: C++, or Something Like It</title>
	<guid>http://oddments.org/?p=269</guid>
	<link>http://oddments.org/?p=269</link>
	<description>&lt;p&gt;I&amp;#8217;ve developed primarily in C most of my career, and &lt;a href=&quot;http://oddments.org/?p=79&quot;&gt;recently decided&lt;/a&gt; to give C++ a shot as my &amp;#8220;primary language&amp;#8221; due to hacking on Drizzle and MySQL. The past few months I&amp;#8217;ve read and experimented with most features C++ provides over C, including reading &lt;a href=&quot;http://www.aristeia.com/&quot;&gt;Scott Meyer&amp;#8217;s&lt;/a&gt; excellent &amp;#8220;Effective&amp;#8221; series books (highly recommended). Along the way I&amp;#8217;ve been developing a project I&amp;#8217;ve wanted to write for a while, and I&amp;#8217;m finding some features to be problematic. I thought I&amp;#8217;d share these issues so others can be aware of them and perhaps I can learn better workarounds.&lt;/p&gt;
&lt;p&gt;The project I&amp;#8217;ve been working on uses dynamic shared object loading at runtime (using dlopen() and friends), is threaded, and has about every strict compiler warning on you can find and being treated as errors (thanks to Monty Taylor&amp;#8217;s &lt;a href=&quot;https://launchpad.net/pandora-build&quot;&gt;pandora-build&lt;/a&gt; project). I&amp;#8217;m also testing on various architectures and compilers, including Linux, OpenSolaris, and OSX. I also have been trying my best to avoid any dependencies on large C++ libraries like Boost and just stick to the standard language and STL. With these requirements in mind, here are the issues I&amp;#8217;ve run into:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Can&amp;#8217;t Reliably Use Exceptions&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;My first pass relied on exceptions, but this proved problematic on some architectures as soon as custom exceptions were being throw across module boundaries. This comes down to &lt;a href=&quot;http://stackoverflow.com/questions/1458765/g-problem-exception-not-caught&quot;&gt;ABI issues&lt;/a&gt; for some shared object formats generated by some compiler versions. While you can make it work in some environments, it&amp;#8217;s not going to be portable. This means I&amp;#8217;ve had to catch exceptions closer to where they are throw, requiring a lot more try/catch blocks, and not being able to take full advantage of automatic stack cleanup. This also means resorting back to the C way or handling exceptions: returning and checking return codes while generating error strings. To be completely exception safe, this means not using std::string for error returns since they can throw exceptions while building useful error messages. Not using exceptions has had a viral effect throughout the rest of the design of the code, making it look more like C. I was a bit disappointed by this, as not having to check every function&amp;#8217;s return code was keeping the code very clean. :)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Limited Use of the STL and std::string&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I was excited to take advantage of the STL, as writing things like doubly-linked lists and hash tables for every C struct was getting a bit old (I did have a set of macros I used, but they were not the most popular in some circles because of certain C-preprocessor features). When I learned more about the internals of the STL, and how it relies heavily on copying objects, my heart sunk a little. It completely makes sense in the design, it&amp;#8217;s just not as efficient as it could be (especially coming from a place where I would optimize to reduce pointer copies in C). No worries, I just created private copy constructors/assignment operators and only used pointers to objects. This came with it&amp;#8217;s own set of issues with pointer management and avoiding leaks if the &amp;#8216;new&amp;#8217; operator were to fail. Once working out the memory management issues, there were still exceptions to watch out for, including figuring out all the methods that may throw (due to an internal allocation usually). This is especially annoying when doing simple std::string operations like assignment or concatenation, and having to always catch around those. With other annoyances like the &lt;a href=&quot;http://www.velocityreviews.com/forums/t483051-for_each-bind2nd-reference-to-reference-error.html&quot;&gt;reference-to-reference&lt;/a&gt; issues and std::unary_function having a non-virtual destuctor, I&amp;#8217;ve ended up using a watered down set of STL algorithms and resorted to a mix of non-STL containers and custom algorithms for some things. The lack of thread safety concerns in STL containers and differences in implementations have also lead me to not use STL containers for thread communication (using a mutex for every access is not efficient).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;For the sake of consistency, I&amp;#8217;ve wondered if it&amp;#8217;s worth incorporating STL components? Is it better to have a mix or none at all? This would leave only inheritance, polymorphism, member protections, namespaces, and automatic object destruction the only C++ features being used. These are still very good reasons to use C++, but I&amp;#8217;ve found the transition to not be as productive as I had hoped. I am very curious to hear other folks thoughts on their experience with any of the issues above.&lt;/p&gt;</description>
	<pubDate>Sat, 06 Mar 2010 03:23:17 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Roadmap for our next Drizzle release (Cherry)</title>
	<guid>http://blog.drizzle.org/?p=563</guid>
	<link>http://blog.drizzle.org/2010/03/05/roadmap-for-our-next-drizzle-release-cherry/</link>
	<description>&lt;p&gt;Check out &lt;a href=&quot;http://krow.livejournal.com/686178.html&quot; target=&quot;_blank&quot;&gt;Brian&amp;#8217;s blog&lt;/a&gt; which details all the features we are targeting for our next release, code name &lt;a href=&quot;https://launchpad.net/drizzle/cherry&quot; target=&quot;_blank&quot;&gt;Cherry&lt;/a&gt;. Actually in launchpad these are termed &amp;#8220;series&amp;#8221; and within each series we are defining two week milestones to track our progress. Currently looking to complete Cherry by the end of April. &lt;/p&gt;</description>
	<pubDate>Fri, 05 Mar 2010 22:27:35 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Drizzle, Cherry, Roadmap for our Next Release</title>
	<guid>http://krow.livejournal.com/686178.html</guid>
	<link>http://krow.livejournal.com/686178.html</link>
	<description>Its March already? How times flies.&lt;br /&gt;&lt;br /&gt;The last quarter has been a pretty exciting time for all of us working on Drizzle. We completed the Bell milestone back in January and began immediately plowing into Cherry, our next release. Somewhere in the last couple of months we have seen transition of all of the Drizzle developers at Sun moving into full time positions at other companies working on Drizzle, and we have seen the non-Sun developers move into other positions as well (most note'ably Padraig who went to work for Akiban).&lt;br /&gt;&lt;br /&gt;So what is happening for the Cherry release?&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Authorization with LDAP&lt;br /&gt;&lt;br /&gt;We are adding direct support for LDAP in the next release. With this we be able to fetch authorization information from LDAP. All of this work is being done via our plugin system and builds on the work we have done for PAM and HTTP Auth. We know that companies already have identity systems and don't want to have to deal with &quot;yet another system&quot;.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Support for the MySQL Protocol&lt;br /&gt;&lt;br /&gt;Will you support the MySQL protocol? The answer is that we will be supporting the MySQL protocol. Today we support our own protocol but we have decided to go back and support the MiniSQL/MySQL protocol. So how are we going about doing this? There will be a plugin you can load, that we will be testing, that will allow Drizzle to speak the MySQL protocol. So you can leverage all of the drivers you use today. Please note that I said &quot;will be testing&quot;. Up till now no one has ever written a set of unit tests or a &quot;please crash the server&quot; sort of test on that protocol. For us to feel good about supporting the protocol, we have put together a set of tests to do exactly this. You can run the tests on any of the M/M protocol speaking servers that are being shipped today. We have licensed the test system using the BSD license. We did this so that anyone who ships M/M servers today can feel comfortable about making use and extending what we have made available. In the Memcached world we created &lt;a href=&quot;http://torum.net/2009/09/memcapable-and-memcached-binary-protocol/&quot;&gt;Memcapble&lt;/a&gt; in order to allow end users to self certify their Memcached servers. We believe that this same sort of process needs to happen around the M/M protocol as well.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Embedded Innodb&lt;br /&gt;&lt;br /&gt;Stewart Smith is working on moving us off the Innodb plugin, and onto the Innodb Embedded Server. We continue to support Innodb and we believe that moving to the embedded server is the best way to support end users longterm.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Replication Logshipping&lt;br /&gt;&lt;br /&gt;Our ongoing work to enhance replication continues. We are working on adding log shipping to the next version of Drizzle. We will also be removing RAW SQL transport of DDL operations. This allows us to easily take Google Protobuffer messages and translate our schemas into schemas for other databases. We know that data centers are not homogeneous, and that we need to play nicely with other databases.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Query Rewriting&lt;br /&gt;&lt;br /&gt;The first version of query rewriting went into the server last week. This is the first step to us having a full query rewrite system in Drizzle. This allows storage engine vendors to easily adapt to Drizzle in the Data Analytics world, and will allow us to eventually add support for VIEWS. The first version allows for user level rewrites but the second generation that is coming will allow for parsed tree rewrites.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Schemas as real objects.&lt;br /&gt;&lt;br /&gt;In the past a &quot;schema&quot;, aka a &quot;databases&quot;, was just a directory. Now they are fully supported as objects in our system and have their own caching layer. This allows for better integration with engines and provides support for engine writers to do fully transactional DDL on schemas. This is very exciting since it really means that engines are no longer locked into the &quot;MyISAM&quot; shoe.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Information Schema becomes the Data Dictionary&lt;br /&gt;&lt;br /&gt;Goodbye information schema and all of its bugs! No more materialization, no hidden execution paths, and no locks on table and schema lookups. We have transitioned to a system where we now have Table Functions. These allow us to expose more data to the outside world with none of the costs that were associated with the old system. &quot;SHOW&quot; commands are now just query rewrites, and we have been able to further shrink the size of our parser.&lt;br /&gt;&lt;br /&gt;The above sums up all of the big stuff going on for this release, and doesn't include the incoming work for developers or partners who haven't committed to the release. Cheery will be completed by the time we hit the &lt;a href=&quot;http://en.oreilly.com/mysql2010&quot;&gt;O'Reilly MySQL User's Conference&lt;/a&gt; in April. I'll be giving a keynote there on the &lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/12442&quot;&gt;State of Drizzle&lt;/a&gt;. The conference should make for an exciting event!&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;</description>
	<pubDate>Fri, 05 Mar 2010 17:24:47 +0000</pubDate>
</item>
<item>
	<title>Monty Taylor: Hudson Parameterized Matrix Builds</title>
	<guid>http://inaugust.com/post/76</guid>
	<link>http://inaugust.com/post/76</link>
	<description>&lt;p&gt;I've been making some improvements to our use of Hudson recently that have been really helpful.&lt;/p&gt;&lt;p&gt;The first was starting to use a set of parameterized builds. These use the &lt;a href=&quot;http://wiki.hudson-ci.org/display/HUDSON/Parameterized+Trigger+Plugin&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;Parameterized Trigger&lt;/font&gt;&lt;/a&gt; plugin, which allows you to pass parameters to triggered additional jobs when a job finishes. So using these we make a job which checks out the latest source (which should just about always succeed) and then fire off a whole host of jobs running on all of our build hosts. It has a single &amp;quot;build now&amp;quot; submit form which takes a bzr branch location as the branch to build. With this all of our developers can check their tree against the build farm before submitting the branch for merge.&lt;/p&gt;&lt;p&gt;That's great, but as we got more and more build hosts, we had to set up a job on each of them - and then having 4 machines which were all amd64 running Ubuntu 9.10 didn't help - it ran on all of them.&lt;/p&gt;&lt;p&gt;Enter&amp;nbsp;&lt;a href=&quot;http://wiki.hudson-ci.org/display/HUDSON/PlatformLabeler+Plugin&quot;&gt;PlatformLabeler&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.advogato.org/person/robertc/diary.html?start=141&quot;&gt;Robert Collins&lt;/a&gt; wrote a plugin for Hudson which checks a build slave for OS details when it connects (architecture, OS and OS Release) and adds Labels to the slave based on the values it finds. With that - instead of targetting a job to say, hades.inaugust.com, I can target that job to x64_64-Mac-10.4.1. I can easily see both platform coverage, and I can take advantage of having multiple machines with the same config, since it'll run the job on only one of them sharing that label.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The next problem with that setup is that there is not a tight binding between the parent and child jobs. You can see that the parent job triggered the child, but you can't really get a single snapshot of &amp;quot;how did this job work everywhere?&amp;quot; If you're doing this pre-merge request, it might be nice to get a URL you can refer to saying &amp;quot;hey! check it out, it worked&amp;quot;&lt;/p&gt;&lt;p&gt;Enter Matrix Builds.&lt;/p&gt;&lt;p&gt;Matrix Builds are a single job. They allow you to define how you run the job, and then you can select which hosts to run it on. You can also set up arbitrary sets of flags and hudson will build a grid. So in our case, I set up a job (shortened for brevity)&lt;/p&gt;&lt;pre&gt;&amp;nbsp;./config/autorun.sh&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;./configure&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;make distcheck&lt;/pre&gt;&lt;p&gt;Then I told hudson to build it both with and without the --with-debug flag to configure, and on a set of our build hosts. Now when I kick it off, I get a page with an overview of how that particular build went. Also, having one build description means I don't accidentally do something different on one host.&lt;/p&gt;&lt;p&gt;Matrix Builds also have a nice feature for a sentinel or canary build, which let you build first on a host where you're pretty darned sure it's going to build, and then build everywhere else. In our case, if it doesn't build on 64-bit Ubuntu 9.10, it's very unlikely to build anywhere, so we don't bother trying.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I still use the Parameterized Trigger from the Matrix build to kick of jobs for things like Valgrind and Sysbench when the build completes cleanly. Those jobs themselves can be launched independently (if you only wanted to check how valgrind is treating your new branch)&lt;/p&gt;&lt;p&gt;Moving forward, I would love to migrate our main set of build branches to Matrix builds, but Matrix currently lacks support for launching an individual sub-build. If it doesn't show up soon, perhaps I'll add it... ah the joy of open source!&amp;nbsp;&lt;/p&gt;&lt;p&gt;See the Hudson link at &lt;a href=&quot;http://hudson.drizzle.org/view/Drizzle-param/job/drizzle-param/&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#000000&quot;&gt;http://hudson.drizzle.org/view/Drizzle-param/job/drizzle-param/&lt;/font&gt;&lt;/a&gt;  for more details and examples. &lt;/p&gt;</description>
	<pubDate>Wed, 03 Mar 2010 01:43:58 +0000</pubDate>
	<author>Monty Taylor</author>
</item>
<item>
	<title>Brian Aker: Data Dictionary Fun in Drizzle</title>
	<guid>http://krow.livejournal.com/685840.html</guid>
	<link>http://krow.livejournal.com/685840.html</link>
	<description>How often do people get indexing wrong? All the time.  This is a sample table in Drizzle, I'll show how you can view indexes with the new data dictionary code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
drizzle&amp;gt; show create table f;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                      |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| f     | CREATE TABLE `f` (
   `a` int NOT NULL,
   `b` int NOT NULL,
   `c` int NOT NULL,
   PRIMARY KEY (`a`,`b`,`c`),
   KEY `c` (`c`),
   KEY `b` (`b`,`c`)
)  |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
drizzle&amp;gt; select TABLE_NAME, COLUMN_NAME, IS_INDEXED, IS_USED_IN_PRIMARY, IS_UNIQUE, IS_MULTI, IS_FIRST_IN_MULTI, INDEXES_FOUND_IN from data_dictionary.columns WHERE TABLE_NAME=&quot;f&quot;;
+------------+-------------+------------+--------------------+-----------+----------+-------------------+------------------+
| TABLE_NAME | COLUMN_NAME | IS_INDEXED | IS_USED_IN_PRIMARY | IS_UNIQUE | IS_MULTI | IS_FIRST_IN_MULTI | INDEXES_FOUND_IN |
+------------+-------------+------------+--------------------+-----------+----------+-------------------+------------------+
| f          | a           | TRUE       | TRUE               | TRUE      | TRUE     | TRUE              |                1 |
| f          | b           | TRUE       | TRUE               | TRUE      | TRUE     | TRUE              |                2 |
| f          | c           | TRUE       | TRUE               | TRUE      | TRUE     | FALSE             |                3 |
+------------+-------------+------------+--------------------+-----------+----------+-------------------+------------------+
3 rows in set (0 sec)

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What is so cool about the above? Often people over index columns. They will over index the first part of keys not realizing that the first part of key can be used without creating a standalone key.&lt;br /&gt;&lt;br /&gt;These are a few of the design goals in the above:&lt;br /&gt;&lt;br /&gt;1) Give someone an easy view into whether a column is a part of a primary key.&lt;br /&gt;&lt;br /&gt;2) Find out how many times you are indexes one column.&lt;br /&gt;&lt;br /&gt;3) From a glance see what keys are first inline for a multipart key.&lt;br /&gt;&lt;br /&gt;4) Allow a DBA to work with the database to find out problems (don't force them into tools until they need to see the state of clusters).&lt;br /&gt;&lt;br /&gt;Anyone who has ever managed a MySQL database can pretty quickly see how valuable the above is. Doing a JOIN against a log table will quickly show you what queries are running without the advantage of indexes.&lt;br /&gt;&lt;br /&gt;What is especially cool about the above?&lt;br /&gt;&lt;br /&gt;1) None of that data is materialized. We generate the data through table functions which federate data from multiple engines (all using the new Storage Engine interface).&lt;br /&gt;&lt;br /&gt;2) We open zero tables for the above queries. You can query the data dictionary without blowing through the table cache, or anyway affecting your running queries. In the past the information schema would force tables into the table cache in order to get data from them. In our world? We don't require that at all. If you want schema data we can provide it without undermining your active query sessions.&lt;br /&gt;&lt;br /&gt;3) All of the above information is stored in our Google Protobuffer table format. We do no translations, so what you see is always what you get.&lt;br /&gt;&lt;br /&gt;Pretty cool :)</description>
	<pubDate>Tue, 02 Mar 2010 19:56:01 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle build 1317 source tarball has been released</title>
	<guid>http://blog.drizzle.org/?p=553</guid>
	<link>http://blog.drizzle.org/2010/03/02/drizzle-build-1317-source-tarball-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on build 1317 has been released.  There was a lot of clean up and removal of dead code from Stewart as he continues to work on integrating embedded innodb.  Brian added a data_dictionary schema and also did a  complete rewrite of the SHOW commands.&lt;/p&gt;
&lt;p&gt;The Drizzle download file and change log can be found &lt;a href=&quot;https://launchpad.net/drizzle/cherry/2010-03-01&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 02 Mar 2010 17:46:43 +0000</pubDate>
</item>
<item>
	<title>Padraig O'Sullivan: Schema-Free Drizzle!</title>
	<guid>http://schacon.github.com//2010/03/02/schema-free-drizzle</guid>
	<link>http://feedproxy.google.com/~r/posulliv/~3/9DW1UOLlcto/schema-free-drizzle.html</link>
	<description>I came across this &lt;a href=&quot;http://www.igvita.com/2010/03/01/schema-free-mysql-vs-nosql/&quot;&gt;post&lt;/a&gt; from 
&lt;a href=&quot;http://www.igvita.com&quot;&gt;Ilya Grigorik&lt;/a&gt; on &lt;a href=&quot;http://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt; 
yesterday and I figured I just had to implement this in Drizzle now with the new query rewriting
interface that I mentioned &lt;a href=&quot;http://posulliv.github.com/2010/03/01/query-rewrite.html&quot;&gt;yesterday&lt;/a&gt;.
The awesome thing about Drizzle is that I can try all these ideas out easily by just implementing a
plugin.
&lt;br /&gt;

Any SQL statements we want to use on our schema-free constructs, we have to prefix with the string
'nos'. With that said, here is a session demonstrating this query rewriting plugin:

&lt;pre&gt;
Your Drizzle connection id is 2
Server version: 7 Source distribution (schema-less)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

drizzle&gt; use test;
Database changed
drizzle&gt; nos create table widgets;
Query OK, 0 rows affected (0.06 sec)

drizzle&gt; nos insert into widgets (id,name) values ('a', 'apple');
Query OK, 1 row affected (0.19 sec)

drizzle&gt; nos insert into widgets (id,name,type) values ('b', 'blackberry', 'phone');
Query OK, 1 row affected (0.21 sec)

drizzle&gt; nos select * from widgets;
+------+------------+-------+
| id   | name       | type  |
+------+------------+-------+
| a    | apple      | NULL  | 
| b    | blackberry | phone | 
+------+------------+-------+
2 rows in set (0 sec)

drizzle&gt; nos select * from widgets where id = 'a';
+------+-------+------+
| id   | name  | type |
+------+-------+------+
| a    | apple | NULL | 
+------+-------+------+
1 row in set (0 sec)

drizzle&gt;
&lt;/pre&gt;
&lt;br /&gt;

The code for this is available on Launchpad (lp:~posulliv/drizzle/schema-less). I threw this
together in a few hours today for fun so it is what it is.</description>
	<pubDate>Tue, 02 Mar 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Stewart Smith: Writing A Storage Engine for Drizzle, Part 1: Plugin basics</title>
	<guid>http://www.flamingspork.com/blog/?p=1811</guid>
	<link>http://www.flamingspork.com/blog/2010/03/01/writing-a-storage-engine-for-drizzle-part-1-plugin-basics/</link>
	<description>&lt;p&gt;So, you&amp;#8217;ve decided to write a Storage Engine for Drizzle. This is excellent news! The API is continually being improved and if you&amp;#8217;ve worked on a Storage Engine for MySQL, you&amp;#8217;ll notice quite a few differences in some areas.&lt;/p&gt;
&lt;p&gt;The first step is to create a skeleton StorageEngine plugin.&lt;/p&gt;
&lt;p&gt;You can see my skeleton embedded_innodb StorageEngine plugin in its &lt;a href=&quot;https://code.launchpad.net/~stewart-flamingspork/drizzle/skeleton-embedded-innodb-engine/+merge/19313&quot;&gt;merge request&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The important steps are:&lt;/p&gt;
&lt;h2&gt;1. Create the plugin directory&lt;/h2&gt;
&lt;p&gt;e.g. &lt;code&gt;mkdir plugin/embedded_innodb&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;2. Create the plugin.ini file describing the plugin&lt;/h2&gt;
&lt;p&gt;create the plugin.ini file in the plugin directory (so it&amp;#8217;s &lt;code&gt;plugin/plugin_name/plugin.ini&lt;/code&gt;)&lt;br /&gt;
An example plugin.ini for embedded_innodb is.&lt;/p&gt;
&lt;pre&gt;[plugin]
title=InnoDB Storage Engine using the Embedded InnoDB library
description=Work in progress engine using libinnodb instead of including it in tree.
sources=embedded_innodb_engine.cc
headers=embedded_innodb_engine.h&lt;/pre&gt;
&lt;p&gt;This gives us a title and description, along with telling the build system what sources to compile and what headers to make sure to include in any source distribution.&lt;/p&gt;
&lt;h2&gt;3. Add plugin dependencies&lt;/h2&gt;
&lt;p&gt;Your plugin may require extra libraries on the system. For example, the embedded_innodb plugin uses the Embedded InnoDB library (libinnodb).&lt;/p&gt;
&lt;p&gt;Other examples include the MD5 function requiring either openssl or gnutls, the gearman related plugins requiring gearman libraries, the &lt;code&gt;UUID()&lt;/code&gt; function requiring libuuid and BlitzDB requiring Tokyo Cabinet libraries.&lt;/p&gt;
&lt;p&gt;For embedded_innodb, pandora-build has a macro for finding libinnodb on the system. We want to run this configure check, so we create a plugin.ac file in the plugin directory (i.e. &lt;code&gt;plugin/plugin_name/plugin.ac&lt;/code&gt;) and add the check to it.&lt;/p&gt;
&lt;p&gt;For embedded_innodb, the plugin.ac file just contains this one line:&lt;/p&gt;
&lt;pre&gt;PANDORA_HAVE_LIBINNODB&lt;/pre&gt;
&lt;p&gt;We also want to add two things to plugin.ini; one to tell the build system only to build our plugin if libinnodb was found and the other to link our plugin with libinnodb. For embedded_innodb, it&amp;#8217;s these two lines:&lt;/p&gt;
&lt;pre&gt;build_conditional=&quot;x${ac_cv_libinnodb}&quot; = &quot;xyes&quot;
ldflags=${LTLIBINNODB}&lt;/pre&gt;
&lt;div&gt;Not too hard at all! This should look relatively familiar for those who have seen autoconf and automake in the past.&lt;/div&gt;
&lt;p&gt;Some plugins (such as the md5 function) have a bit more custom auto-foo in plugin.ini and plugin.ac (as one of two libraries can be used). You can do pretty much anything with the plugin system, but you&amp;#8217;re a lot more likely to keep it simple like we have here.&lt;/p&gt;
&lt;h2&gt;4. Add skeleton source code for your StorageEngine&lt;/h2&gt;
&lt;p&gt;While this will change a little bit over time (and is a little long to just paste into here), you can see what I did for embedded_innodb in the &lt;a href=&quot;https://code.launchpad.net/~stewart-flamingspork/drizzle/skeleton-embedded-innodb-engine&quot;&gt;skeleton-embedded-innodb-engine&lt;/a&gt; tree.&lt;/p&gt;
&lt;h2&gt;5. Build!&lt;/h2&gt;
&lt;p&gt;You will need to re-run &lt;code&gt;./config/autorun.sh&lt;/code&gt; so the build system picks up your new plugin. When you run &lt;code&gt;./configure --help&lt;/code&gt; afterwards, you should see options for building with/without your new plugin.&lt;/p&gt;
&lt;h2&gt;6. Add a test&lt;/h2&gt;
&lt;p&gt;You will probably want to add a test to see that your plugin loads successfully. When your plugin is built, the test suite automatically picks up any tests you have in the &lt;code&gt;plugin/plugin_name/tests&lt;/code&gt; directory. This is in the same format as general MySQL and Drizzle tests: tests go in a &lt;code&gt;t/&lt;/code&gt; directory, expected results in a &lt;code&gt;r/&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;Since we are loading a plugin, we will also need some server options to make sure that plugin is loaded. These are stored in the rather inappropriately named &lt;code&gt;test-master.opt&lt;/code&gt; file (that&amp;#8217;s the test name with &amp;#8220;&lt;code&gt;-master.opt&lt;/code&gt;&amp;#8221; appended to the end instead of &amp;#8220;&lt;code&gt;.test&lt;/code&gt;&amp;#8220;). For the embedded_innodb plugin_load test, we have a &lt;code&gt;﻿plugin/embedded_innodb/tests/t/plugin_load-master.opt&lt;/code&gt; file with the following content:&lt;/p&gt;
&lt;pre&gt;﻿--plugin_add=embedded_innodb&lt;/pre&gt;
&lt;p&gt;You can have pretty much anything in the plugin_load.test file&amp;#8230; if you&amp;#8217;re fancy, you&amp;#8217;ll have a &lt;code&gt;SELECT&lt;/code&gt; query on &lt;code&gt;data_dictionary.plugins&lt;/code&gt; to check that the plugin really is there. Be sure to also add a &lt;code&gt;r/plugin_load.result&lt;/code&gt; file (My preferred method is to just create an empty result file, run the test suite and examine the rejected output before renaming the &lt;code&gt;.reject&lt;/code&gt; file to &lt;code&gt;.result&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Once you&amp;#8217;ve added your test, you can run it either by just typing &amp;#8220;&lt;code&gt;make test&lt;/code&gt;&amp;#8221; (which will run the whole test suite), or you can go into the main &lt;code&gt;tests/&lt;/code&gt; directory and run &lt;code&gt;./test-run.pl --suite=plugin_name&lt;/code&gt; (which will just run the tests for your plugin).&lt;/p&gt;
&lt;h2&gt;7. Check the code in, feel good about self&lt;/h2&gt;
&lt;p&gt;and you&amp;#8217;re done. Well&amp;#8230; the start of a Storage Engine plugin is done :)&lt;/p&gt;</description>
	<pubDate>Mon, 01 Mar 2010 13:40:27 +0000</pubDate>
</item>
<item>
	<title>Padraig O'Sullivan: Query Rewriting Plugin Point for Drizzle</title>
	<guid>http://schacon.github.com//2010/03/01/query-rewrite</guid>
	<link>http://feedproxy.google.com/~r/posulliv/~3/StLs8TZS62g/query-rewrite.html</link>
	<description>One of the first tasks in my new position at &lt;a href=&quot;http://akibainc.com&quot;&gt;Akiban&lt;/a&gt; was to create
a plugin point within Drizzle for query rewriting.
&lt;br /&gt;

The first decision to make was where to insert a plugin point for a query rewriter. The parsed
representation of a query would seem like a natural thing to pass to a query rewriter plugin since
the plugin would not have to implement its own parser then. However, the parsed representation of a
query in Drizzle is not the easiest in the world to deal with right now so passing this to a plugin
would make developing a rewriting plugin quite difficult. Thus, I made the decision to create the
plugin point before parsing occurs.
&lt;br /&gt;

This means that if a
plugin developer wants to do some complex rewriting, they may need to parse the query in their
plugin. It may not be ideal but it does make the plugin API for query rewriting quite simple and opens
up a lot of interesting opportunities.
&lt;br /&gt;

Following the lead of other plugin interfaces such as the replication API developed by &lt;a href=&quot;http://jpipes.com&quot;&gt;Jay&lt;/a&gt;, I wanted to keep it as simple and easy to understand as possible.
With that in mind, here is the entire API for a query rewriting plugin:&lt;br /&gt;


&lt;br /&gt;

Thus, all a plugin developer needs to do is implement the rewrite() function within their plugin.
The query is passed by reference as a std::string so a plugin can do whatever it likes to this
string and this string will then be passed to the parser in the Drizzle core kernel for parsing.
&lt;br /&gt;

This interface opens up a lot of possibilties for interesting plugins. For example, one could
develop a plugin to analyze a query for common SQL injection patterns or develop a plugin to rewrite
a query based on a set of rules. I would be really interested in hearing other ideas people reading
this have for plugins using this interface?
&lt;br /&gt;</description>
	<pubDate>Mon, 01 Mar 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: DATE type under the hood in Drizzle/MySQL</title>
	<guid>http://torum.net/?p=2338</guid>
	<link>http://torum.net/2010/03/date-type-and-drizzle/</link>
	<description>&lt;p&gt;Learned something new from my own bug in BlitzDB today. The problem was that writing a DATE column index would always return a duplicate key error (regardless of what I feed it). There are two suspicious candidates that can cause this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comparison Function has a defect.&lt;/li&gt;
&lt;li&gt;Key Generator has a defect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The latter suspect was going to be tricky if it was true since BlitzDB currently uses Drizzle&amp;#8217;s native &amp;#8220;field packer&amp;#8221; (except for VARCHAR) inherited from MySQL. This would mean that Drizzle&amp;#8217;s field system has a bug in it which was somewhat difficult to believe. Furthermore, you should always blame yourself before you start suspecting other people&amp;#8217;s code. So, I decided to look into the comparison function which was completely written by me. Turned out that&amp;#8217;s where the bug was.&lt;/p&gt;
&lt;h3&gt;Comparison Function&lt;/h3&gt;
&lt;p&gt;Allow me to quickly clarify what I mean by &amp;#8220;comparison function&amp;#8221; in this context. TC&amp;#8217;s B+Tree API has an interface that allows you to provide your own comparison function for all operations that involves traversing.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;c&quot;&gt;bool tcbdbsetcmpfunc&lt;span&gt;&amp;#40;&lt;/span&gt;TCBDB &lt;span&gt;*&lt;/span&gt;bdb&lt;span&gt;,&lt;/span&gt; TCCMP cmp&lt;span&gt;,&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; &lt;span&gt;*&lt;/span&gt;cmpop&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What BlitzDB&amp;#8217;s comparison function callback does is, it looks at the data type of the values to be compared and performs appropriate processing on the values then compares them. You can also look at it as a long switch statement. For those that are interested, this code is in &lt;a href=&quot;http://bazaar.launchpad.net/%7Etmaesaka/blitzdb/trunk/annotate/head%3A/plugin/blitzdb/blitzcmp.cc&quot;&gt;blitzcmp.cc&lt;/a&gt; (blitz_keycmp_cb).&lt;/p&gt;
&lt;h3&gt;DATE under the hood&lt;/h3&gt;
&lt;p&gt;After inspecting the &amp;#8220;type number&amp;#8221; with GDB and looking at the corresponding ha_base_keytype enum, it turns out that the DATE type is internally represented as an unsigned 3 byte integer (HA_KEYTYPE_UINT24). This was pleasant to discover since I&amp;#8217;ve been wondering what a 3 byte integer is still used for in Drizzle. The problem I had was that I didn&amp;#8217;t take this type into account in the comparator and it also showed how silly I am since the answer was always there.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html&quot;&gt;10.5. Data Type Storage Requirements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the question is should it be kept this way? Respect alignment or reduce total I/O and space by keeping it this way? This should hopefully be a fun discussion to have in the Drizzle community :)&lt;/p&gt;
&lt;p&gt;P.S. My two cents is that it should respect alignment since folks that seek performance should have most of their data on memory. Respecting alignment in this environment should make some difference. Although, I can only say this after benchmarking it of course.&lt;/p&gt;</description>
	<pubDate>Mon, 01 Mar 2010 07:24:39 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Log Buffer #180: a Carnival of the Vanities for DBAs</title>
	<guid>http://www.pythian.com/news/?p=8937</guid>
	<link>http://www.pythian.com/news/8937/log-buffer-180-a-carnival-of-the-vanities-for-dbas/</link>
	<description>&lt;p&gt;Hello and welcome to &lt;em&gt; Log Buffer #180&lt;/em&gt;.  Time&amp;#8217;s a-wastin&amp;#8217;, so let&amp;#8217;s go!&lt;/p&gt;
&lt;h3&gt;Oracle&lt;/h3&gt;
&lt;p&gt;There was so much Oracle stuff this week that I&amp;#8217;ve decided to cram a little more of it into &lt;em&gt;Log Buffer&lt;/em&gt; by providing a little less context than usual.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jonathanlewis.wordpress.com&quot;&gt;&lt;strong&gt;Jonathan Lewis&lt;/strong&gt;&lt;/a&gt; shares an explication of &lt;a href=&quot;http://jonathanlewis.wordpress.com/2010/01/26/aliases/&quot;&gt;aliases&lt;/a&gt;: &amp;#8220;I was asked the following question recently: &amp;#8216;Does the use of table aliases affect performance?&amp;#8217; To which the best answer is probably &amp;#8216;Yes, though in general you probably won’t notice the difference and there are reasons more imporant [sic] than performance for using table aliases.&amp;#8217;&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://oracledoug.com/serendipity&quot;&gt;&lt;strong&gt;Doug Burns&lt;/strong&gt;&lt;/a&gt; continues his most recent series: &lt;a href=&quot;http://oracledoug.com/serendipity/index.php?/archives/1563-Statistics-on-Partitioned-Tables-Part-2.html&quot;&gt;Statistics on Partitioned Tables &amp;#8211; Part 2&lt;/a&gt;, and &lt;a href=&quot;http://oracledoug.com/serendipity/index.php?/archives/1565-Statistics-on-Partitioned-Tables-Part-3.html&quot;&gt;Statistics on Partitioned Tables &amp;#8211; Part 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://orajourn.blogspot.com&quot;&gt;&lt;strong&gt;Charles Schultz&lt;/strong&gt;&lt;/a&gt; demonstrates how &lt;a href=&quot;http://orajourn.blogspot.com/2010/02/vpd-bad-anydata-practices-can-really.html&quot;&gt;VPD + bad ANYDATA practices can really bite&lt;/a&gt;: &amp;#8220;The point of my blog was that using CAST can really screw up your data. Oracle Support is filing a bug on this behavior, as it looks like an overflow problem.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Pythian&amp;#8217;s &lt;strong&gt;Gleb Otochkin&lt;/strong&gt; begins a series on &lt;a href=&quot;http://www.pythian.com/news/7959/oracle-goldengate-installation-part-1&quot;&gt;Oracle GoldenGate installation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://guyharrison.squarespace.com/blog&quot;&gt;&lt;strong&gt;Guy Harrison&lt;/strong&gt;&lt;/a&gt; provides a thorough introduction and recommendations on &lt;a href=&quot;http://guyharrison.squarespace.com/blog/2010/2/22/memory-management-for-oracle-databases-on-vmware-esx.html&quot;&gt;memory management for Oracle databases on VMWare ESX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://thinkoracle.blogspot.com&quot;&gt;&lt;strong&gt;Robert Vollman&lt;/strong&gt;&lt;/a&gt; returns to blogging and offers his 10-point plan on &lt;a href=&quot;http://thinkoracle.blogspot.com/2010/02/improving-your-sql-queries.html&quot;&gt;improving your SQL queries&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jkstill.blogspot.com&quot;&gt;&lt;strong&gt;Jared Still&lt;/strong&gt;&lt;/a&gt; sheds some light on &lt;a href=&quot;http://jkstill.blogspot.com/2010/02/cool-but-unknown-rman-feature.html&quot;&gt;a cool but unknown RMAN feature&lt;/a&gt;. &lt;span id=&quot;more-8937&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://richardfoote.wordpress.com&quot;&gt;&lt;strong&gt;Richard Foote&lt;/strong&gt;&lt;/a&gt; knocks holes in another myth: &amp;#8220;One of the &lt;a href=&quot;http://richardfoote.wordpress.com/2010/02/18/myth-bitmap-indexes-with-high-distinct-columns-blow-out&quot;&gt;great myths in Oracle is that bitmap indexes are only suitable and should only be used with columns that have so-called low cardinality (few distinct) values.&lt;/a&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.red-database-security.com&quot;&gt;&lt;strong&gt;Alexander Kornbrust&lt;/strong&gt;&lt;/a&gt; shares a link to &lt;a href=&quot;http://blog.red-database-security.com/2010/02/22/really-good-whitepaper-about-hacking-oracle-from-the-web/&quot;&gt;a really good whitepaper about “Hacking Oracle from the Web”&lt;/a&gt; by Sumit Siddarth.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://awads.net/wp&quot;&gt;&lt;strong&gt;Eddie Awad&lt;/strong&gt;&lt;/a&gt; shares a link to a &lt;a href=&quot;http://awads.net/wp/2010/02/22/sql-injection-prevention-cheat-sheet/&quot;&gt;SQL injection prevention cheat sheet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hoopercharles.wordpress.com&quot;&gt;&lt;strong&gt;Charles Hooper&lt;/strong&gt;&lt;/a&gt; answers the question, &lt;a href=&quot;http://hoopercharles.wordpress.com/2010/02/19/what-is-the-meaning-of-the-cpu-column-in-an-explain-plan&quot;&gt;What is the meaning of the %CPU column in an explain plan?&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Meanwhile, &lt;a href=&quot;http://prutser.wordpress.com&quot;&gt;&lt;strong&gt;Harald van Breederode&lt;/strong&gt;&lt;/a&gt; does the same for this one: &lt;a href=&quot;http://prutser.wordpress.com/2010/02/21/why-does-the-size-of-my-oracle_home-increase&quot;&gt;Why does the size of my ORACLE_HOME increase?&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;SQL Server&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://thomaslarock.com&quot;&gt;&lt;strong&gt;Thomas LaRock&lt;/strong&gt;&lt;/a&gt; gives an &lt;a href=&quot;http://thomaslarock.com/2010/02/mvp-summit-recap&quot;&gt;recap of MS&amp;#8217;s 2010 MVP Summit&lt;/a&gt;. Quotable take-away: &amp;#8220;If I had to compare SQL 2008 R2 to SQL Server 4.0, I would say the difference is the same as comparing an F1 race car to a Chevy Vega.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Half a world away, there is the &lt;a href=&quot;http://sqlblogcasts.com/blogs/simons/archive/2010/02/21/SQLSocial-Event---London-March-16th.aspx&quot;&gt;SQLSocial Event &amp;#8211; London March 16th&lt;/a&gt;, as advertised by &lt;a href=&quot;http://sqlblogcasts.com/blogs/simons&quot;&gt;&lt;strong&gt;Simon Sabin&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Simon also shares a &lt;a href=&quot;http://sqlblogcasts.com/blogs/simons/archive/2010/02/23/Script-to-get-indexes-and-their-included-columns.aspx&quot;&gt;script to get indexes and their included columns&lt;/a&gt;, beginning, &amp;#8220;I get increasingly frustrated with the lack of visibility of included columns in management studio and from the system stored procedures sp_&amp;#8230; This is a query that returns all indexes and there key and include columns[.]&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sqlblog.com/blogs/andy_leonard&quot;&gt;&lt;strong&gt;Andy Leonard&lt;/strong&gt;&lt;/a&gt; throws us another nourishing &lt;a href=&quot;http://sqlblog.com/blogs/andy_leonard/archive/2010/02/19/ssis-snack-conditional-split-outputs.aspx&quot;&gt;SSIS snack: conditional split outputs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s &lt;a href=&quot;http://sqlblog.com/blogs/rob_farley&quot;&gt;&lt;strong&gt;Rob Farley&lt;/strong&gt;&lt;/a&gt; with a &lt;a href=&quot;http://sqlblog.com/blogs/rob_farley/archive/2010/02/19/book-review-oldie-but-a-goodie-inside-sql-2005-query-tuning-and-optimization.aspx&quot;&gt;book review of an oldie but a goodie: Inside SQL 2005 Query Tuning and Optimization&lt;/a&gt;, by &lt;strong&gt;Kalen Delaney&lt;/strong&gt; et al. &amp;#8220;If you spend any time tuning SQL Server databases, then this book will feel much thicker than it really is, and you&amp;#8217;ll be finding useful information on just about every page.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thomas LaRock&lt;/strong&gt;, meanwhile,  writes that &lt;em&gt;SQL Server 2008 Query Performance Tuning Distilled&lt;/em&gt; is&lt;br /&gt;
&lt;a href=&quot;http://thomaslarock.com/2010/02/good-way-to-start-your-day/&quot;&gt;a good way to start your day&lt;/a&gt;. &amp;#8220;Each morning, while I wait for my desktop to boot, I pick up their book, turn to any page, and just start reading.&amp;#8221;&lt;/p&gt;
&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;p&gt;Sticking with the theme a little longer, here is &lt;a href=&quot;http://www.xaprb.com/blog&quot;&gt;&lt;strong&gt;Baron Schwartz&lt;/strong&gt;&lt;/a&gt; with &lt;a href=&quot;http://www.xaprb.com/blog/2010/02/19/a-review-of-understanding-mysql-internals-by-sasha-pachev&quot;&gt;a review of Understanding MySQL Internals by Sasha Pachev&lt;/a&gt;. &amp;#8220;I should have read this book a long time ago, and it’s my loss that I didn’t. &amp;nbsp;.&amp;nbsp;.&amp;nbsp;.&amp;nbsp; Overall, this book is easily a high 4 stars on a scale of 5, and again, anyone seriously using MySQL should have it.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Baron also shares a link to Oracle guy &lt;a href=&quot;http://www.xaprb.com/blog/2010/02/22/cary-millsap-thinking-clearly-about-performance/&quot;&gt;&lt;strong&gt;Cary Millsap&amp;#8217;s&lt;/strong&gt; &lt;em&gt;Thinking Clearly about Performance&lt;/em&gt;&lt;/a&gt; paper.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://krow.livejournal.com&quot;&gt;&lt;strong&gt;Brian &amp;#8220;Krow&amp;#8221; Aker&lt;/strong&gt;&lt;/a&gt; starts an extensive conversation with his post, &lt;a href=&quot;http://krow.livejournal.com/684068.html&quot;&gt;Protocols, The GPL, Influences from MySQL&lt;/a&gt;.  His thesis, &amp;#8220;MySQL was the company that had the most influence on how companies and investors viewed the GPL.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.pythian.com/news/author/vallee&quot;&gt;&lt;strong&gt;Paul Vall&amp;eacute;e&lt;/strong&gt;&lt;/a&gt; of Pythian responds with his ideas on &lt;a href=&quot;http://www.pythian.com/news/8867/product-management-effective-developers-and-the-future-of-mysql&quot;&gt;product management, effective developers, and the future of MySQL&lt;/a&gt;.  &amp;#8220;&amp;nbsp;.&amp;nbsp;.&amp;nbsp;.&amp;nbsp;the future of MySQL, Drizzle, Monty Program, the Percona fork, etc.&amp;#8221; to be more precise.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bytebot.net/blog&quot;&gt;&lt;strong&gt;Colin Charles&lt;/strong&gt;&lt;/a&gt; provides news of what&amp;#8217;s been happening &lt;a href=&quot;http://www.bytebot.net/blog/archives/2010/02/23/recently-in-mariadb-1&quot;&gt;recently in MariaDB #1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://mohammadlahlouh.blogspot.com&quot;&gt;&lt;strong&gt;Mohammad Lahlouh&lt;/strong&gt;&lt;/a&gt; wonders, &lt;a href=&quot;http://mohammadlahlouh.blogspot.com/2010/02/can-i-use-latin1-to-store-utf8-data.html&quot;&gt;can I use latin1 to store utf8 data?&lt;/a&gt; and gets several answers from his readers.&lt;/p&gt;
&lt;p&gt;He might have asked &lt;a href=&quot;http://ronaldbradford.com/blog&quot;&gt;&lt;strong&gt;Ronald Bradford&lt;/strong&gt;&lt;/a&gt;, who knows this stuff.  Here is his post on &lt;a href=&quot;http://ronaldbradford.com/blog/migrating-mysql-latin1-to-utf8-preparation-2-2010-02-22/&quot;&gt;migrating MySQL latin1 to utf8 – character set options&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pursuing a similar matter (collations), &lt;a href=&quot;http://rpbouman.blogspot.com&quot;&gt;&lt;strong&gt;Roland Bouman&lt;/strong&gt;&lt;/a&gt; opines, &lt;a href=&quot;http://rpbouman.blogspot.com/2010/02/mysql-best-stored-routine-is-one-you.html&quot;&gt;the best stored routine is the one you don&amp;#8217;t write&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;PostgreSQL&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Baron Schwartz&lt;/strong&gt; again!  He announces, &lt;a href=&quot;http://www.xaprb.com/blog/2010/02/20/mk-query-digest-now-supports-postgres-logs/&quot;&gt;mk-query-digest now supports Postgres logs&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://people.planetpostgresql.org/dfetter&quot;&gt;&lt;strong&gt;David Fetter&lt;/strong&gt;&lt;/a&gt; says, &lt;a href=&quot;http://people.planetpostgresql.org/dfetter/index.php?/archives/51-Partitioning-Is-Such-Sweet-Sorrow.html&quot;&gt;part(ition)ing is such sweet sorrow&lt;/a&gt;. &amp;#8220;There are excellent references on partitioning tables that depend on one table, but what happens when you need to partition the referenced table? Let&amp;#8217;s find out!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://momjian.us/main/blogs/pgblog&quot;&gt;&lt;strong&gt;Bruce Momjian&lt;/strong&gt;&lt;/a&gt; is here with news on the &lt;a href=&quot;http://momjian.us/main/blogs/pgblog/2010.html#February_20_2010&quot;&gt;Python driver confusion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jon Jensen&lt;/strong&gt; of &lt;a href=&quot;http://blog.endpoint.com/&quot;&gt;End Point&amp;#8217;s Blog&lt;/a&gt; posts a HOWTO on &lt;a href=&quot;http://blog.endpoint.com/2010/02/postgresql-ec2-ebs-raid0-snapshot.html&quot;&gt;PostgreSQL EC2/EBS/RAID 0 snapshot backup&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;NoSQL, Etc.&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://prodlife.wordpress.com&quot;&gt;&lt;strong&gt;Chen Shapira&lt;/strong&gt;&lt;/a&gt; has been at the compass and protractor, &lt;a href=&quot;http://prodlife.wordpress.com/2010/02/19/mapping-the-nosql-space/&quot;&gt;mapping the NoSQL space&lt;/a&gt; and returns from &lt;em&gt;terra incognita&lt;/em&gt; unscathed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ronald Bradford&lt;/strong&gt; has been &lt;a href=&quot;http://ronaldbradford.com/blog/getting-started-with-cassandra-2010-02-23/&quot;&gt;getting started with Cassandra&lt;/a&gt;, one of the outposts on Chen&amp;#8217;s map, and shares his steps.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sqlblog.com/blogs/arnie_rowland&quot;&gt;&lt;strong&gt;Arnie Rowland&lt;/strong&gt;&lt;/a&gt; says, &amp;#8220;Mark your calendar! &lt;a href=&quot;http://sqlblog.com/blogs/arnie_rowland/archive/2010/02/22/it-will-happen-on-a-spring-day-in-may.aspx&quot;&gt;Portland SQLSaturday/CodeCamp/Barcamp 2010&lt;/a&gt; is scheduled for May 22, 2010, at the University of Portland campus. &amp;nbsp;.&amp;nbsp;.&amp;nbsp;.&amp;nbsp; Portland SQLSaturday is encouraging presentations related to interoperability of any of the SQL platforms, including T-SQL (SQL Server), PostgreSQL, MySQL, and PL-SQL. Abstracts for Platform specific sessions are also encouraged.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Okay, that is all for this edition.  You guys are running me ragged!  Fortunately, &lt;strong&gt;Gary Myers&lt;/strong&gt; picks it up next week on his &lt;a href=&quot;http://blog.sydoracle.com/&quot;&gt;Sydney Oracle Lab&lt;/a&gt;.  Till then!&lt;/p&gt;</description>
	<pubDate>Fri, 26 Feb 2010 18:04:21 +0000</pubDate>
</item>
<item>
	<title>Padraig O'Sullivan: Installing SystemTap on Ubuntu</title>
	<guid>http://schacon.github.com//2010/02/26/installing-stap</guid>
	<link>http://feedproxy.google.com/~r/posulliv/~3/h8OthWQt6zU/installing-stap.html</link>
	<description>I'm presenting at the MySQL user's conference this year and one of my &lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/12472&quot;&gt;talks&lt;/a&gt; is on using SystemTap and DTrace
with MySQL and Drizzle. I'm also doing a tutorial with &lt;a href=&quot;http://jpipes.com&quot;&gt;Jay Pipes&lt;/a&gt; on
developing replication plugins for Drizzle and that should be a lot of fun.
&lt;br /&gt;

I wanted to write some posts before the conference that I can reference
within my talk which detail how to install &lt;a href=&quot;http://sourceware.org/systemtap/&quot;&gt;SystemTap&lt;/a&gt; and configure Drizzle and MySQL for use with
SystemTap. Thus, this post is on how to install SystemTap on Ubuntu while my next post
will go in to details about how to configure MySQL and Drizzle for use with SystemTap.
&lt;br /&gt;

Before starting, its worth noting that this post is specific to Ubuntu 9.10. The procedure to follow
may be different on other versions so its worth keeping that in my mind. The first thing we do is
install systemtap and some associated packages which will be needed by Drizzle and MySQL:

&lt;pre&gt;
$ sudo apt-get install systemtap
$ sudo apt-get install systemtap-sdt-dev
&lt;/pre&gt;

Now, being used to Ubuntu, you would think you are good to go now. Unfortunately, attempting to run
SystemTap will probably give you the following error:

&lt;pre&gt;
$ stap -e 'probe kernel.function(&quot;sys_open&quot;) {log(&quot;hello world&quot;) exit()}'
semantic error: libdwfl failure (missing x86_64 kernel/module debuginfo under
'/lib/modules/2.6.31-19-generic/build'): No such file or directory while resolving probe point
kernel.function(&quot;sys_open&quot;)
semantic error: no probes found
Pass 2: analysis failed.  Try again with another '--vp 01' option.
$
&lt;/pre&gt;

The above error occurs because SystemTap needs to have a debug version of the kernel available.
Unfortunately, installing the debug information for a kernel on ubuntu is not a trivial operation to
perform. In fact, there is a &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/linux/+bug/289087&quot;&gt;bug&lt;/a&gt; on Launchpad about this
issue. Thus, we will build a kernel debug package from source ourselves. This can be done as
follows:

&lt;pre&gt;
$ cd $HOME
$ sudo apt-get install dpkg-dev debhelper gawk
$ mkdir tmp
$ cd tmp
$ sudo apt-get build-dep --no-install-recommends linux-image-$(uname -r)
$ apt-get source linux-image-$(uname -r)
$ cd linux-2.6.31 (this is currently the kernel version of 9.10)
$ fakeroot debian/rules clean
$ AUTOBUILD=1 fakeroot debian/rules binary-generic skipdbg=false
$ sudo dpkg -i ../linux-image-debug-2.6.31-19-generic_2.6.31-19.56_amd64.ddeb
&lt;/pre&gt;

This builds a debug image of the kernel and so will take quite a while. Once we have the above
completed, we can try running our hello world example with SystemTap again. In order to get some
output, you should open or create some file on the system in another terminal window. In this
example, I backgrounded the stap process and created a file:

&lt;pre&gt;
$ sudo stap -e 'probe kernel.function(&quot;sys_open&quot;) {log(&quot;hello world&quot;) exit()}' &amp;amp;
[1] 951
$ touch /tmp/padraig
$ hello world
$ [1]+ Done
&lt;/pre&gt;

Installing SystemTap on CentOS is significantly easier since it is primarily developed by Red Hat. A
good article on how to install it on CentOS is available &lt;a href=&quot;http://sourceware.org/systemtap/wiki/SystemTapOnCentOS&quot;&gt;here&lt;/a&gt;. 
&lt;br /&gt;

In my next post on the topic, I'll explain how to configure MySQL and Drizzle for SystemTap and give
some simple examples of using SystemTap with them.</description>
	<pubDate>Fri, 26 Feb 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Stephen O'Grady: Data vs Dual Licensing: Which Will Make More Money?</title>
	<guid>http://redmonk.com/sogrady/?p=3473</guid>
	<link>http://feedproxy.google.com/~r/tecosystems/~3/zaHJh_5lIz4/</link>
	<description>&lt;div class=&quot;tweetmeme_button&quot;&gt;
			&lt;a href=&quot;http://api.tweetmeme.com/share?url=http%3A%2F%2Fredmonk.com%2Fsogrady%2F2010%2F02%2F25%2Fdata-vs-dual-licensing%2F&quot;&gt;&lt;br /&gt;
				&lt;img src=&quot;http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fredmonk.com%2Fsogrady%2F2010%2F02%2F25%2Fdata-vs-dual-licensing%2F&amp;amp;source=sogrady&amp;amp;style=compact&amp;amp;service=bit.ly&quot; height=&quot;61&quot; width=&quot;50&quot; /&gt;&lt;br /&gt;
			&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;&amp;#8220;&lt;i&gt;By 2012, at least 70% of the revenue from commercial OSS will come from vendor-centric projects with dual-license business models.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;80% probability.  This is may true today but the lack of revenue among broader market OSS products compared to Linux isn’t large enough yet to make this one a done deal.  What is clear is that the overwhelming majority of ‘commercial oss’ efforts are based on a dual license model – vendor prefer the ‘open core’ moniker because it sounds more OSS friendly but its essentially the same thing&lt;/p&gt;.&amp;#8221;&lt;br /&gt;
- Mark Driver, Gartner, &lt;a href=&quot;http://blogs.gartner.com/mark_driver/2009/12/08/open-source-predictions-for-2010/&quot;&gt;Open Source Predictions for 2010&lt;/a&gt;
&lt;p&gt;This prediction from Gartner&amp;#8217;s Mark Driver confused me, I&amp;#8217;ll admit, when I first read it. Baffled me, actually. Looking at the market, it seemed &lt;a href=&quot;http://redmonk.com/sogrady/2009/11/12/2010-predictions/&quot;&gt;clear to me&lt;/a&gt; that the practice of dual licensing was, if anything, in decline. I couldn&amp;#8217;t see how we could look at the same market and come to such different conclusions. My view was similar to &lt;a href=&quot;http://krow.livejournal.com/684068.html&quot;&gt;Brian Aker&amp;#8217;s&lt;/a&gt; (as is Cloudera&amp;#8217;s Mike Olson&amp;#8217;s, &lt;a href=&quot;http://twitter.com/mikeolson/status/9533566416&quot;&gt;notably&lt;/a&gt;), most recently of MySQL/Sun:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;When MySQL pushed dual licensing, investors looked for this hook in every business model. I remember standing outside of a conference room in SF a couple of years ago and talking to one of the Mozilla Foundation people. Their question to me was &amp;#8220;Is the nonsense over dual licensing being the future over yet?&amp;#8221;. The fact is, there are few, and growing fewer, opportunities to make money on dual licensing. Dual licensing is one of the areas where open source can often commoditize other open source right out of the market. The dearth of companies following in MySQL&amp;#8217;s dual licensing footsteps to riches, belabors the point of how niche this solution was.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even for MySQL, long the standard bearer for the approach, the logistics of dual licensing were and are becoming &lt;a href=&quot;http://redmonk.com/sogrady/2009/10/23/oracle-mysql-and-the-eu-the-qa/&quot;&gt;increasingly problematic&lt;/a&gt; over time:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;For smaller firms, the primary limitation [of dual licensing] is the development. Unlike non-dual licensed projects which need only concern themselves with the quality and provenance of code contributions from external parties, dual-license vendors need also consider the question of copyright ownership. Because dual licensing depends on ownership of copyright for the entirety of the asset in question, third parties must either assign or be willing to jointly hold the copyright for any potential contributions. Early in a project’s lifecycle, this is a minor concern because the project owner likely employs most of those qualified to improve it. As a project matures and becomes more popular, however, this is a more pressing issue. First, because it acts to inhibit community participation (see slide 18 of &lt;a href=&quot;http://docs.google.com/viewer?url=http://assets.en.oreilly.com/1/event/2/Future%2520Design%2520Hurdles%2520to%2520Tackle%2520in%2520the%2520MySQL%2520Server%2520Presentation.pdf&quot;&gt;this deck&lt;/a&gt; produced by Monty), but second – and more problematically – it means that third parties can, in practical terms, offer a more complete product.&lt;/p&gt;
&lt;p&gt;Jeremy Zawodny made reference to the practical implications of the dual license in a post from December of last year entitled “&lt;a href=&quot;http://jeremy.zawodny.com/blog/archives/010774.html&quot;&gt;The New MySQL Landscape&lt;/a&gt;.” In it, he made the assertion that “You can get a ‘better’ MySQL than the one Sun/MySQL gives you today. For free.” This is the cost of the dual licensing model: in return for the right to exclusively relicense the code, you forfeit a.) the right to amortize your development costs across a wide body of contributors, and b.) the right to uniformly integrate the best patches/fixes/etc that are made available under the original license because you cannot always acquire the copyright.&lt;/p&gt;
&lt;p&gt;This doesn’t mean that dual licensing is a uniformly bad strategy, but it does imply that it has costs, and that those costs escalate over time. This situation is the inevitable result of the dual license model over time as applied to a successful project. For those looking for perspective from a MySQL and Drizzle developer, I’d recommend reading Brian Aker’s piece &lt;a href=&quot;http://krow.livejournal.com/673195.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even setting aside the disincentives to pursuing a dual licensing strategy, the basic math of the 70% argument didn&amp;#8217;t work for me. Even at MySQL, remember, a fraction of the revenue is derived from the issuance of dual licenses. And even if we assumed, for the sake of argument, that the entire revenue stream was the product of dual licensing, that still wouldn&amp;#8217;t be enough to meet the 70% projection. Not nearly so. &lt;/p&gt;
&lt;p&gt;As Driver notes when he says &amp;#8220;the lack of revenue among broader market OSS products compared to Linux isn’t large enough yet.&amp;#8221; Linux, it seems clear, is the largest single open source commercial ecosystem, and due to the lack of centralized copyright ownership, it cannot be dual licensed by anyone. What Driver is saying, in other words, is that the open source commercial ecosystem has to be big enough that Linux doesn&amp;#8217;t comprise more than 30% of it. &lt;/p&gt;
&lt;p&gt;Consider the following back of the envelope calculations. Red Hat&amp;#8217;s revenues in the year ending 2009 were $652 million and change. We know that, for copyright and licensing reasons, none of that money may derive from dual licensing revenues. If we assumed, counterfactually, that Red Hat represented &lt;i&gt;all&lt;/i&gt; of the non-dual license revenue of the market &amp;#8211; the leftover 30%, my math says that the total revenue picture would be around $2.17B. Meaning that we need a little more than two Red Hat&amp;#8217;s more worth of revenue to emerge from dual licensees like MySQL. &lt;/p&gt;
&lt;p&gt;Personally, I&amp;#8217;m skeptical that that would happen, even with the &lt;a href=&quot;http://redmonk.com/sogrady/2007/12/03/mysql_workbench/&quot;&gt;hybrid source trend&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Part of the problem is, I believe, semantics. Driver seems to be conflating what is sometimes referred to as &amp;#8220;open core&amp;#8221; licensing with dual licensing. Personally, I believe they are distinct. The former tends to refer to varying combinations of open source and proprietary codebases, while the latter is more generally used in conjunction with copyright mechanisms as they apply to a single open source codebase. This view is &lt;a href=&quot;http://blogs.the451group.com/opensource/2009/07/08/what-is-open-core-licensing-and-what-isnt/&quot;&gt;supported&lt;/a&gt; by my analyst colleagues over at the 451 Group. &lt;/p&gt;
&lt;p&gt;Were we to grant Driver the more expansive definition of dual licensing, however, I still think that figure is wrong. Based on the conversations we&amp;#8217;re having with vendors in the space, it seems more likely that revenue growth and expansion will come not from quote unquote dual licensing, but derived intelligence from gathered data and telemetry. &lt;/p&gt;
&lt;p&gt;Judging by the almost universally poor conversion metrics &amp;#8211; that is, the number of users of a given open source tool that are converted to paying customers &amp;#8211; it seems reasonable to assert that there are ongoing and systemic issues in the commercialization of open source software. Hence the proliferation of alternative revenue models such as dual licensing, open source and even SaaS. It is far from clear, however, that these models satisfactorily align customer and vendor interests such that conversion percentage will elevate to levels where they are competitive with proprietary software. &lt;/p&gt;
&lt;p&gt;At the end of the day, open source customers are generally paying for one or more of a.) break/fix/integration/support/etc services that they hope not to need, b.) withheld features that they need to pay to gain access to, or c.) the right to not observe the terms and conditions of the original license. The relative distribution of revenue within this set is skewed by the size and scope of the Linux community towards A, with B being the raison d&amp;#8217;etre for open core and C the same for dual licensing. &lt;/p&gt;
&lt;p&gt;But what if open source vendors could leverage their primary strength &amp;#8211; distribution &amp;#8211; more effectively as a direct revenue stream? I&amp;#8217;ve been predicting for &lt;a href=&quot;http://redmonk.com/sogrady/2007/08/20/more_money/&quot;&gt;three years&lt;/a&gt; or so that they would do just that, via data aggregation and analytics. The alignment of customer and vendor goals is better in this model than in virtually any other. The simplest example of this model outside of open source is Google, who provides users with search at no cost, receiving in return massive volumes of data which they monetize both directly (contextual ad placement) and indirectly (algorithmic improvement, machine learning, intelligence for product planning strategy, etc). Why couldn&amp;#8217;t software vendors employ a similar model, trading free software for user generated telemetry data? The answer is, they can. &lt;a href=&quot;http://www.spiceworks.com/&quot;&gt;SpiceWorks&lt;/a&gt;, for one, is doing just that now, quite successfully, albeit not with open source software. &lt;/p&gt;
&lt;p&gt;The strength of open source is in its ubiquity, and the volume it commands ensures that the telemetry returned would have substantial &amp;#8211; potentially immense, depending on the project &amp;#8211; value. Importantly, however, the value lies in the aggregation. A single user&amp;#8217;s telemetry is likely to be relatively uninteresting. A hundred users&amp;#8217; telemetry, more interesting. A thousand users&amp;#8217;, that much more so, and so on. Users, therefore, wouldn&amp;#8217;t be surrendering anything of material value to a would-be vendor in the transaction. Better, analysis of the aggegrate could have enormous value to customers. How is my infrastructure performing relative to similar environments? What are the types of conditions that indicate a potential problem? What differentiates my architecture from the Top 10 best performing? These are answerable questions&amp;#8230;if you have a big enough dataset. Most customers would not have that; an open source software provider aggregating and analyzing their combined telemetry would. &lt;/p&gt;
&lt;p&gt;Privacy and trust will certainly &lt;a href=&quot;http://redmonk.com/sogrady/2009/11/02/data-as-a-product/&quot;&gt;be concerns&lt;/a&gt;, but if the right data is offered as an incentive and the appropriate anonymization assured, those can be addressed for most customers. And for those that remain concerned, they should have the ability to opt out understanding that they will in turn have no access to the resulting analytics, and might therefore be at a disadvantage relative to their competitors who were using the intelligence.&lt;/p&gt;
&lt;p&gt;This direction seems nothing less than inevitable for me, and so it is no surprise that we&amp;#8217;re beginning to see (and help) a variety of open source vendors move in this direction. Free and open source data has a bright future regardless of the revenue model, but as we see successful projects better leverage their traction via analytics, the result should be a win for ecosystems and customers alike. &lt;/p&gt;
&lt;p&gt;Whether you believe as I do, however, that the money is ultimately going to come from data more than code, it seems clear to me that it is not going from what is commonly considered to be dual licensing. Because while it is &lt;a href=&quot;http://redmonk.com/sogrady/2007/04/30/correcting_the_record/&quot;&gt;not true&lt;/a&gt; that I am an enemy of that particular approach, I do believe &lt;a href=&quot;http://redmonk.com/sogrady/2009/08/19/does-copyright-matter-or-is-the-end-of-dual-licensing-near/&quot;&gt;it&amp;#8217;s in decline&lt;/a&gt;. Not least because it&amp;#8217;s poorly aligned with customers needs. &lt;/p&gt;
&lt;p&gt;Unlike data.  &lt;/p&gt;
&lt;div class=&quot;acc_license&quot;&gt;&lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png&quot; alt=&quot;by-nc-sa&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--&lt;rdf:RDF xmlns=&quot;http://creativecommons.org/ns#&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;&lt;Work rdf:about=&quot;&quot;&gt;&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot; /&gt;&lt;/Work&gt;&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Attribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Reproduction&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#Distribution&quot; /&gt;&lt;permits rdf:resource=&quot;http://creativecommons.org/ns#DerivativeWorks&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#ShareAlike&quot; /&gt;&lt;prohibits rdf:resource=&quot;http://creativecommons.org/ns#CommercialUse&quot; /&gt;&lt;requires rdf:resource=&quot;http://creativecommons.org/ns#Notice&quot; /&gt;&lt;/License&gt;&lt;/rdf:RDF&gt;--&gt;&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=zaHJh_5lIz4:A-u9hBd6BB4:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=zaHJh_5lIz4:A-u9hBd6BB4:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=zaHJh_5lIz4:A-u9hBd6BB4:D7DqB2pKExk&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?i=zaHJh_5lIz4:A-u9hBd6BB4:D7DqB2pKExk&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/tecosystems?a=zaHJh_5lIz4:A-u9hBd6BB4:dnMXMwOfBR0&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/tecosystems?d=dnMXMwOfBR0&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/tecosystems/~4/zaHJh_5lIz4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</description>
	<pubDate>Thu, 25 Feb 2010 22:00:00 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Product management, effective developers, and the future of MySQL</title>
	<guid>http://www.pythian.com/news/?p=8867</guid>
	<link>http://www.pythian.com/news/8867/product-management-effective-developers-and-the-future-of-mysql/</link>
	<description>&lt;p&gt;I am writing because Sheeri sent me a note about a &lt;a href=&quot;http://krow.livejournal.com/684068.html&quot;&gt;blog post written by Brian Aker&lt;/a&gt;, where Brian concludes, quite correctly, that (in Sheeri&amp;#8217;s words not Brian&amp;#8217;s)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
MySQL is now just a branch (the official branch,&lt;br /&gt;
but a branch nonetheless, and a bunch of trademark (logo) and&lt;br /&gt;
copyright (docs) ownerships).&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is exactly true. No denying it. Why bother. It&amp;#8217;s true. It&amp;#8217;s also true for the vast majority of open-source projects, by the way.&lt;/p&gt;
&lt;p&gt;I replied to Sheeri:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
There's no denying that. The product direction will be set by whoever sets the best product management strategy backed by the most effective development effort. And there can be multiple winners.&lt;br /&gt;
-Paul&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Well, this is the kind of quality output I can be relied on. It might not fit on twitter, but it&amp;#8217;s not blogworthy. Sheeri&amp;#8217;s word of encouragement:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
See, now that would be a nice blog post with a positive outlook that&lt;br /&gt;
both Oracle Corp and MySQL community would agree and be happy with,&lt;br /&gt;
because both Oracle Corp and the MySQL community feel they can set&lt;br /&gt;
&quot;the best product management strategy backed by the most effective&lt;br /&gt;
development effort.&quot;&lt;br /&gt;
-Sheeri&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;God. My reply was embarassing but maybe I should include it for humour value:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
Go for it. Its a tweet for me at the most. No time to expand that thinking into a blog worthy of the blog today.&lt;br /&gt;
-Paul&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and then, right away, &lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
ah censored it i'll do it.&lt;br /&gt;
it'll be short.&lt;br /&gt;
-paul&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You are now reading the result of this very modest effort.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the future of MySQL, Drizzle, Monty Program, the Percona fork, etc. &lt;/p&gt;
&lt;p&gt;The best product management strategies&amp;#8230; should we be lightweight for the web, plug-in oriented like Drizzle? Should we follow Monty&amp;#8217;s giant-killing roadmap? Should we focus on performance-oriented patches? The best product management strategies will win.&lt;/p&gt;
&lt;p&gt;They can&amp;#8217;t win alone. Will they be backed by appropriate investments from effective developers? Effective developers are the ones who convert winning product management strategies into working products. You can&amp;#8217;t get there without them and I&amp;#8217;ve seen lots of great strategies fail that test (including my own actually).&lt;/p&gt;
&lt;p&gt;And there can be more than one winner.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s doesn&amp;#8217;t matter what roadmap Oracle plots for MySQL. If it&amp;#8217;s not the roadmap the community wants, it will lose ground and open an opportunity for another fork. If it is, however, (and NEVER, NEVER underestimate Oracle&amp;#8217;s product management because it is outstanding and a big component of their historical success), if it is, however, Oracle can win the long-term hearts and minds, because they can resource quality developers in a way that I don&amp;#8217;t think any of the competing forks are capitalized to do (yet.)&lt;/p&gt;
&lt;p&gt;Either way, it&amp;#8217;s going to be fun to watch.&lt;/p&gt;
&lt;p&gt;And more than one player can win.&lt;/p&gt;
&lt;p&gt;And regardless, the community wins. Big time.&lt;/p&gt;</description>
	<pubDate>Tue, 23 Feb 2010 19:38:13 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Drizzle, Licensing, Having Honest Conversations with your Community</title>
	<guid>http://krow.livejournal.com/684329.html</guid>
	<link>http://krow.livejournal.com/684329.html</link>
	<description>I pulled this &lt;a href=&quot;http://slashdot.org/comments.pl?sid=1559450&amp;amp;cid=31242418&quot;&gt;from a quote&lt;/a&gt; on yesterday's Slashdot story about MySQL Licensing where the author of the quote mentions Drizzle's licensing terms:&lt;br /&gt;&lt;br /&gt;&quot;you require the code to be under BSD&quot;&lt;br /&gt;&lt;br /&gt;This is actually a myth, we don't.&lt;br /&gt;&lt;br /&gt;If you look through the Drizzle codebase you will note that very few files have BSD headers, and all that do?&lt;br /&gt;&lt;br /&gt;They are a part of new systems that have been written since the fork of the project, and not all of these are BSD.&lt;br /&gt;&lt;br /&gt;Why is this?&lt;br /&gt;&lt;br /&gt;A large part of Drizzle is derived work from MySQL, and in all cases there we inherited its GPLv2 license on files. Bug fixes and code refactoring projects all fall under the umbrella of &quot;derived work&quot;. In all of those cases the work was made under the GPL but no copyright assignment ever occurred. To understand ownership there you would need to look at the revision history to the code. We have never made any effort to track anything more then &quot;where did the code come from&quot;.&lt;br /&gt;&lt;br /&gt;I am a big opponent of &lt;a href=&quot;http://krow.livejournal.com/673195.html&quot;&gt;copyright assignment&lt;/a&gt; in open source. How do you have an honest conversation with someone where you say &quot;yes, I will need the work you did for free, to be assigned over to me, so that I can make money on it&quot;?&lt;br /&gt;&lt;br /&gt;Or better put:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
&quot;Here is $100 for the code you did, would you like some trinkets and beads to go along with that?&quot;
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We never did copyright assignment for Drizzle, and in no other project I have run personally have I ever done it. It is not a conversation I can have with a straight face with anyone. If you need commercial rights to your work and you want to do a true &quot;quid pro quo&quot;? License your code under the BSD license in the first place, that way both you and the contributor are on equal footing.&lt;br /&gt;&lt;br /&gt;Does this mean we are a free for all when it comes to code? No, we track ownership. We know where every single line of code came from thanks to &lt;a href=&quot;http://bazaar.canonical.com/en/&quot;&gt;bazaar&lt;/a&gt;. If someone wanted to &quot;poison&quot; the codebase we would know exactly who that was. We would point the copyright owner to the offender, remove the code, and help with the prosecution of said individual.  We have an active discussion going on at the moment about the future of our copyright headers, and one option we are considering is just replacing the copyright owner notice with a &quot;Please see revision history for complete ownership information&quot;.&lt;br /&gt;&lt;br /&gt;Are all of the files in Drizzle GPL? No, we do have some which are BSD.&lt;br /&gt;&lt;br /&gt;I am a big fan of the BSD license and I typically suggest to developers that they use it for certain projects. As a license it links well with other code, and by establishing new plugins as BSD the original author can pull from any bug fixes that are made to the code. As an example Patrick Galbraith established the built in drivers that allows Drizzle to speak with Memcached. He has pulled code from the Drizzle driver and used that for his MySQL drivers. If those drivers had been done as GPL he would have not been able to pull code back into the MySQL Memcached drivers (which are BSD).&lt;br /&gt;&lt;br /&gt;The GPL works just fine as the license for the kernel of Drizzle. I don't see that changing. In discussions with the other core authors, there has never been a push to &quot;rewrite&quot; the entire internals just to change the license. It is more work then it is worth, and it is not needed. The micro-kernel design means that going forward most of the work is pushed out to the libraries that link us to other systems. Work in the kernel is all about making those interfaces robust and creating more opportunity for plugin writers.&lt;br /&gt;&lt;br /&gt;A final note on licensing and direction.&lt;br /&gt;&lt;br /&gt;We never had any ambition to aim Drizzle at the deeply embedded market. Taking Drizzle, compiling it into a library, and linking it against another application is not a goal that the core team has ever had. If we had ever wanted to go into the world of deeply embedded databases we would have needed to have done code assignment or switched the entire license of the program.&lt;br /&gt;&lt;br /&gt;In the deeply embedded world SQLite reigns supreme. SQLite does an awesome job in that space, and we see zero reasons to go head to head with it.  If I needed a deeply embedded database I would just use SQLite, I wouldn't bother to write a new one.&lt;br /&gt;&lt;br /&gt;Drizzle's core will stay GPL, and we continue to take contributions without code assignment. If you are a programmer I believe you can appreciate the merits of why we do this.&lt;br /&gt;&lt;br /&gt;If you are a developer and you find yourself in the peculiar position of being asked to sign over your work? I would encourage you to take a hard look at why this is being asked, and see how comfortable you are with the value you are getting in return for your work.</description>
	<pubDate>Tue, 23 Feb 2010 17:27:50 +0000</pubDate>
</item>
<item>
	<title>Pythian Group: Announcing:  Monday night community dinner at Pedro’s during the O’Reilly MySQL Conference &amp; Expo</title>
	<guid>http://www.pythian.com/news/?p=8809</guid>
	<link>http://www.pythian.com/news/8809/announcing-monday-night-community-dinner-at-pedros-during-the-oreilly-mysql-conference-expo/</link>
	<description>&lt;p&gt;Just the facts:&lt;br /&gt;
What:  MySQL user community dinner&lt;br /&gt;
Who:  me, you, and many MySQL community members&lt;br /&gt;
When:  Monday, April 12th &amp;#8211; Meet at 6:30 at the Hyatt Santa Clara or at 7 pm at the restaurant&lt;br /&gt;
Where:  &lt;a href=&quot;http://www.pedrosrestaurants.com/&quot;&gt;Pedro&amp;#8217;s Restaurant and Cantina&lt;/a&gt; &amp;#8211; 3935 Freedom Circle, Santa Clara, CA 95054&lt;br /&gt;
How:  Comment on this blog post to add your name to the list of probable attendees&lt;/p&gt;
&lt;p&gt;I was sad that last year there was no community dinner, and I missed the one the year before when Jonathan Schwartz and Rich Green made an appearance.  This year I am determined not to miss it, and so I am calling for a community (pay-your-own-way) dinner on &lt;strong&gt;Monday&lt;/strong&gt;, April 12th, at &lt;a href=&quot;http://www.pedrosrestaurants.com/&quot;&gt;Pedro&amp;#8217;s&lt;/a&gt; &amp;#8211; a Mexican restaurant that has vegetarian and vegan options.  I think Monday is a better time because many folks arrive Sunday evening, or even Monday morning (there are tutorials on Monday, but not everyone attends).&lt;br /&gt;
&lt;span id=&quot;more-8809&quot;&gt;&lt;/span&gt;&lt;br /&gt;
Pedro&amp;#8217;s can handle large groups of people, but we would like to have a vague idea of how many people are attending &amp;#8212; while you are not required to RSVP, we would like to make an accurate reservation at Pedro&amp;#8217;s&amp;#8230;.In 2008, there was a &lt;a href=&quot;http://forge.mysql.com/wiki/MySQLConf2008CommunityDinner&quot;&gt;wiki page&lt;/a&gt; with a list of attendees, and I was disappointed because there were so many people on that list I wanted to see.  &lt;/p&gt;
&lt;p&gt;Meet us at 6:30 pm on Monday in the lobby of the Hyatt Santa Clara, or at 7 pm at Pedro&amp;#8217;s.  If you want to come later, just show up at Pedro&amp;#8217;s whenever you can.&lt;/p&gt;
&lt;p&gt;Since commenting on this blog does not require registration (as the wiki does), I invite folks to comment on this blog post and I&amp;#8217;ll add you to the list of attendees:&lt;/p&gt;
&lt;p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.pythian.com/news/author/sheeri/&quot;&gt;Sheeri K. Cabral&lt;/a&gt; (The Pythian Group)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.pythian.com/news/author/pvallee/&quot;&gt;Paul Vallee&lt;/a&gt; (The Pythian Group)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.pythian.com/news/author/hamel/&quot;&gt;Rob Hamel&lt;/a&gt; (The Pythian Group)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://datacharmer.blogspot.com/&quot;&gt;Giuseppe Maxia&lt;/a&gt; (Sun)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://krow.net/&quot;&gt;Brian Aker&lt;/a&gt; (Drizzle)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://kostja-osipov.livejournal.com/&quot;&gt;Konstantin Osipov&lt;/a&gt; (Sun)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.facebook.com/notes.php?id=102841356695#!/notes.php?id=102841356695&quot;&gt;Mark Callaghan&lt;/a&gt; (Facebook) (will arrive later)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.eacsoftware.com.br/mysql/&quot;&gt;Wagner Bianchi&lt;/a&gt; (EAC Software, Brazil)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://rpbouman.blogspot.com/&quot;&gt;Roland Bouman&lt;/a&gt; (BI wizard)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://karwin.blogspot.com/&quot;&gt;Bill Karwin&lt;/a&gt; (Karwin Software Solutions)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.linkedin.com/in/mvolkov&quot;&gt;Maxim Volkov&lt;/a&gt; (OpenCandy)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://brian.moonspot.net/&quot;&gt;Brian Moon&lt;/a&gt; (DealNews) &amp;#8211; note:  Monday Apr 12th is Brian&amp;#8217;s birthday!&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://codelemur.wordpress.com/&quot;&gt;Rob Peck&lt;/a&gt; (DealNews)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.openquery.com&quot;&gt;Arjen Lentz&lt;/a&gt; (OpenQuery)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.percona.com&quot;&gt;Vadim Tkachenko&lt;/a&gt; (Percona)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.webyog.com&quot;&gt;Rohit Nadhani&lt;/a&gt; (WebYog)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://primebase.org/&quot;&gt;Paul McCullagh&lt;/a&gt; (PrimeBase)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://askmonty.com&quot;&gt;Monty Widenius&lt;/a&gt; (Monty Program)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://askmonty.com&quot;&gt;Sergei Golubchik&lt;/a&gt; (Monty Program)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://askmonty.com&quot;&gt;Kristian Nielsen&lt;/a&gt; (Monty Program)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://askmonty.com&quot;&gt;Henrik Ingo&lt;/a&gt; (Monty Program)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;Nick Westerlund&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt; (Tuenti)&lt;br /&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pythian.com/news/feed/s.petrunia.net/blog&quot;&gt;Sergey Petrunya&lt;/a&gt; (Monty Program)&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;&lt;li&gt;&lt;a href=&quot;http://xaprb.com/blog&quot;&gt;Baron Schwartz&lt;/a&gt; (Percona) (Tentative yes) &lt;/li&gt;</description>
	<pubDate>Mon, 22 Feb 2010 17:12:43 +0000</pubDate>
</item>
<item>
	<title>Baron Schwartz: A review of Understanding MySQL Internals by Sasha Pachev</title>
	<guid>http://www.xaprb.com/blog/?p=1628</guid>
	<link>http://www.xaprb.com/blog/2010/02/19/a-review-of-understanding-mysql-internals-by-sasha-pachev/</link>
	<description>&lt;div id=&quot;attachment_1629&quot; class=&quot;wp-caption alignleft&quot;&gt;&lt;a href=&quot;http://www.amazon.com/Understanding-MySQL-Internals-Sasha-Pachev/dp/0596009577?tag=xaprb-20&quot;&gt;&lt;img src=&quot;http://www.xaprb.com/blog/wp-content/uploads/2010/02/understanding-mysql-internals.gif&quot; alt=&quot;Understanding MySQL Internals&quot; title=&quot;Understanding MySQL Internals&quot; width=&quot;180&quot; height=&quot;236&quot; class=&quot;size-full wp-image-1629&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Understanding MySQL Internals&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Understanding-MySQL-Internals-Sasha-Pachev/dp/0596009577?tag=xaprb-20&quot;&gt;Understanding MySQL Internals&lt;/a&gt;.  By Sasha Pachev, O&amp;#8217;Reilly 2007.  Page count: about 227 pages.  (Here&amp;#8217;s &lt;a href=&quot;http://oreilly.com/catalog/9780596009571&quot;&gt;a link to the publisher&amp;#8217;s site&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I should have read this book a long time ago, and it&amp;#8217;s my loss that I didn&amp;#8217;t.  Although the title makes it sound like it should only benefit those who&amp;#8217;ll be changing the MySQL server&amp;#8217;s own code, that&amp;#8217;s not true.  To the contrary, at least parts of this book should be required reading for DBAs and developers who use MySQL, after they gain a moderate level of familiarity with how to use the server.&lt;/p&gt;

&lt;p&gt;The book does indeed start off with a few chapters on the source code, how to work with it, and the core structures that make up the MySQL server at the source code level.  However, even these topics hold value for users such as DBAs.  If you don&amp;#8217;t know how the server really works, you are lost when you are faced with a problem or asked to understand some behavior.  Peter Zaitsev refers to this as &amp;#8220;X-Ray Vision,&amp;#8221; something a good DBA or consultant needs.  I think the first few chapters of this book are a great way to develop that X-Ray Vision into MySQL.&lt;/p&gt;

&lt;p&gt;The next couple of chapters are on the client/server API, configuration variables, and thread-based architecture.  Although the first is probably not a core competency for DBAs, the others are.  I sure wish I&amp;#8217;d had the client/server protocol chapter handy when I was working with the protocol, though.  It is variously more useful than, and a good supplement to, the internals document on the MySQL wiki.&lt;/p&gt;

&lt;p&gt;The following chapters cover the storage engine interface, the server-level lock manager and how it interacts with the storage-engine locking, and the parser and optimizer.  These are absolutely core knowledge for DBAs and developers in my opinion.  The server/storage-engine division is one of the things that makes MySQL different from other databases, and is mandatory to understand deeply.  This applies equally well to the rest of the chapters, which cover the parser, optimizer, various storage engines (as opposed to just the server&amp;#8217;s interface to them), transactions, and replication.  Mandatory, every one.&lt;/p&gt;

&lt;p&gt;What&amp;#8217;s missing?  I found that the book is kind of funny in one major way.  It doesn&amp;#8217;t talk much about MySQL 5.0.  Instead, it delves into 4.x and 5.1.  Most of the new features in 5.0 are not mentioned at all.  Stored procedures, the INFORMATION_SCHEMA, triggers, and so on are absent, as are most discussions of changes to the optimizer and so forth.  Some 5.0 topics are covered: index merge, for example.  But by and large, there&amp;#8217;s not a lot of coverage here.  The 5.1-specific topics are those such as the new storage engine API and row-based binary logging.  Events are not covered, nor are changes to other types of logging.  Honestly, I feel this is appropriate in a book this size; the stuff that hasn&amp;#8217;t changed since 4.x days is more important to understand.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s little discussion of exactly how certain features work, such as the different sorting algorithms.  But that&amp;#8217;s OK.  These are covered pretty well by the MySQL manual, and even by my own book &lt;em&gt;High Performance MySQL 2nd Edition&lt;/em&gt;.  I think some other major topics might be missing, but I can&amp;#8217;t quite think of them now.&lt;/p&gt;

&lt;p&gt;The book is really well written.  I expected it to be dry but it&amp;#8217;s not at all.  It&amp;#8217;s actually engaging and interesting.  I also found a curious thing happening as I read: I became more aware of how much legacy cruft there is inside MySQL, and how much that has contributed to various shortcomings.  This made me actually feel sad, and made me yearn for the bright pure clean exciting vision that Drizzle strives towards.  But at the same time I kind of felt nostalgic, kind of fell a little more in love with MySQL, for its strengths and for the countless hours of work and the really monumental genius that it embodies, warts and all.  It was quite a cognitive dissonance experience, to tell the truth!&lt;/p&gt;

&lt;p&gt;For those who have any inclination to reading it, I&amp;#8217;d say: do it.  It&amp;#8217;ll benefit you a lot more than you think.  And if possible, do it with a copy of the MySQL source code available and actually take the time to look through it and explore the things Sasha suggests.  I read this book on an airplane, far from a computer, and I need to read it again and look at source code as I do so.  I am positive I&amp;#8217;ll get more than twice as much benefit from this second reading than I did from the first.  I say that because I have a shin-deep exposure to the MySQL source code myself, so I knew just enough about it to recognize that I really would get a lot more from going and looking at the code Sasha cross-referenced.  It was a bit like speaking Spanish without a dictionary, but having had a few weeks of intensive instruction ten years ago.  I remembered some things well, other things just hazily.&lt;/p&gt;

&lt;p&gt;Overall, this book is easily a high 4 stars on a scale of 5, and again, anyone seriously using MySQL should have it.&lt;/p&gt;

&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2009/06/30/a-review-of-mysql-administrators-bible/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: A review of MySQL Administrator&amp;#8217;s Bible&quot;&gt;A review of MySQL Administrator&amp;#8217;s Bible&lt;/a&gt; &lt;small&gt;MySQL Admi&lt;/small&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2010/01/15/review-get-it-done-with-mysql-peter-brawley-arthur-fuller/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: A review of Get it Done with MySQL 5&amp;#038;6 by Peter Brawley and Arthur Fuller&quot;&gt;A review of Get it Done with MySQL 5&amp;#038;6 by Peter Brawley and Arthur Fuller&lt;/a&gt; &lt;small&gt;Get it Don&lt;/small&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.xaprb.com/blog/2009/12/13/review-pentaho-solutions-bouman-dongen/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: A review of Pentaho Solutions by Roland Bouman and Jos van Dongen&quot;&gt;A review of Pentaho Solutions by Roland Bouman and Jos van Dongen&lt;/a&gt; &lt;small&gt;Pentaho So&lt;/small&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;Related posts brought to you by &lt;a href=&quot;http://mitcho.com/code/yarpp/&quot;&gt;Yet Another Related Posts Plugin&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 19 Feb 2010 23:13:46 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle build 1304 source tarball has been released</title>
	<guid>http://blog.drizzle.org/?p=538</guid>
	<link>http://blog.drizzle.org/2010/02/19/drizzle-build-1304-source-tarball-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on build 1304 has been released.  This marks the beginning of our &lt;a href=&quot;https://launchpad.net/drizzle/cherry&quot; target=&quot;_blank&quot;&gt;Cherry series&lt;/a&gt; of milestones. Most notably in this release is the beginning changes to replace Information Schema with table functions. See &lt;a href=&quot;http://krow.livejournal.com/680925.html&quot; target=&quot;_blank&quot;&gt;Brian&amp;#8217;s blog&lt;/a&gt; for more details. &lt;/p&gt;
&lt;p&gt;The Drizzle download file and change log can be found &lt;a href=&quot;https://launchpad.net/drizzle/cherry/2010-02-15&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 19 Feb 2010 22:48:02 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Drizzle, Look at the last row...</title>
	<guid>http://krow.livejournal.com/683834.html</guid>
	<link>http://krow.livejournal.com/683834.html</link>
	<description>&lt;pre&gt;
drizzle&amp;gt; select * from plugins WHERE PLUGIN_TYPE=&quot;storageengine&quot;;
+--------------------+---------------+-----------+-------------+
| PLUGIN_NAME        | PLUGIN_TYPE   | IS_ACTIVE | MODULE_NAME |
+--------------------+---------------+-----------+-------------+
| ARCHIVE            | StorageEngine | TRUE      |             |
| BLACKHOLE          | StorageEngine | TRUE      |             |
| CSV                | StorageEngine | TRUE      |             |
| FunctionEngine     | StorageEngine | TRUE      |             |
| INFORMATION_ENGINE | StorageEngine | TRUE      |             |
| InnoDB             | StorageEngine | TRUE      |             |
| MEMORY             | StorageEngine | TRUE      |             |
| MyISAM             | StorageEngine | TRUE      |             |
| schema             | StorageEngine | TRUE      |             |
+--------------------+---------------+-----------+-------------+
9 rows in set (0 sec)

&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The payoff for making Drizzle a plugin based architecture? Development goes much faster.</description>
	<pubDate>Fri, 19 Feb 2010 19:44:18 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Gearman 0.12 Released</title>
	<guid>http://krow.livejournal.com/683744.html</guid>
	<link>http://krow.livejournal.com/683744.html</link>
	<description>The highlights:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Fixed bug where memory loss occured if data was too large.&lt;br /&gt;&lt;li&gt; Added gearman_strerror().&lt;br /&gt;&lt;li&gt; Fixed bug where setting an option off in mass would not trip any triggers on the option (for both worker and client).&lt;br /&gt;&lt;li&gt; Options that are internal can no longer be set by external callers.&lt;br /&gt;&lt;li&gt; Deprecated gearman_client_set_event_watch_fn() and gearman_worker_set_event_watch_fn.&lt;br /&gt;&lt;li&gt; gearman_job_handle() and gearman_job_function_name() now return const char* pointers&lt;br /&gt;&lt;li&gt; gearman_worker_unregister now returns GEARMAN_NO_REGISTERED_FUNCTION if the function does not exist (or is being removed)&lt;br /&gt;&lt;li&gt; Added gearman_worker_function_exist()&lt;br /&gt;&lt;li&gt; Trying to send too large of a piece of data will result in GEARMAN_ARGUMENT_TOO_LARGE.&lt;br /&gt;&lt;li&gt; Added support for gearmand command client to daemonize and create a pid file.&lt;br /&gt;&lt;li&gt; Fixed job handle comparison bug with WORK_FAIL responses.&lt;br /&gt;&lt;li&gt; Fixed disable assert configure option.&lt;br /&gt;&lt;li&gt; TokyoCabinet support added.&lt;br /&gt;&lt;li&gt; Updates to Drizzle support.&lt;br /&gt;&lt;li&gt; Updates to MySQL support.&lt;br /&gt;&lt;li&gt; Build system updates.&lt;br /&gt;&lt;li&gt; And a lot more then what I will write here...&lt;br /&gt;&lt;br /&gt;0.12 was a cleanup release for the most part. Numerous bugs were fixed and we cleaned up the API to make it a bit safer for the future.&lt;br /&gt;&lt;br /&gt;For the next release the plan is to put more effort into the server, which will including additional logging options and updates to the server code around its internals (mainly C++ work over C).&lt;br /&gt;&lt;br /&gt;You can download 0.12 from here:&lt;br /&gt;&lt;a href=&quot;https://launchpad.net/gearmand&quot;&gt;https://launchpad.net/gearmand&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;</description>
	<pubDate>Fri, 19 Feb 2010 16:36:32 +0000</pubDate>
</item>
<item>
	<title>Mark Schoonover: Thoughts on Oracle's Purchase of Sun</title>
	<guid>tag:blogger.com,1999:blog-27443162.post-3862489932860476731</guid>
	<link>http://marksitblog.blogspot.com/2009/04/thoughts-on-oracle-purchase-of-sun.html</link>
	<description>&lt;p&gt;With a first day announcement at the &lt;a href=&quot;http://www.mysqlconf.com/mysql2009/public/content/home&quot;&gt;MySQL 2009 User Conference&lt;/a&gt;,  Oracle had purchased Sun! Reading the tweets and blogs, it's understandable that some think it's the end for MySQL, some think it's not - I think it could be both.&lt;/p&gt;&lt;p&gt;MySQL itself is going through a second corporate purchase inside of 18 months. When Sun purchased MySQL, some of the internal talent left. Just recently we saw the exit of Marten, and just before that Monty. What made MySQL what it was in 2008 is the people behind the database, from corporate to the community. &lt;/p&gt;&lt;p&gt;MySQL the database server itself is safe since it's GPLed. Anyone can have access to the code and create their own distribution. We've already seen this happen within the community, &lt;a href=&quot;http://jcole.us/blog/&quot;&gt;Jeremy Cole&lt;/a&gt;, &lt;a href=&quot;http://www.percona.com/percona-lab.html&quot;&gt;Percona&lt;/a&gt;, &lt;a href=&quot;http://ourdelta.org/category/releases&quot;&gt;OurDelta&lt;/a&gt; to name a few. The main concern that could slow or stop MySQL progress is all the programming talent leaving en masse. Put this together with the departure of all the original corporate management and MySQL is no longer MySQL the company we remember. The part we don't know for sure is Oracle's plans for MySQL. Just seems to be getting worse. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://launchpad.net/drizzle&quot;&gt;Drizzle&lt;/a&gt; could also be impacted since Brian Aker is a Sun employee, so is Jay Pipes, and I'm sure there are others. Some companies support Open Source Software by paying their employees to work on these projects. We don't know if Oracle will allow this to continue.&lt;/p&gt;&lt;p&gt;Who could be impacted by Oracle's purchase? That huge computer company in Redmond. For years, their database team has had access to the operating system source code. Gives a huge advantage to support and performance. Oracle not only gains the source code to Solaris, but also their hardware too. No company in my 22 years in IT has had access to everything - hardware, operating system and the database. It's going to be a wild ride....&lt;/p&gt;&lt;p&gt;The other company I think could be greatly impacted is &lt;a href=&quot;http://www.kickfire.com/&quot;&gt;Kickfire&lt;/a&gt;. Now that Oracle has all that Sun hardware talent on tap, they could also design a database appliance as well.&lt;/p&gt;&lt;p&gt;It's not all gloom and doom.&lt;/p&gt;&lt;p&gt;I see great opportunity for 3rd party companies that support MySQL. Some of these companies have former MySQL employees on staff too, and have already started contributing code to MySQL with their own patches and enhancements. This could be an opportunity for a consortium of companies to come together and support MySQL. Something like the &lt;a href=&quot;http://www.eclipse.org/org/&quot;&gt;Eclipse Foundation&lt;/a&gt; might work. I could also see David, Monty and Marten coming together again under a new company. Plenty of opportunities exist. &lt;/p&gt;&lt;p&gt;What advice can I give? First thing - don't panic. Your MySQL database servers are not going to stop working tomorrow. I'd research 3rd party companies like &lt;a href=&quot;http://www.percona.com/&quot;&gt;Percona&lt;/a&gt; and &lt;a href=&quot;http://www.pythian.com/&quot;&gt;Pythian&lt;/a&gt;. Be diligent, don't wait until Oracle announces something. Like any great DBA, be proactive.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;MySQL DBA &amp;amp; Programming Blog by Mark Schoonover&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/27443162-3862489932860476731?l=marksitblog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Feb 2010 04:52:25 +0000</pubDate>
	<author>Mark Schoonover</author>
</item>
<item>
	<title>Mark Schoonover: Last Week in Drizzle - Vol 3</title>
	<guid>tag:blogger.com,1999:blog-27443162.post-9078679337436435453</guid>
	<link>http://marksitblog.blogspot.com/2008/08/last-week-in-drizzle-vol-3_24.html</link>
	<description>&lt;span&gt;This is the  third post in the weekly series &quot;Last Week in Drizzle&quot; where we summarize the efforts of various folks in the Drizzle community over the past week. This edition covers Aug 18th through the 24th. As with the week before, a number of developers and community advocates continue to refactor the code base, come together in discussions on the mailing list, and brainstorm on how to solve the tough problems that Drizzle is trying to address. It sounds like many in the community have been swamped this week, but there's still plenty to report. &lt;a href=&quot;http://jpipes.com/&quot;&gt;Jay Pipes&lt;/a&gt; and myself are tag teaming Last Week in Drizzle.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Continued Growth in the Drizzle Community&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://launchpad.net/~drizzle-discuss/&quot;&gt;Drizzle&lt;/a&gt; mailing list has 191 members, up from 148 last week As I type this, there are 42 folks hanging out on the &lt;a href=&quot;irc://irc.freenode.net/drizzle&quot;&gt;#drizzle&lt;/a&gt; Freenode channel. The &lt;a href=&quot;http://drizzle.wikia.com/wiki/Drizzle_Wiki&quot;&gt;Drizzle wiki&lt;/a&gt; has been steadily growing in its content, there have been a number of entries added or updated:&lt;br /&gt;&lt;br /&gt;* &lt;a href=&quot;http://drizzle.wikia.com/wiki/FAQ&quot;&gt;Updated FAQ&lt;/a&gt;&lt;br /&gt;* &lt;a href=&quot;http://drizzle.wikia.com/wiki/Simple_Replication&quot;&gt;Simple Replication&lt;/a&gt;&lt;br /&gt;* &lt;a href=&quot;http://drizzle.wikia.com/wiki/Table_Proto_Definition&quot;&gt;Table Definitions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ongoing Conversations on the Mailing List&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We've had less Bikeshed stuff this past week. Biggest topics discussed this week:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://lists.launchpad.net/drizzle-discuss/msg01084.html&quot;&gt;Only Full Group By&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://lists.launchpad.net/drizzle-discuss/msg01096.html&quot;&gt;Transactional DDL&lt;/a&gt; &lt;li&gt;&lt;a href=&quot;http://lists.launchpad.net/drizzle-discuss/msg01090.html&quot;&gt;BLOB/TEXT and default value&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href=&quot;http://lists.launchpad.net/drizzle-discuss/msg01072.html&quot;&gt;SHOW VARIABLES&lt;/a&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;br /&gt;Community Blogs&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;Jay Pipes has written up two guides about &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;http://www.jpipes.com/index.php?/archives/248-Getting-a-Working-CC++-Development-Environment-for-Developing-Drizzle.html&quot;&gt;Getting a Working C/C++ Development Environment for Developing Drizzle &lt;/a&gt;&lt;/span&gt;&lt;span&gt;and&lt;a href=&quot;http://www.jpipes.com/index.php?/archives/249-A-Contributors-Guide-to-Launchpad.net-Part-1-Getting-Started.html&quot;&gt; A Contributor's Guide to Launchpad.net - Part 1 - Getting Started&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;http://www.jpipes.com/index.php?/archives/248-Getting-a-Working-CC++-Development-Environment-for-Developing-Drizzle.html&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;http://dammit.lt/2008/08/23/drizzle/&quot;&gt;Domas Mituzas blogs&lt;/a&gt; about his thoughts on Drizzle and modularity.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Brian &quot;krow&quot; Aker writes: Removal of code for views, some code removed for unireg and definitions. Table objects also created.&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;Drizzle Build Farm&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Still seeking additional Build Bots. You can also find out realtime status about our buildfarm on irc #Drizzle.  Details at http://ronaldbradford.com/blog/interacting-with-buildbot-using-irc-2008-08-18/&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;From last week&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;i&gt;&lt;span&gt;Ronald has continued to champion the Drizzle Build Farm, and writes the following update and request to the community:&lt;br /&gt;&lt;br /&gt;The Build Farm has helped us in identifying problems but we are still seeking people to contribute different platforms to our automated process become better.&lt;br /&gt;&lt;br /&gt;Currently we cover the following platforms&lt;br /&gt;&lt;br /&gt;- Ubuntu 8.04 - 32 &amp;amp; 64 bit - Debian 5 - 32 &amp;amp; 64 bit - Gentoo 8 - 32 &amp;amp; 64 bit - CentOS 5 - 64 bit - Fedora 8 - 32 &amp;amp; 64 bit - SUSE 11 - 32 bit - Mac OS/X 10.5 - 64 bit&lt;br /&gt;&lt;br /&gt;See the wiki for how to contribute to the Drizzle Build Farm.&lt;/span&gt;&lt;/i&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Final Words&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;That wraps up this week's entry. My apologies to anyone I missed in this edition. Feel free to add errata and additions to the comments of the entry and I will update the blog post accordingly.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;MySQL DBA &amp;amp; Programming Blog by Mark Schoonover&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/27443162-9078679337436435453?l=marksitblog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Feb 2010 04:52:25 +0000</pubDate>
	<author>Mark Schoonover</author>
</item>
<item>
	<title>Mark Schoonover: Dell/Ubuntu Inspiron 1525 Review</title>
	<guid>tag:blogger.com,1999:blog-27443162.post-6414382034790149398</guid>
	<link>http://marksitblog.blogspot.com/2008/08/dellubuntu-inspiron-1525-review_23.html</link>
	<description>&lt;a href=&quot;http://1.bp.blogspot.com/_kZUys153iTY/SK-FqcamTiI/AAAAAAAAAIc/ZFn1SGtw_C4/s1600-h/1525.jpeg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_kZUys153iTY/SK-FqcamTiI/AAAAAAAAAIc/ZFn1SGtw_C4/s200/1525.jpeg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5237551855883931170&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I recently purchased a new Dell 1525 laptop running Ubuntu 8.04.  I've been in need of a new laptop for about a year, and decided to take the plunge and see how good a Linux based laptop from Dell really is. My needs are fairly modest. I'm not a gamer, and don't watch many videos. Mainly it's used for blogging, internet, OpenOffice, IRC/IM, listening to podcasts and programming. Portablity is only somewhat important, mostly it'll be used 80% on a desk with the remaining time mobile.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Model:&lt;/strong&gt; Dell Inspiron 1525N&lt;br /&gt;&lt;strong&gt;Price as reviewed:&lt;/strong&gt; $749&lt;br /&gt;&lt;strong&gt;CPU:&lt;/strong&gt; Intel Core 2 Duo T7250 (2 Ghz/800 Mhz FSB/2MB Cache)&lt;br /&gt;&lt;strong&gt;OS:&lt;/strong&gt; Ubuntu 8.04 with DVD playback&lt;br /&gt;&lt;strong&gt;Screen:&lt;/strong&gt; Glossy 15.4&quot; widescreen (1280x800)&lt;br /&gt;&lt;strong&gt;Video:&lt;/strong&gt; Intel Graphics Media Accelerator X3100&lt;br /&gt;&lt;strong&gt;Memory:&lt;/strong&gt; 3GB Shared Dual Channel DDR2 at 667Mhz&lt;br /&gt;&lt;strong&gt;Hard Drive:&lt;/strong&gt; 120GB SATA (5400 RPM)&lt;br /&gt;&lt;strong&gt;Combo Drive:&lt;/strong&gt; CD/DVD Writer (DVD+/-RW)&lt;br /&gt;&lt;strong&gt;Wireless:&lt;/strong&gt; Intel 3945 a/g Mini-card&lt;br /&gt;&lt;strong&gt;Camera:&lt;/strong&gt; N/A&lt;br /&gt;&lt;strong&gt;Battery:&lt;/strong&gt; 6 cell Li/Io&lt;br /&gt;&lt;strong&gt;Sound:&lt;/strong&gt; High Definition Audio 2.0&lt;br /&gt;&lt;strong&gt;Network:&lt;/strong&gt; Integrated 10/100&lt;br /&gt;&lt;strong&gt;Weight:&lt;/strong&gt; ~6 pounds&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Initial Impressions&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I ordered this laptop on a Tues and according to Dell, it was going to take 7-10 working days then 3-5 days shipping before I'd see my new laptop here in Southern California. Much to my surprise, it shipped two days later, and arrived at my home two more days after that! I'd say Dell is very conservative in estimating dates. For once, it was great to see a laptop that didn't have all kinds of extra packaging. Dell packaged the laptop with a very minimum amount of packaging material. My box arrived via DHL intact. The contents of the box were very minimal as well, only including the power supply and Ubuntu DVD. A quick start guide and manual was also included, but not really referenced. It's a laptop after all, there's not much to put together! The included manual was for Windows OS only, there were no directions on using Ubuntu.&lt;br /&gt;&lt;br /&gt;Upon power up, it was cool to see the Ubuntu splash screen. It went through some hardware configuration, found my wireless network and I was online in under 10 minutes from opening the box! A very flawless start! Ubuntu is installed in mostly a default configuration, and after a few minutes of being online, it had almost 700MB of updates for me to download. I transferred my data from my aging desktop system on a USB thumbdrive to the Dell. I was 100% working off the Dell in about 30 mins from the time I opened the box. The 700MB of updates would wait until I went to bed before downloading and updating.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Performance is very subjective, but for my needs, the 1525N has been great. Firefox 3.0.1 performance has been very acceptable. OpenOffice also has very acceptable load times too. I downloaded the latest branch of Drizzle and compiled it in about 8 mins. Under normal use, the CPU fan isn't running very fast, but during the compile, it was running at fullspeed. Graphics has been very good for my needs. Watching the occasional video, it was crisp with good colors. The Intel GMA runs at 500Mhz and uses up to 384MB of shared RAM. Using that amount of system RAM, it's best to install as much RAM as you can afford. I rank installing the most RAM you can afford as the #1 upgrade you should do to this laptop. Upgrading to a faster CPU or harddisk may not be a great return on your investment. YYMV of course.&lt;br /&gt;&lt;br /&gt;I tested out the DVD writer by creating a restore disk using the Dell/Ubuntu Rescue DVD. I used standard Memorex DVD-R disks, and it burned about 1.8GB of data in around 3 minutes. I made two DVDs, and when trying to burn the second disk, it took a few ejects before the system would recognize a blank DVD was inserted.&lt;br /&gt;&lt;br /&gt;Wireless has been flawless. My WAP is a Buffalo WHR-G54S flashed with dd-wrt. The laptop hasn't dropped the link at anytime, unlike my work HP/Compaq 6710b which drops WIFI every few mins.&lt;br /&gt;&lt;br /&gt;Sound is a tad weak, it's not very loud. The speakers are upward facing, and Ubuntu responds to the hardware volume controls just fine. Sound quality is what you'd expect from built-in speakers, kinda rough. Plugging in headphones is the high quality option.&lt;br /&gt;&lt;br /&gt;The touch pad is just OK. The default settings are ,very sensitive, causing text selection to occur when that's not the intended action. Double clicking by double tapping doesn't work reliably either. This could be due to Ubuntu settings, something I haven't investigated yet.&lt;br /&gt;&lt;br /&gt;Keyboard has a nice tactile feel to it. I use the Dvorak layout, so I might see about rearranging the keys from QWERTY layout. By default, the backspace and delete keys are not configured to autorepeat.&lt;br /&gt;&lt;br /&gt;Battery life is about what I expected. I'm seeing around 2 hours and 45 mins runtime with the 6 cell battery. I haven't made any configuration changes to Ubuntu for power saving modes, this run time is based on the stock Ubuntu configuration and &quot;general&quot; useage.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Not Tested&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modem&lt;/li&gt;&lt;li&gt;8-in-1 memory card reader&lt;li&gt;HDMI port&lt;li&gt;S-video output&lt;li&gt;Express card slot&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;For less than $750, this is a fantastic laptop. I'm very happy with it. My other choice was an IBM Thinkpad T61, but I'm glad I went with the Dell. I've only had the laptop about 5 days now, but it's performed flawlessly for my needs. I think the Dell/Ubuntu laptops are a great combination. Only a few small negatives, but they are not a major concern for this laptop. I think Dell should include some kind of Ubuntu quick start guide instead of the manual that ships. If you're already experienced with Ubuntu, this won't be such a big issue, it's more of a concern for users that are new to Ubuntu.&lt;div class=&quot;blogger-post-footer&quot;&gt;MySQL DBA &amp;amp; Programming Blog by Mark Schoonover&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/27443162-6414382034790149398?l=marksitblog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Feb 2010 04:52:25 +0000</pubDate>
	<author>Mark Schoonover</author>
</item>
<item>
	<title>Mark Schoonover: Drizzle Report Vol 1 No 1</title>
	<guid>tag:blogger.com,1999:blog-27443162.post-9132051344701320612</guid>
	<link>http://marksitblog.blogspot.com/2008/08/drizzle-report-vol-1-no-1_04.html</link>
	<description>&lt;p&gt;The Drizzle Report is a weekly synopsis on drizzle development. This first report will contain more than just a weeks worth of development in order to catch up.&lt;/p&gt;&lt;p&gt;What has been removed from the initial MySQL source tree can be found at the &lt;a href=&quot;http://drizzle.wikia.com/wiki/MySQL_Differences&quot;&gt;MySQL Differences&lt;/a&gt; wiki page. Some of the highlights were the removal of the mysql database, TINY/MED/LONG BLOB, TINY/MED/LONG TEXT thespatial data types, and FULLTEXT indexes. Certain keywords were removed too like ENGINES, CLIENT and CONTRIBUTORS. Even drizzleadmin has been stripped down to just ping and shutdown.The long-standing MySQL ACL has been ripped out, and initial PAM authentication has been started.&lt;/p&gt;&lt;p&gt;Monty Taylor reports &lt;a href=&quot;http://mysql-ha.com/2008/08/03/rip-errmsgsys/&quot;&gt;RIP: errmsg.sys&lt;/a&gt;, in its place is gettext which is a standard for outputting strings.&lt;/p&gt;&lt;p&gt;Comparing drizzle to SQLite has been commonplace. An initial attempt at comparing the two architectures can be found on the &lt;a href=&quot;http://drizzle.wikia.com/wiki/Drizzle_compared_with_SQLite&quot;&gt;Drizzle compared to SQLite&lt;/a&gt; wiki page.&lt;/p&gt;&lt;p&gt;Drizzle features have been gleaned from &lt;a href=&quot;http://video.google.com/videoplay?docid=-1985562674353809731&amp;amp;hl=en&quot;&gt;Brian Aker's OSCON 2008 video&lt;/a&gt; and are now listed on the &lt;a href=&quot;http://drizzle.wikia.com/wiki/Drizzle_Features&quot;&gt;Drizzle Features&lt;/a&gt; wiki page. Brian has also been interviewed on &lt;a href=&quot;http://twit.tv/floss35&quot;&gt;FLOSS Weekly #35&lt;/a&gt; and &lt;a href=&quot;http://www.linuxworld.com/podcasts/linux/2008/071808-linuxcast.html&quot;&gt;Linux Cast&lt;/a&gt;. Be sure to listen in.&lt;/p&gt;&lt;p&gt;More information on Drizzle can be found on the &lt;a href=&quot;http://drizzle.wikia.com/wiki/Drizzle_Wiki&quot;&gt;Drizzle wiki&lt;/a&gt;. &lt;a href=&quot;irc://irc.freenode.net/drizzle&quot;&gt;IRC&lt;/a&gt; and &lt;a href=&quot;https://launchpad.net/~drizzle-discuss/&quot;&gt;mailing list&lt;/a&gt; are also available. If there's something additional you'd like to see in the Drizzle Report, just let me know.&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;MySQL DBA &amp;amp; Programming Blog by Mark Schoonover&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/27443162-9132051344701320612?l=marksitblog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Feb 2010 04:52:25 +0000</pubDate>
	<author>Mark Schoonover</author>
</item>
<item>
	<title>Mark Schoonover: Drizzle Near San Diego?</title>
	<guid>tag:blogger.com,1999:blog-27443162.post-2080037146633791194</guid>
	<link>http://marksitblog.blogspot.com/2008/08/drizzle-near-san-diego.html</link>
	<description>&lt;p&gt;Not really, it's about 90 degrees out and sunny here near San Diego. For a couple of years, I've been looking around to volunteer on an OSS project, and Drizzle really fits the bill. I've used MySQL for years, and have done some community support as well. I've been wanting to gain greater experience in technical writing, so Drizzle is the perfect project.&lt;/p&gt;&lt;p&gt;I'll be working on development &amp;amp; user documentation, and the weekly Drizzle Report. The Drizzle Report is a weekly synopsis on development and other progress to be posted on my blog Sunday evenings.&lt;/p&gt;&lt;p&gt;Be sure to check out the &lt;a href=&quot;http://drizzle.wikia.com/wiki/Drizzle_Wiki&quot;&gt;Drizzle Wiki&lt;/a&gt;. Launchpad is the home of the &lt;a href=&quot;https://launchpad.net/drizzle&quot;&gt;Drizzle&lt;/a&gt; project.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;MySQL DBA &amp;amp; Programming Blog by Mark Schoonover&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/27443162-2080037146633791194?l=marksitblog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Fri, 19 Feb 2010 04:52:25 +0000</pubDate>
	<author>Mark Schoonover</author>
</item>
<item>
	<title>Toru Maesaka: Speaking at the MySQL Conference 2010</title>
	<guid>http://torum.net/?p=2336</guid>
	<link>http://torum.net/2010/02/speaking-at-the-mysql-conference-2010/</link>
	<description>&lt;p&gt;I&amp;#8217;m a little behind in announcing this but I&amp;#8217;m going to be speaking at O&amp;#8217;Reilly&amp;#8217;s MySQL Conference this year. My presentation is a three hour tutorial titled, &lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/12409&quot;&gt;Drizzle Storage Engine Development. Practical Example with BlitzDB&lt;/a&gt;. Three hours is a long time but I assure you that there will be a break.&lt;/p&gt;
&lt;p&gt;This session isn&amp;#8217;t solely about going through Drizzle&amp;#8217;s Storage Engine API. Various performance topics like B+Tree structure, memory handling and concurrency control will be covered. I will also go through BlitzDB&amp;#8217;s design concept and it&amp;#8217;s internal stuff. So, needless to say I&amp;#8217;ll talk a lot about Tokyo Cabinet and it&amp;#8217;s internals as well.&lt;/p&gt;
&lt;p&gt;Hopefully those that come along will walk out of the tutorial standing far ahead of the start line. It will help you get started on reading the implementation of other storage engines in the MySQL ecosystem (MyISAM, InnoDB, PBXT, Federated and so forth). Better yet you will start writing one.&lt;/p&gt;
&lt;p&gt;Looking forward to seeing you there :)&lt;/p&gt;</description>
	<pubDate>Thu, 18 Feb 2010 09:31:30 +0000</pubDate>
</item>
<item>
	<title>Eric Day: MySQL Conf &amp; Drizzle Dev Day</title>
	<guid>http://oddments.org/?p=262</guid>
	<link>http://oddments.org/?p=262</link>
	<description>&lt;p&gt;I&amp;#8217;m glad to announce that we&amp;#8217;ll be having a &lt;a href=&quot;http://blog.drizzle.org/2010/02/15/drizzle-developer-day-2010-is-coming/&quot;&gt;Drizzle developer day&lt;/a&gt; again this year on the Friday after the MySQL Conference! Be sure to &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010_signup&quot;&gt;sign up&lt;/a&gt; and add any &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010&quot;&gt;topic ideas&lt;/a&gt; you may have so we know what folks are interested in. Space is limited!&lt;/p&gt;
&lt;p&gt;While at the MySQL Conference, I&amp;#8217;ll be speaking with &lt;a href=&quot;http://inaugust.com/&quot;&gt;Monty Taylor&lt;/a&gt; on &lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/13308&quot;&gt;&amp;#8220;Using Drizzle.&amp;#8221;&lt;/a&gt; This will take a non-developer approach to the project, so everyday DBAs and web developers should find this interesting. I&amp;#8217;ll also be teaming up with &lt;a href=&quot;http://datacharmer.blogspot.com/&quot;&gt;Giuseppe Maxia&lt;/a&gt; to talk about Gearman in three sessions. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/13309&quot;&gt;Getting started with Gearman for MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/13310&quot;&gt;Boosting Database Performance with Gearman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.oreilly.com/mysql2010/public/schedule/detail/13311&quot;&gt;Gearman MySQL hacks, or Everything you wanted to do with a database server and you never dared to hope&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#8217;re also going to have a combo Drizzle/Gearman booth in the expo hall, so be sure to stop by and chat. See you there!&lt;/p&gt;</description>
	<pubDate>Wed, 17 Feb 2010 22:41:21 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle Developer Day 2010 is coming</title>
	<guid>http://blog.drizzle.org/?p=520</guid>
	<link>http://blog.drizzle.org/2010/02/15/drizzle-developer-day-2010-is-coming/</link>
	<description>&lt;p&gt;We are very happy to announce Drizzle Developer Day is coming again this year. Similar to last year it will be the Friday after the MySQL users conference, April 16 &amp;#8211; 9:30 a.m. to 5:00 p.m.  We are still working on the exact location and will let you know as soon as possible, most likely it will be at or very close to the Santa Clara convention center.  We invite anyone interested in providing feedback, implementing new features, helping to fix bugs, or just wanting to learn more about Drizzle to attend.  &lt;/p&gt;
&lt;p&gt;Please sign up at   &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010_signup&quot; target=&quot;_blank&quot;&gt;http://drizzle.org/wiki/Drizzle_Developer_Day_2010_signup&lt;/a&gt;. Space will be limited. &lt;/p&gt;
&lt;p&gt;Also, to make this day a success, please provide your input on discussion topics at &lt;a href=&quot;http://drizzle.org/wiki/Drizzle_Developer_Day_2010&quot; target=&quot;_blank&quot;&gt;http://drizzle.org/wiki/Drizzle_Developer_Day_2010&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hope to see you there!&lt;br /&gt;
-Lee&lt;/p&gt;</description>
	<pubDate>Mon, 15 Feb 2010 18:45:30 +0000</pubDate>
</item>
<item>
	<title>Padraig O'Sullivan: New Job at Akiban</title>
	<guid>http://schacon.github.com//2010/02/06/new-job-at-akiban</guid>
	<link>http://feedproxy.google.com/~r/posulliv/~3/mD2QRUB0bF0/new-job-at-akiban.html</link>
	<description>I just finished my first week at my new position as a software engineer at &lt;a href=&quot;http://akibainc.com/&quot;&gt;Akiban Technologies&lt;/a&gt; in Boston.
&lt;br /&gt;

I'm really excited about working here. Akiban is a small startup developing some really cool
technology that I believe will get people talking about the relational model in a good way again. We
are currently based in the South End of Boston. The building where we are located is pretty awesome
and not at all what I pictured an office to be like. There is a resident artist in the building who
hangs his paintings on the walls and they seem to move to different places at random times. Its a
strange feeling to walk in to work in the morning and smell fresh paint as I go to my desk.
Definitely not something I expected!
&lt;br /&gt;

But besides all that, one of the best things for me about working here is that I get paid to
contribute to open source. I've been pretty involved with Drizzle for the last year while
still a student and it was always something I really enjoyed which I never thought someone would pay
me to work on. The community around the project is awesome and I was just happy to be involved with
it. Now that I get paid to contribute, it's nice to know that I can still be part of that community
without having to worry about how I'm going to make a living. It's weird to be paid for something
that I would still be doing anyway without the pay! I'm not complaining though, it's a nice change!
&lt;br /&gt;

I'll be presenting at the MySQL conference in April, lots of awesome work is happening in the
Drizzle project and Akiban will be out of stealth mode by the conference so there are some exciting
times ahead!</description>
	<pubDate>Sat, 06 Feb 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Eric Day: Linux Conf AU 2010</title>
	<guid>http://oddments.org/?p=248</guid>
	<link>http://oddments.org/?p=248</link>
	<description>&lt;p&gt;I was really excited when I had my &lt;a href=&quot;http://gearman.org/&quot;&gt;Gearman&lt;/a&gt; talk accepted to &lt;a href=&quot;http://www.lca2010.org.nz/&quot;&gt;Linux Conf AU 2010&lt;/a&gt; because I had never been out that far in the Pacific (only Hawaii). Of course it wasn&amp;#8217;t in Australia this year, and instead in Wellington, New Zealand. My wife came too, and we also made a vacation out of the down times we had around the conference. It turned out Brian couldn&amp;#8217;t make it this year so Monty, Stewart, and I gave the &lt;a href=&quot;http://drizzle.org/&quot;&gt;Drizzle&lt;/a&gt; talk. It was great to see some familiar faces, including Mark Atwood, Giuseppe Maxia, Josh Berkus, and Selena Deckelmann. Josh actually ended up being on the same flight out, so we got to catch up while going through New Zealand customs at 5am after a 13 hour flight. :)&lt;/p&gt;
&lt;p&gt;New Zealand is an amazing place. We flew in and out of Auckland and took the train to Wellington. The train ride mostly consisted of grazing sheep once out of the metro areas, did you know there are more sheep than people in NZ? Beyond the sheep, there were great views along the way, especially in the middle near the larger mountains and volcanoes. We stopped for a day to hike the &lt;a href=&quot;http://en.wikipedia.org/wiki/Tongariro_Alpine_Crossing&quot;&gt;Tongariro Alpine Crossing&lt;/a&gt;. It was sunny when we started, but it it was raining with 40mph winds at the top, so we didn&amp;#8217;t get to see as much as we hoped. There were still beautiful views on each side though.&lt;/p&gt;
&lt;p&gt;The conference was very well run, thanks to anyone who had a hand in it! The speakers dinner was at this great museum nearby on the waterfront and included live Maori singing and dancing. The vegan options were tasty, and I got to meet a few interesting folks there (like the folks from &lt;a href=&quot;http://www.dreamwidth.org&quot;&gt;Dreamwidth&lt;/a&gt;, a LiveJournal-like blogging service). Some notable sessions during the conference were &amp;#8220;The World&amp;#8217;s Worst Inventions&amp;#8221; by Paul Fenwick, &amp;#8220;Anti-features&amp;#8221; Keynote by Benjamin Mako Hill, &amp;#8220;The Hydras GCC Static Analysis Plugins&amp;#8221; by Taras Glek, and &amp;#8220;Simplicity Through Optimization&amp;#8221; by Paul McKenney. There were many other great sessions, and some I wish I could have attended.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m certainly going to try to go again next year, which if you didn&amp;#8217;t hear will be in &lt;a href=&quot;http://followtheflow.org/&quot;&gt;Brisbane&lt;/a&gt;!&lt;/p&gt;</description>
	<pubDate>Thu, 04 Feb 2010 00:54:25 +0000</pubDate>
</item>
<item>
	<title>Brian Aker: Fun with Table Functions</title>
	<guid>http://krow.livejournal.com/680925.html</guid>
	<link>http://krow.livejournal.com/680925.html</link>
	<description>I just about have all of the INFORMATION_SCHEMA replaced with Table Functions!&lt;br /&gt;&lt;br /&gt;The big wins:&lt;br /&gt;&lt;li&gt; One Execution path  (less bugs)&lt;br /&gt;&lt;li&gt; Simple interface, which means more langauges&lt;br /&gt;&lt;li&gt; Zero materialization happening&lt;br /&gt;&lt;li&gt; Less Code. This allows us to remove a lot of code (and single shot passes for particular use cases).&lt;br /&gt;&lt;br /&gt;The data dictionary operates entirely off the proto system, so what you see is what we have. We use the table names stored within the proto so no translation ever happens. This is pretty handy for filesystems which do not preserve case (and we don't have to do anything to support them any longer). &lt;br /&gt;&lt;br /&gt;You can also type &quot;SELECT * FROM DATA_DICTIONARY.SCHEMAS&quot;. &lt;br /&gt;&lt;br /&gt;There is no longer a &quot;SCHEMATA&quot; tables, just SCHEMAS. Want INDEXES? SELECT FROM INDEXES. &lt;br /&gt;&lt;br /&gt;We will also be able to split up the tables that are from the SQL ANSI standard one from the ones that are not. The advantage is that we can provide an ANSI compliant INFORMATION_SCHEMA, and still have plenty of room to add additional tables as we see fit (yes, like the tables we provide today which house the information on the active Memcached cluster information). &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;
drizzle&amp;gt; use data_dictionary;
Database changed

drizzle&amp;gt; select * from plugins;
+-------------------------------------------+-----------------------+-----------+-------------+
| PLUGIN_NAME                               | PLUGIN_TYPE           | IS_ACTIVE | MODULE_NAME |
+-------------------------------------------+-----------------------+-----------+-------------+
| ARCHIVE                                   | StorageEngine         | TRUE      | TRUE        | 
| ascii                                     | Function              | TRUE      | TRUE        | 
| benchmark                                 | Function              | TRUE      | TRUE        | 
| BLACKHOLE                                 | StorageEngine         | TRUE      | TRUE        | 
| char_length                               | Function              | TRUE      | TRUE        | 
| character_length                          | Function              | TRUE      | TRUE        | 
| CHARACTER_SETS                            | TableFunction         | TRUE      | TRUE        | 
| COLLATIONS                                | TableFunction         | TRUE      | TRUE        | 
| COLUMNS                                   | TableFunction         | TRUE      | TRUE        | 
| compress                                  | Function              | TRUE      | TRUE        | 
| connection_id                             | Function              | TRUE      | TRUE        | 
| console                                   | Listen                | TRUE      | TRUE        | 
| crc32                                     | Function              | TRUE      | TRUE        | 
| CSV                                       | StorageEngine         | TRUE      | TRUE        | 
| default_replicator                        | TransactionReplicator | TRUE      | TRUE        | 
| drizzle_protocol                          | Listen                | TRUE      | TRUE        | 
| Error_message_stderr                      | ErrorMessage          | TRUE      | TRUE        | 
| FunctionEngine                            | StorageEngine         | TRUE      | TRUE        | 
| GLOBAL_STATEMENTS                         | TableFunction         | TRUE      | TRUE        | 
| GLOBAL_STATUS                             | TableFunction         | TRUE      | TRUE        | 
| GLOBAL_VARIABLES                          | TableFunction         | TRUE      | TRUE        | 
| hello_world                               | Function              | TRUE      | TRUE        | 
| INDEX_PARTS                               | TableFunction         | TRUE      | TRUE        | 
| INDEXES                                   | TableFunction         | TRUE      | TRUE        | 

&lt;/pre&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;</description>
	<pubDate>Wed, 03 Feb 2010 20:33:51 +0000</pubDate>
</item>
<item>
	<title>Official Drizzle Blog: Drizzle build 1273 source tarball has been released</title>
	<guid>http://blog.drizzle.org/?p=507</guid>
	<link>http://blog.drizzle.org/2010/01/28/drizzle-build-1273-source-tarball-has-been-released/</link>
	<description>&lt;p&gt;Drizzle source tarball based on build 1273 has been released.  This marks completion of our &lt;a href=&quot;https://launchpad.net/drizzle/trunk/bell&quot;&gt;Bell milestone&lt;/a&gt;. We made a lot of great progress and improvements during the Bell milestone, one of the main goals was to make sure data loss does not occur so that active testing can now occur.  While Bell has been completed, upgrading will continue to require dump/load , so hopefully we will nail that down soon and let you know when it is ready. &lt;/p&gt;
&lt;p&gt;Stay tuned for more information on goals and features for the our next major milestone which will be code named Cherry. &lt;/p&gt;
&lt;p&gt;The Drizzle download file and change log can be found &lt;a href=&quot;https://launchpad.net/drizzle/trunk/bell&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 28 Jan 2010 20:40:46 +0000</pubDate>
</item>
<item>
	<title>Robert Hodges: Tungsten 1.2.2 Release is Out - Faster, More Stable, More Fun</title>
	<guid>tag:blogger.com,1999:blog-768233104244702633.post-6285892869366739459</guid>
	<link>http://scale-out-blog.blogspot.com/2010/01/tungsten-122-release-is-out-faster-more.html</link>
	<description>Release 1.2.2 of Tungsten Clustering is available on &lt;a href=&quot;http://sourceforge.net/projects/tungsten/&quot;&gt;SourceForge&lt;/a&gt; as well as through the &lt;a href=&quot;http://www.continuent.com/&quot;&gt;Continuent website&lt;/a&gt;. &amp;nbsp;The release contains mostly bug fixes in the open source version but there are also two very significant improvements of interest to all users.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The manager and monitoring capabilities of Tungsten are completely integrated on the same group communications channel. &amp;nbsp;This fixes a number of problems that caused data sources not to show up properly in older versions. &amp;nbsp;&lt;/li&gt;&lt;li&gt;We are officially supporting a new Tungsten Connector capability for MySQL called pass-through mode, which allows us to proxy connections by transferring network blocks directly rather than translating native request protocol to JDBC calls. &amp;nbsp;Our tests show that it speeds up throughput by as much as 200% in some cases.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;The commercial version has additional features like PostgreSQL warm standby clustering, add-on rules to manage master virtual IP addresses and other niceties. &amp;nbsp; If you are serious about replication and clustering it is worth a look.&lt;br /&gt;&lt;br /&gt;This is a good time to give a couple of reminders for Tungsten users. &amp;nbsp;First, Tungsten is distributed as a single build that integrates replication, management, monitoring, and connectivity. &amp;nbsp; The old Tungsten Replicator and Myosotis builds are going away. &amp;nbsp; Second, we have &lt;a href=&quot;http://www.continuent.com/downloads/documentation&quot;&gt;a single set of docs&lt;/a&gt; on the Continuent website that covers both open source and commercial distributions. &lt;br /&gt;&lt;br /&gt;With that, enjoy the new release. &amp;nbsp;If you are using the open source edition, please post your experiences in &lt;a href=&quot;http://www.continuent.com/community/forum&quot;&gt;the Tungsten community forums&lt;/a&gt; or write a blog article. &amp;nbsp;We would love to hear from you.&lt;br /&gt;&lt;br /&gt;P.s., We have added Drizzle support thanks to &lt;a href=&quot;http://developian.blogspot.com/2009/10/replication-from-mysql-to-drizzle-using.html&quot;&gt;a patch from Marcus Eriksson&lt;/a&gt; but it's not in 1.2.2. &amp;nbsp;For that you need to build directly from the SVN trunk. &amp;nbsp;Drizzle support will be out in binary builds as part of Tungsten version 1.3.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/768233104244702633-6285892869366739459?l=scale-out-blog.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 28 Jan 2010 07:01:53 +0000</pubDate>
	<author>Robert Hodges</author>
</item>
<item>
	<title>Toru Maesaka: Notes on HEAP/MyISAM Index Key Handling on WRITE</title>
	<guid>http://torum.net/?p=2331</guid>
	<link>http://torum.net/2010/01/notes-on-heap-myisam-key-generation/</link>
	<description>&lt;p&gt;&lt;strong&gt;Disclaimer: This post is based on HEAP/MyISAM&amp;#8217;s sourcecode in Drizzle.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are my brief notes on investigating how index keys are generated in HEAP and MyISAM. I lurked through these because I&amp;#8217;ve started preparing for decent index support in BlitzDB. I also wrote this to assist my biological memory for later grepping (I have terrible memory for names). I&amp;#8217;m only going to cover key generation on write in this post. Otherwise this post is going to be massive.&lt;/p&gt;
&lt;h3&gt;HEAP Engine&lt;/h3&gt;
&lt;p&gt;The index structure of HEAP can be either BTREE or HASH (in MySQL doc terms). Like other engines HEAP has a structure for keeping Key definition (parts, type, logic and etc). This structure is called HP_KEYDEF and it contains function pointers for write, delete, and getting the length of the key. These function pointers are assigned to at table creation or when the table is opened. The assigned function depends on the data structure of the index and it can be either of the following:&lt;/p&gt;
&lt;h4&gt;BTREE&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hp_rb_write_key()&lt;/li&gt;
&lt;li&gt;hp_rb_delete_key()&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;HASH&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hp_write_key()&lt;/li&gt;
&lt;li&gt;hp_delete_key()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for get_key_length(), either of the following functions are used for both data structures.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hp_rb_var_key_length()&lt;/li&gt;
&lt;li&gt;hp_rb_null_key_length()&lt;/li&gt;
&lt;li&gt;hp_rb_key_length()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When writing a row to the tree, HEAP writes to the index using a key generated by hp_rb_make_key(). Note that it does not use this for the hash index. The generated key is populated inside &amp;#8216;recbuffer&amp;#8217; in HEAP&amp;#8217;s handler object (HP_INFO structure).&lt;/p&gt;
&lt;p&gt;From my understanding, it loops through the key segments (I suspect it is similar the internal  KEY_PART_INFO structure) and appropriately copies each key field value to the output buffer. By meaning &amp;#8220;appropriately&amp;#8221; it respects the characteristics of the data type when packing the buffer. For example, for a variable length field, it will only copy the actual data and not the max possible size of it. The final byte that is copied to the buffer is the address of the chunk where the record lives.&lt;/p&gt;
&lt;h3&gt;MyISAM Engine&lt;/h3&gt;
&lt;p&gt;The upper layer of key handling in MyISAM looks somewhat similar to HEAP so you can really tell that it was written by the same people. Things are nicely wrapped together by the MYISAM_SHARE structure so it&amp;#8217;s relatively easy to follow. BlitzDB has a class called BlitzShare for the same purpose (This is based off Archive Engine&amp;#8217;s ArchiveShare class).&lt;/p&gt;
&lt;p&gt;Like HEAP, MyISAM has a structure for individual key definition called MI_KEYDEF (it&amp;#8217;s defined in myisam.h). There are more function pointers in this structure than HEAP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bin_search()&lt;/li&gt;
&lt;li&gt;get_key()&lt;/li&gt;
&lt;li&gt;pack_key()&lt;/li&gt;
&lt;li&gt;store_key()&lt;/li&gt;
&lt;li&gt;ck_insert()&lt;/li&gt;
&lt;li&gt;ck_delete()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Drizzle, _mi_ck_write() is assigned to ck_insert() which is the entry point to writing a MyISAM index. The key that MyISAM uses to write to the index is generated by _mi_make_key(). Like HEAP, it will loop through the key segments and pack the relevant fields accordingly to the characteristic of the data type. The output buffer belongs to MyISAM&amp;#8217;s hander (lastkey2).&lt;/p&gt;
&lt;h3&gt;From Here&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ve actually written a naive key generator for BlitzDB already based on Drizzle/MySQL&amp;#8217;s internal KEY_PART_INFO array. It seems to be working on EXACT MATCH but I still need to implement an index scanner which looks much harder to pull off than a table scanner. What I&amp;#8217;m really worried about is supporting composite indexes (namely reading/searching on it) but hopefully I&amp;#8217;ll understand how this area of the storage system works soon.&lt;/p&gt;</description>
	<pubDate>Tue, 26 Jan 2010 08:57:05 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: Replicating transactions directly to RabbitMQ</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-5648485693078122299</guid>
	<link>http://developian.blogspot.com/2010/01/replicating-transactions-directly-to.html</link>
	<description>Previously RabbitReplication tailed the transaction log provided by Drizzle and then the Java application sent the protobuf serialized transaction to RabbitMQ. Now it is possible to skip the transaction log file and send the transaction directly to the RabbitMQ server without the extra step of storing it in a file first.&lt;br /&gt;&lt;br /&gt;The code is available at&amp;nbsp;&lt;a href=&quot;https://code.launchpad.net/~krummas/drizzle/rabbitmq_log&quot;&gt;https://code.launchpad.net/~krummas/drizzle/rabbitmq_log&lt;/a&gt;&amp;nbsp;and to build it with rabbitmq support you need to install &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-c/&quot;&gt;librabbitmq&lt;/a&gt;&amp;nbsp;which is a bit tricky;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Installing librabbitmq&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;Install &lt;/span&gt;&lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;&lt;span&gt;mercurial&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;&lt;/a&gt;Branch the librabbitmq code: &lt;span&gt;hg clone http://hg.rabbitmq.com/rabbitmq-c/&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Branch the rabbitmq codegen repo into a subdirectory called codegen in the rabbitmq-c directory:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;cd rabbitmq-c&lt;/li&gt;&lt;li&gt;&lt;span&gt;hg clone&amp;nbsp;http://hg.rabbitmq.com/rabbitmq-codegen/ codegen&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;span&gt;Run autoconf like this: &lt;/span&gt;&lt;span&gt;autoreconf -i&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Run the configure script&lt;/li&gt;&lt;li&gt;make&lt;/li&gt;&lt;li&gt;make install&lt;/li&gt;&lt;/ol&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Build Drizzle&lt;/span&gt;&lt;br /&gt;When librabbitmq is installed, build drizzle like this:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;bzr branch lp:~krummas/drizzle/rabbitmq-log&lt;/span&gt;&lt;/li&gt;&lt;li&gt;config/autorun.sh&lt;/li&gt;&lt;li&gt;./configure --with-rabbitmq-log-plugin&lt;/li&gt;&lt;li&gt;make&lt;/li&gt;&lt;li&gt;make install&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;and it is done!&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Start Drizzle with RabbitMQ support&lt;/span&gt;&lt;/div&gt;&lt;div&gt;First, you can run drizzled with a --help flag to see the options available, they are all prefixed with --rabbitmq-log-XYZ.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The default values for the parameters makes drizzle connect to localhost as &quot;guest&quot; and replicate to an exchange called ReplicationExchange. Start it like this to replicate changes to a rabbitmq on localhost:&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ sbin/drizzled&amp;nbsp;--default-replicator-enable&amp;nbsp;--rabbitmq-log-enable&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The other available options are described in --help&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6543848899761399219-5648485693078122299?l=developian.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 25 Jan 2010 15:43:10 +0000</pubDate>
	<author>Marcus Eriksson</author>
</item>
<item>
	<title>Brian Aker: From Scratch, Get set, Go!</title>
	<guid>http://krow.livejournal.com/680047.html</guid>
	<link>http://krow.livejournal.com/680047.html</link>
	<description>&lt;pre&gt;
[brian@gaz fix_is]$ ./drizzled/drizzled --console-enable 
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins.
100122 13:12:00  InnoDB: highest supported file format is Barracuda.
100122 13:12:00 InnoDB Plugin 1.0.4 started; log sequence number 44600
Listening on 0.0.0.0:3306
Listening on :::3306
Listening on 0.0.0.0:4427
Listening on :::4427
./drizzled/drizzled: Forcing close of thread 0 user: ''
./drizzled/drizzled: ready for connections.
Version: '2010.01.1273' Source distribution (fix_is)

drizzled&amp;gt; use data_dictionary;
OK

drizzled&amp;gt; show tables;
Tables_in_data_dictionary	
MODULES	
PLUGINS	
PROCESSLIST	

drizzled&amp;gt; desc PLUGINS;
Field	Type	Null	Key	Default	Extra	

PATH ./data_dictionary/plugins
ID	bigint	YES		NULL		
USER	varchar(16)	YES		NULL		
HOST	varchar(64)	YES		NULL		
DB	varchar(64)	YES		NULL		
COMMAND	varchar(16)	YES		NULL		
TIME	bigint	YES		NULL		
STATE	varchar(64)	YES		NULL		
INFO	varchar(100)	YES		NULL		
drizzled&amp;gt; 


&lt;/pre&gt;</description>
	<pubDate>Fri, 22 Jan 2010 21:37:55 +0000</pubDate>
</item>
<item>
	<title>Monty Taylor: Using libnotify for error messages</title>
	<guid>http://inaugust.com/post/75</guid>
	<link>http://inaugust.com/post/75</link>
	<description>&lt;p&gt;Any good piece of infrastructure software should be able to pop up little windows on your desktop. :) &lt;/p&gt;&lt;p&gt;Yesterday at &lt;a href=&quot;http://www.lca2010.org.nz/&quot;&gt;LCA&lt;/a&gt;&amp;nbsp;in &lt;a href=&quot;http://www.flamingspork.com/blog/&quot;&gt;Stewart's&lt;/a&gt; Hacking Drizzle talk, it occurred to me that error messages should pop up little windows on my desktop. So I wrote an error message plugin which uses libnotifymm to send Gnome pop-up window messages.&lt;/p&gt;&lt;p&gt;I don't always get to post screenshots, so here you go:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://inaugust.com/media/75/Screenshot-2.jpg&quot; alt=&quot;Screenshot of libnotify error message&quot; title=&quot;libnotify screenshot&quot; /&gt;&amp;nbsp;&lt;/p&gt;&lt;a href=&quot;http://inaugust.com/media/75/Screenshot-2.jpg&quot;&gt;&lt;/a&gt;</description>
	<pubDate>Thu, 21 Jan 2010 00:34:05 +0000</pubDate>
	<author>Monty Taylor</author>
</item>
<item>
	<title>Mark Atwood: Machines Plus Minds - Welcome</title>
	<guid>tag:blogger.com,1999:blog-4771631636333583067.post-209914673357169818</guid>
	<link>http://machinesplusminds.blogspot.com/2010/01/machines-plus-minds-welcome.html</link>
	<description>Welcome!&lt;br /&gt;&lt;br /&gt;I write about the techne that is the amazing machine we call &quot;The Net&quot;.&lt;br /&gt;&lt;br /&gt;At present, I am mostly interested in Memcached, the Drizzle DB fork of MySQL, NoSQL, and in open standards, but I will be writing about other stuff as well.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I used to do my public geek blogging in my personal LiveJournal, but for various reasons it makes sense to separate my public writings about technology, my other public writings, and writings that are of interest only to my closer friends and family.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My day job title is &quot;Director of Community Development&quot; for Gear6, which means that my main paid interest is memcached and the memcached community. &amp;nbsp;I read and write technical articles, research nosql databases and other web-scale open source software, and go to conferences to attend and to speak.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4771631636333583067-209914673357169818?l=machinesplusminds.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 20 Jan 2010 20:37:25 +0000</pubDate>
	<author>Mark Atwood</author>
</item>
<item>
	<title>Stewart Smith: You have already lost</title>
	<guid>http://www.flamingspork.com/blog/?p=1780</guid>
	<link>http://www.flamingspork.com/blog/2010/01/18/you-have-already-lost/</link>
	<description>&lt;p&gt;When the following code introduces a valgrind warning&amp;#8230; you are in a world of pain and loss:&lt;/p&gt;
&lt;pre&gt;=== modified file 'drizzled/field/blob.h'
--- drizzled/field/blob.h	2009-12-21 08:16:13 +0000
+++ drizzled/field/blob.h	2010-01-18 01:36:48 +0000
@@ -32,6 +32,7 @@
  */
 class Field_blob :public Field_str {
 protected:
+  uint32_t assassass;
   uint32_t packlength;
   String value;				// For temporaries
 public:&lt;/pre&gt;</description>
	<pubDate>Mon, 18 Jan 2010 02:43:13 +0000</pubDate>
</item>
<item>
	<title>Marcus Eriksson: Drizzle to Infinispan replication and a small code walkthrough</title>
	<guid>tag:blogger.com,1999:blog-6543848899761399219.post-7453350568165691596</guid>
	<link>http://developian.blogspot.com/2010/01/drizzle-to-infinispan-replication-and.html</link>
	<description>This post aims to explain how to build your own key/value-store applier in RabbitReplication by walking through the new&amp;nbsp;&lt;a href=&quot;http://www.jboss.org/infinispan&quot;&gt;Infinispan&lt;/a&gt; support as an example.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Infinispan&lt;/span&gt;&lt;br /&gt;Infinispan is a &quot;distributed, highly available data grid platform&quot; and it exposes a &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;REST&lt;/a&gt;&amp;nbsp;interface where it is possible to manipulate the data in infinispan. For example it is a simple HTTP PUT method to store new data and a HTTP DELETE does exactly what you expect. The data is stored under resources, for RabbitReplication the data is stored under /&amp;lt;schema.table&amp;gt;/&amp;lt;key&amp;gt;. This means you can view the data in infinispan using a browser.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When I implemented the Infinispan support, I simply dropped the .war file in the webapps directory of a jetty installation and started it.&amp;nbsp;Since Infinispan has a REST interface, the client library can be any HTTP client, I picked the &lt;a href=&quot;https://jersey.dev.java.net/&quot;&gt;Jersey REST&lt;/a&gt; client since it is incredibly easy to use.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Customizing RabbitReplication&lt;/span&gt;&lt;br /&gt;RabbitReplication uses &lt;a href=&quot;http://code.google.com/p/google-guice/&quot;&gt;Guice&lt;/a&gt; internally for dependency injection, so, to use another KeyValue store you need to create your own Module for configuration. I'll show an example below.&lt;br /&gt;&lt;br /&gt;To add support for a new key/value store, you need to implement an interface,&amp;nbsp;&lt;span&gt;&lt;span&gt;org.drizzle.replication.transformer.objectstores.KeyValueStoreClient&lt;/span&gt;&lt;/span&gt; (&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/rabbitreplication/trunk/annotate/head:/src/org/drizzle/replication/transformer/objectstores/KeyValueStoreClient.java&quot;&gt;here&lt;/a&gt;). It is a quite straight-forward add/get/remove interface. Look at the infinispan implementation (&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/rabbitreplication/trunk/annotate/head:/src/org/drizzle/replication/transformer/objectstores/InfinispanStoreClient.java&quot;&gt;here&lt;/a&gt;) for an example. Note the @Inject on the constructor, it tells guice that the WebResource parameter should be injected when it constructs the object. You will need to put the rabbitreplication.jar file on your classpath when building your stuff.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Guice is configured in modules where you bind() an interface to an implementation, so, to configure guice to use a new KeyValueStore, we need to bind()&amp;nbsp;the KeyValueStoreClient interface to&amp;nbsp;the new implementation. Look at the infinispan module (&lt;a href=&quot;http://bazaar.launchpad.net/~krummas/rabbitreplication/trunk/annotate/head:/src/org/drizzle/replication/InfinispanModule.java&quot;&gt;here&lt;/a&gt;) for an example how to do it, the method annotated with @Provides is called by guice when it needs to create a KeyValueStoreClient.&lt;br /&gt;&lt;br /&gt;To tell RabbitReplication to use your new module, you simply edit your configuration file, and set where the new Module is located, see &lt;a href=&quot;http://bazaar.launchpad.net/~krummas/rabbitreplication/trunk/annotate/head:/objectslave.properties.sample&quot;&gt;this&lt;/a&gt; example. If you need to configure your new client, simply add the properties in the config file, guice will bind every property in the file to @Named(...) strings, check the Infinispan module provider method for an example how to use it.&lt;br /&gt;&lt;br /&gt;Now, build your code into a jar, drop the jar in the lib/ directory of rabbitreplication and start RabbitReplication like this; &lt;span&gt;bin/start.sh config/someconf.properties &lt;/span&gt;&lt;span&gt;- the config file should have the&amp;nbsp;&lt;/span&gt;&lt;span&gt;custom_module &lt;/span&gt;&lt;span&gt;set to the name of your new module.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Downloading and installing&lt;/span&gt;&lt;br /&gt;Best way to use rabbitreplication is still to branch the code from launchpad (lp:rabbitreplication) and then write ant in the base directory, this will create a .zip and a .tgz in the dist directory. You can also download the binaries &lt;a href=&quot;http://marcus.no-ip.biz/rabbitreplication-0.1.tgz&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unpack the distribution file&lt;/li&gt;&lt;li&gt;Copy a config file from .sample to .properties in the config directory and edit the file to your liking. objectslave.properties.sample is the sample you want to look at if you want to try out Infinispan.&lt;/li&gt;&lt;li&gt;Start rabbitreplication by executing &lt;span&gt;bin/start.sh config/yourconf.properties&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;Look at the previous posts on rabbitreplication to find out how to start a master etc.&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6543848899761399219-7453350568165691596?l=developian.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 16 Jan 2010 20:39:49 +0000</pubDate>
	<author>Marcus Eriksson</author>
</item>
<item>
	<title>Toru Maesaka: Further thoughts on BlitzDB’s Index Handling</title>
	<guid>http://torum.net/?p=2328</guid>
	<link>http://torum.net/2010/01/further-thoughts-on-blitzdb-index/</link>
	<description>&lt;p&gt;I&amp;#8217;ve been thinking quite a bit about collation handling in BlitzDB for the last couple of days. The more I think about it, the more stuck I&amp;#8217;ve been getting with BlitzDB&amp;#8217;s index design. I&amp;#8217;m actually so frustrated with myself at the moment that I want to hit my head against a wall or something.&lt;/p&gt;
&lt;p&gt;So, I&amp;#8217;m writing this entry to clear up my mind. Heh, my blog is slowly becoming BlitzDB&amp;#8217;s design document draft. This should hopefully be good though since by blogging it, people can tell me whether I&amp;#8217;m moving towards a stupid direction or not.&lt;/p&gt;
&lt;h3&gt;Collation Importance&lt;/h3&gt;
&lt;p&gt;When writing database software that is intended for International use, it is important to handle textual data by respecting collation order. It is arguable that most people are only interested in English lexicographic ordering but unfortunately the world is not so standard.&lt;/p&gt;
&lt;h3&gt;Internal Primary Key Handling&lt;/h3&gt;
&lt;p&gt;I want to motivate people to actively define a PRIMARY KEY with BlitzDB. I plan to make this attractive by providing the best performance when PK is defined. In &lt;a href=&quot;http://torum.net/2009/12/end-of-year-progress-on-blitzdb/&quot;&gt;December 2009&lt;/a&gt;, my answer to this was to write the PK value as the key for the data dictionary (where actual rows are stored in BlitzDB). This allows BlitzDB to do a direct lookup on the data dictionary for PK based lookup, instead of consulting the B+Tree index. I&amp;#8217;m still fond of this lookup optimization approach but it introduces problems too. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 1.&lt;/strong&gt; Consider the following textual keys: &amp;#8220;key&amp;#8221; and &amp;#8220;KEY&amp;#8221;. They obviously have different binary representations but in certain cases they can be logically equivalent. Because the data dictionary is a hash database, this is a problem. The solution that instantly pops up is to normalize the key before writing or reading it. This however, causes a problem in cases where the two keys are inequivalent. Perhaps Drizzle/MySQL provides an internal normalization function that respects this. I still need to study this area of the storage subsystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem 2.&lt;/strong&gt; Directly writing a PK to the data dictionary means fast lookup but because of the data structure, it&amp;#8217;s not possible to fetch the next &amp;#8220;logical&amp;#8221; key, meaning I can&amp;#8217;t implement index scanning on PK as it is. Quick solution for users is to create an index on the PK column (this would create a separate B+Tree for it) but this is not so friendly because it requires the user to have prior knowledge of all this. So, my plan is to provide the best of both worlds. I&amp;#8217;ll elaborate on how I&amp;#8217;m planning on tackling this problem next.&lt;/p&gt;
&lt;h3&gt;Current Primary Key Read/Write Behavior&lt;/h3&gt;
&lt;p&gt;In general, keys of BlitzDB&amp;#8217;s data dictionary is a unique 8 byte integer. The idea is that BlitzDB writes this unique ID along with the key to the B+Tree Index so that it can later identify that row. The difference with PK is that, if a PK is present in a table, BlitzDB will not generate an internal unique ID and use PK for the data dictionary&amp;#8217;s key instead. BlitzDB won&amp;#8217;t create a B+Tree index for PK at the time I wrote this blog entry.&lt;/p&gt;
&lt;h3&gt;Next Step&lt;/h3&gt;
&lt;p&gt;Create a B+Tree index for PK anyway. BlitzDB will still use the PK value as the key for data dictionary if it exists. For PK based lookup requests, BlitzDB will look directly at the data dictionary and for PK based requests that involve index scanning, BlitzDB will look at the B+Tree index.&lt;/p&gt;
&lt;p&gt;This approach can consume more space when textual data is used for keys but I think it&amp;#8217;s worth it. At the same time, you can &lt;strong&gt;save space&lt;/strong&gt; if you use use types that are smaller than 8 bytes for PK. For example, using a 4 byte integer would reduce BlitzDB&amp;#8217;s key space by 50%.&lt;/p&gt;
&lt;p&gt;Hmm, I think my mind has cleared a little.&lt;/p&gt;</description>
	<pubDate>Fri, 15 Jan 2010 09:05:30 +0000</pubDate>
</item>
<item>
	<title>Toru Maesaka: Drizzle, BlitzDB and HTON_STATS_RECORDS_IS_EXACT</title>
	<guid>http://torum.net/?p=2326</guid>
	<link>http://torum.net/2010/01/blitzdb-and-record-counting/</link>
	<description>&lt;p&gt;Recently I enabled HTON_STATS_RECORDS_IS_EXACT in BlitzDB to let the optimizer know that BlitzDB can instantaneously return the number of rows in a specified table. As a result, the Drizzle kernel can directly call the Cursor::info() function to get the row count. To users, it means that SELECT COUNT statements can be executed in O(1). So it&amp;#8217;s a great thing in general.&lt;/p&gt;
&lt;h3&gt;Something Broke&lt;/h3&gt;
&lt;p&gt;After I enabled HTON_STATS_RECORDS_IS_EXACT, I noticed that issuing SELECT statement on a table with 1 row would no longer return a resultset. Weird indeed! after investigating with GDB, I noticed that rnd_next() is only called once instead of twice on a table with 1 row (second time is to find EOF) when HTON_STATS_RECORDS_IS_EXACT is enabled. This makes sense because the kernel knows that there is only 1 row and therefore it doesn&amp;#8217;t need to keep scanning for EOF. However, this made me scratch my head since this shouldn&amp;#8217;t break BlitzDB&amp;#8217;s table scanner.&lt;/p&gt;
&lt;h3&gt;Remedy&lt;/h3&gt;
&lt;p&gt;Logically, I was confident that BlitzDB&amp;#8217;s table scanner was functioning properly so I decided to look at what was going on beyond the engine API. Turns out that join_read_system() in sql_select.cc looks at the table-&gt;status value and decides that it&amp;#8217;s an error if 0 isn&amp;#8217;t assigned to it. What&amp;#8217;d you know? I realized that I wasn&amp;#8217;t assigning anything to the status variable. It&amp;#8217;s more that I didn&amp;#8217;t know that I was meant to update an internal structure. You&amp;#8217;d think that engine developers aren&amp;#8217;t meant to touch those. It&amp;#8217;s not mentioned in the &lt;a href=&quot;http://forge.mysql.com/wiki/MySQL_Internals_Custom_Engine&quot;&gt;Engine Documentation&lt;/a&gt; at MySQL Forge either. Nevertheless, the important thing is that it works now. Oh and SELECT COUNT is fast now too. &lt;/p&gt;
&lt;h3&gt;Eye Opener&lt;/h3&gt;
&lt;p&gt;This experience among other occasions where I had to read the kernel&amp;#8217;s source made me think that it would be nice to provide an intensive up to date documentation on how to develop storage engines for Drizzle in the future (when the API becomes stable). Needless to say, this would be co-ordinated within the Drizzle community. I&amp;#8217;m not a license person but it should hopefully be provided with a freely available license too.&lt;/p&gt;</description>
	<pubDate>Wed, 13 Jan 2010 13:23:34 +0000</pubDate>
</item>

</channel>
</rss>
