Bug #29371 Falcon does not support replication as a transactional engine
Submitted: 26 Jun 2007 19:18 Modified: 30 Jul 2008 14:14
Reporter: Brian Aker Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Falcon storage engine Severity:S3 (Non-critical)
Version:6.0 OS:Any
Assigned to: Ann Harrison CPU Architecture:Any

[26 Jun 2007 19:18] Brian Aker
Description:
This is disabled in Falcon:
#ifdef XA_ENABLED
        falcon_hton->prepare = NfsStorageTable::prepare;
#endif

With this being disabled Falcon can not be used for replication.

A commit in Falcon will not be synchronized with the transaction in the binary log. AKA the commit occurs in Falcon, but if the crash occurs before the binary log syncs (which is not guaranteed  without the prepare call), the data will not be stored for replication. Innodb does this properly. 

How to repeat:
Put an assert right after the commit call to falcon and compare the results in what the slave eventually replicates. 

Suggested fix:
Enable the ifdef by default in all builds.
[26 Jun 2007 20:18] Ann Harrison
Turning on XA would be a lot easier if this code weren't in handler.cc

#ifndef WILL_BE_DELETED_LATER
  /*
    for now, only InnoDB supports 2pc. It means we can always safely
    rollback all pending transactions, without risking inconsistent data
  */
  DBUG_ASSERT(total_ha_2pc == (ulong) opt_bin_log+1); // only InnoDB and binlog
  tc_heuristic_recover= TC_HEURISTIC_RECOVER_ROLLBACK; // forcing ROLLBACK
  info.dry_run=FALSE;
#endif

Cheers,

Ann
[26 Jun 2007 20:39] Brian Aker
Currently though it won't work even if you don't compile in Innodb (aka remove it). So even if you compile out Innodb... Falcon still won't work with replication.
[26 Jun 2007 22:10] MySQL Verification Team
Thank you for the bug report.
[31 Aug 2007 15:56] Kevin Lewis
Assigned to Ann Harrison
[30 Nov 2007 22:30] Ann Harrison
The XA_ENABLED conditional code has been integrated into Falcon
generally and the condition is removed.  You can control whether
Falcon participates in two-phase commit transactions with the 
parameter falcon_support_xa.  When the parameter is set to zero,
Falcon does not report itself as a 2pc engine and commits are
single phase.  When the parameter is set to 1, it does and does.

There are still a number of issues to resolve before two 2pc 
engines can run in the same server and coordinate their actions.
[3 Dec 2007 13:04] Ann Harrison
Falcon has code to handle a two-phase commit which can be
disabled with the switch falcon_support_xa.  By default, the
switch is off.  The server does not support the existence of
two two-phase-commit engines so if falcon_support_xa is turned
on, you must also use the switch --skip_innodb.
[3 Dec 2007 16:34] Jeffrey Pugh
A new bug (32926) has been opened for the fact that the Server does not support two XA-enabled engines running concurrently.
[11 Feb 2008 19:48] Kevin Lewis
Patch is in mysql-6.0-falcon and mysql-6.0-release version 6.0.4
[30 Jul 2008 14:14] MC Brown
A note has been added to the 6.0.4 changelog: 

A new configuration option, falcon_support_xa has been added. The option specifies whether Falcon should report itself as a two-phase commit storage engine, and therefore take part in XA transactions.