Bullshit Tiger. bullshit.

Screenshot-3

It also took them over an hour to make the announcement that the flight had been delayed. The screens just flashed “Boarding” for an hour (and they still are).

Delays are fine. Complete and total lack of any communication whatsoever is not.

Simply jumping on a microphone and saying “we’re experiencing a delay, we’ll have more information for you in half an hour” would be better. We seriously heard nothing for a whole hour after “Boarding” had started.

Just a closed door.

Somehow I feel this will be the last time I fly this airline.

Photos of Burning Man: Getting to Black Rock City

This year was my first burn. More amazing than I could have imagined. I think it was day two when Brian caught me saying “so, next year what we’re going to do…”

Due to the harsh environmental conditions, I wasn’t too keen on the idea of taking my digital gear (it ain’t cheap) and had the idea of handing cameras to people and having a kind of communal photo album (planning for a larger scale implementation of this next year). So… I went purely film. Several older and smaller compact 35mm cameras that I picked up either for nothing or next to (no loss if lost or dead!) plus a Ricoh SLR was my arsenal.

Now… that means I need film.

I mainly shot the new Kodak Ektar 100 and a Kodak Ektachrome E100VS. For the smaller, cheap 35mm ones, I just used some Fuji Superia.

trees in Portland

Trees in Portland

Firstly though, there was a stop in Portland to a) recover from jetlag and b) hang out with Eric, Wendy and their dogs. I do like Portland, quite a lot actually. While there, managed to get some work done, fiddle with some SPARC hardware that Eric has, enjoy excellent vegan ice cream, enjoy awesome vegan food (both at home and out) and walk around both downtown and up in the hills. Portland (and Oregon) is certainly pretty.

trees in seattle

Trees in Seattle

Before heading to Burning Man, I was in Seattle, where Leah joined me to prep for (and then go to) Burning man.

Then Leah and I were in San Francisco for a day. This is when I started shooting exclusively film for the first time in… well.. Since 2002 (I got my first digital camera for linux.conf.au in 2003)

05

Leah enjoying going around San Francisco

We actually did some touristy things… so I saw a bit more of San Francisco than I have before. One issue with mostly being around San Francisco just before/after the MySQL Users Conference is a severe lack of time/energy to go for much exploring. Preparing is exhausting, and afterwards I just want to really chill out – usually heading out to some forest or down to Santa Cruz or just hanging out with cool people.

Across the Golden gate

Going over the Golden Gate Bridge

One of the most surprising things was running into David while just walking down the street. Although knew he was in town, and we’d planned to all go down to Burning Man together, actually running into somebody in the street always surprises me.

I’m pretty sure this was the first time that I went across the Golden Gate Bridge. Seen it, taken photos of it, used said photos as my desktop background, but this was the first time going across it and looking back on the city. Manual focus, moving bus: epic amounts of fun… I’d kinda forgotten how much fun this could be.

Sun going down in San Francisco

Sun going down in San Francisco

There are things I like about San Francisco, but if I had to call somewhere in the US home, Seattle and Portland are both much higher on the list. Maybe it’s because of the wonderful coffee of Seattle, or the laid backness and awesome vegan food of Portland or if I’m just delusional and think it’d be possible to catch a Nirvana gig in Seattle.

In the evening in San Francisco we met up with David again and went down to the beach. It was pretty. Somehow, I deluded myself into thinking “ISO 100 Film, no tripod, cold, sunset…. Photo time!” I did get one I quite like too:

The Sun setting over the water, San Francisco

The Sun setting over the water, San Francisco

After what can only be described as a “I love side impact airbags” car crash on the way back to the Hotel (everybody okay: shaken, not stirred. also not our fault), headed back for a stiff drink, some sleep and eagerly awaiting the drive to Reno and then Black Rock City.

Waiting in line to get into Black Rock City (for many, many hours)

Waiting in line to get into Black Rock City (for many, many hours)

It was not a short wait once we got to the gate. We did, however, not too long after sunrise, make it to camp. I have no idea where I shot this from… but it was before we got to camp (or at least the first photo of us helping to set up):

People arriving at Black Rock City: first thing in the morning

People arriving at Black Rock City: first thing in the morning

More to come… including setup of Pi Camp!

Drizzle FRM replacement: the table proto

Drizzle originally inherited the FRM file from MySQL (which inherited it from UNIREG). The FRM file stores metadata about a table; what columns it has, what type those columns are, what indexes, any default values, comments etc are all stored in the FRM. In the days of MyISAM, this worked relatively well. The row data was stored in table.MYD, indexes on top of it in table.MYI and information about the format of the row was
in table.FRM. Since MyISAM itself wasn’t crash safe, it didn’t really matter if creating/deleting the FRM file along with the table was either.

As more sophisticated engines were introduced (e.g. InnoDB) that had their own data dictionary, there started to be more of a problem. There were now two places storing information about a table: the FRM file and the data dictionary specific to the engine. Even if the data dictionary of the storage engine was crash safe, the FRM file was not plugged into that, so you could end up in a situation where the storage engine
recovered from a crash okay, but the FRM was incorrect for what the engine recovered to. This would always require manual intervention to find out what went wrong and then fix it (in some rather unusual ways).

When the MySQL Cluster (NDB) engine was introduced, a new set of problems arose. Now the MySQL server was connecting to an existing database, where tables could be created on other nodes connected to the cluster. You now not only had the problems of crash recovery, but the problems of keeping the FRM files in sync across many nodes, requiring
all sorts of interesting solutions that, for the most part, do work.

The “obvious” solution to some of these problems would be for an engine to write out an FRM file itself. This is much easier said than done. The file format was never created to be read and written by multiple pieces of software, the code that did the reading and writing inside the server was not reusable elsewhere and the only documentation (that
wasn’t a decent chunk of the MySQL source tree) is the rather incomplete definition in the MySQL Internals wiki (http://forge.mysql.com/wiki/MySQL_Internals_File_Formats) – not nearly enough to write a correct FRM file as the specifics are very, very odd.

Our goals for reworking the metadata system in Drizzle were: to allow engines to own their own metadata (removing any opportunity to have inconsistencies between the engine and the ‘FRM’) and for engines without their own data dictionary, to replace the FRM file format with something simple and well documented.

One option was to use SQL as the standard storage format, but it is rather non-trivial and expensive to parse – especially if we were to use it as the preferred way of talking table definitions with storage engines. We had been looking at the protobuf library
(http://code.google.com/p/protobuf/) ever since its first release and it has a number of very nice characteristics: a description language of a data structure that is then used to generate APIs for reading and writing it in a number of programming languages and a standard (documented) way to serialize the data structure.

After a bit of discussion, we arrived at a good outline for the table definition proto. The current one can always be found in the Drizzle source tree at drizzled/message/table.proto. The current format is very close to final (i.e. one that we’ll suppport upgrades from).

The process of modifying the Drizzle code base so that it would write (and read) a file format different to the FRM isn’t worth going too much into here although there were some interesting hurdles to overcome. An interesting one was the FRM file contains a binary image of the default row for the table (which is in the row format that the server uses); we now store the default value for each column in the proto and generate the default row when we read the proto. Another interesting one was removing and refactoring “pack_flag” – the details of which should only be extracted from Jay or Stewart with a liberal application of fine ale.

The end result is that we now have storage engines that are completely responsible for their own metadata. One example is the ARCHIVE engine. In the CREATE TABLE code path, the ARCHIVE storage engine gets the table definition in an object that represents the table proto. It can examine the parameters it needs to and then either store the proto directly, or convert it into its own format. Since ARCHIVE is simple, it just stores
the table proto in a serialised form (using a standard function provided by the protobuf library) and stores it in the .ARZ data file for the table. This instantly makes the ARCHIVE storage engine crash safe for CREATE and DROP table as there is only 1 file on disk, so no two files to get out of sync.

If an engine does not have its own data dictionary, it can still use the default implementation which just stores the serialised table proto in a file on disk.

We can also now use this interface to move INFORMATION_SCHEMA into its own storage engine. This means we can remove a lot of special case code throughout the server for INFORMATION_SCHEMA and instead just have a INFORMATION_SCHEMA storage engine that says it has the following tables in the INFORMATION_SCHEMA database. Because the table definition is now in a documented format with a standard API, this becomes a relatively trivial exercise.

What we’re all looking forward to is when the InnoDB data dictionary is linked into the new interface and we can have a truly crash safe database server.

Another wonderful side effect is since we now have a standard data structure for representing a table definition, we can integrate this with the replication system. In the “near” future, we can represent a CREATE TABLE in the replication stream as a table proto and not the raw SQL. If you were wanting to apply the replication stream to a different database server, you then only have to write a table proto to SQL
converter. If the target database system doesn’t do SQL at all, you could generate API calls to create the table.

So we now have a rather flexible system in place, with the code implementing it being increasingly simple and possible to be “obviously correct”.

Things that easily fall out of this work that people have written about:
– CREATE TABLE LIKE with ENGINE clause
http://krow.livejournal.com/671235.html
– table_raw_reader – looking at the raw representation of table metadata
http://www.flamingspork.com/blog/2009/10/01/table_raw_reader-reading-the-table-proto-from-disk-and-examining-everything/
– Table discovery
http://www.flamingspork.com/blog/2009/07/29/table-discovery-for-drizzle-take-2-now-merged/

Some more info:
http://krow.livejournal.com/642329.html

SAGE-AU

Before heading to the US for Shizzlin’ the Drizzle (okay, it really is just a meeting) I headed to Surfers for SAGE-AU 2009. I previously spoke at a SAGE-AU in Canberra a couple of years ago (Wikipedia tells me that it must have been 2006). This time, I was there speaking on Drizzle. I could only make the conference for a limited amount of time due to having to get to the US for our Drizzle team meeting (I even skipped out on the dinner early as I had to be up very early for catching flights).

The conference was a bit smaller than I would have hoped (I wonder if economic downturn is part of this, or are people finding that they are getting enough benefit from just conferences such as linux.conf.au and/or OSDC).

The dinner was pretty cool though, at Dreamworld and got to ride tower of terror for an hour :) There were also tigers:

1024DSC_4475(apologies for tremendously high ISO and really bad lighting conditions). They can also climb trees:

1024DSC_4520

Unwired and Australian Government Content Filtering Trial

Just got an email from Unwired asking if I’d like to voluntarily join a trial. A censorship trial. The wonderful “you can’t know what you aren’t allowed to see” form of “trust me” democracy embraced by our current government.

I first used Unwired for the time it took for Telstra to recover from screwing me when I moved (and bringing the DSL connection with me). I’ve kept the device around to enable on-the-road net connection on occasion and as a backup to my DSL line.

I’ll now look for an alternative backup internet solution.

Drizzle pluggable MetadataStore (or: no table definition file on disk)

My code is shaping up rather nicely (see https://code.launchpad.net/~stewart/drizzle/discovery) and I’m planning to submit a merge-request for it later today.

I’m about to commit code that implements a MetadataStore for the ARCHIVE engine. This means that for ARCHIVE tables, you only have the .ARZ file on disk. The table definition protobuf is stored in the ARZ during createTable() and the ARCHIVE MetadataStore can read it.

The StorageEngine now gets the drizzled::message::Table (i.e. the table definition protobuf) as a parameter. Eventually, we will fully be using this to tell the engine about the table structure (this is a work-in-progress). The advantages of using the proto as the standard way of passing around table definitions are numerous. I see it as almost essential to get this into the replication log for cross-DBMS replication.

We still have the default way of storing table metadata- in a table definition file (for MySQL it’s the FRM, for Drizzle it’s the table proto serialized into a file ending in ‘.dfe’). However, in my https://code.launchpad.net/~stewart/drizzle/discovery if an engine provides its own MetadataStore, then it is the StorageEngine who is responsible for storing the table definition (either in it’s data file or data dictionary). It is also then responsible for making sure rename works and that the definition is cleaned up on drop table.

The MetadataStore provided by the StorageEngine is also used when searching for metadata such as for SHOW CREATE TABLE, SHOW TABLES, INFORMATION_SCHEMA, CREATE LIKE and when getting the table definition before opening the table.

The way the ARCHIVE MetadataStore works is that it reads the table proto out of the header of the ARZ file when asked for it. This has the side effect of now being able to copy ARZ files between servers and have it “just work”.

It will be really nice if we directly interface to the InnoDB Data Dictionary (or even just store the table protos in an InnoDB table manipulated in the same transaction as the DDL) as then we move a lot closer to closing a number of places where we (and MySQL) are not crash-safe.

perhaps i should go open the garage…

--------------------------------------------------------------------------------
System Temperatures (Temperatures in Celsius):
--------------------------------------------------------------------------------
Sensor           Status  Temp LowHard LowSoft LowWarn HighWarn HighSoft HighHard
--------------------------------------------------------------------------------
MB/T_AMB         OK        43    -10      -5       0      45       50       55
MB/CMP0/T_TCORE  OK        51    -10      -5       0      85       90       95
MB/CMP0/T_BCORE  OK        51    -10      -5       0      85       90       95
MB/IOB/T_CORE    OK        55    -10      -5       0      95      100      105

Spoke too soon:

--------------------------------------------------------------------------------
System Temperatures (Temperatures in Celsius):
--------------------------------------------------------------------------------
Sensor           Status  Temp LowHard LowSoft LowWarn HighWarn HighSoft HighHard
--------------------------------------------------------------------------------
MB/T_AMB         OK        45    -10      -5       0      45       50       55
MB/CMP0/T_TCORE  OK        58    -10      -5       0      85       90       95
MB/CMP0/T_BCORE  OK        58    -10      -5       0      85       90       95
MB/IOB/T_CORE    OK        57    -10      -5       0      95      100      105

So… how much email am I storing?

stewart@saturn:~$ time du -sh Maildir
15G    Maildir

real    0m55.749s
user    0m1.008s
sys    0m17.205s

interestingly the tar.bz2 archive of this is only 3.4GB.

It also takes *much* longer to run this on my laptop (over 5 minutes). mmmm… raid.

I’ve also deleted a lot of mailing list mail over the years… i wonder what that would be if i hadn’t….