Commit e1f13fb2 authored by unknown's avatar unknown
Browse files

Required changes to support recovery of X/Open XA in InnoDB.


innobase/lock/lock0lock.c:
  Add prepared state to concurrency states in lock validate.
innobase/trx/trx0trx.c:
  Prepared transactions are active transactions in file based word.
sql/ha_innodb.cc:
  Add full support of X/Open XA to InnoDB.
parent a7401bf7
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -4417,8 +4417,9 @@ lock_table_queue_validate(
	lock = UT_LIST_GET_FIRST(table->locks);

	while (lock) {
		ut_a(((lock->trx)->conc_state == TRX_ACTIVE)
		     || ((lock->trx)->conc_state == TRX_COMMITTED_IN_MEMORY));
		ut_a((lock->trx)->conc_state == TRX_ACTIVE ||
		      	(lock->trx)->conc_state == TRX_PREPARED || 
			(lock->trx)->conc_state == TRX_COMMITTED_IN_MEMORY);
	
		if (!lock_get_wait(lock)) {

@@ -4464,9 +4465,9 @@ lock_rec_queue_validate(
		lock = lock_rec_get_first(rec);

		while (lock) {
			ut_a(lock->trx->conc_state == TRX_ACTIVE
		     	     || lock->trx->conc_state
						== TRX_COMMITTED_IN_MEMORY);
			ut_a(lock->trx->conc_state == TRX_ACTIVE ||
			     lock->trx->conc_state == TRX_PREPARED ||
			     lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY);
	
			ut_a(trx_in_trx_list(lock->trx));
			
@@ -4518,8 +4519,10 @@ lock_rec_queue_validate(
	lock = lock_rec_get_first(rec);

	while (lock) {
		ut_a(lock->trx->conc_state == TRX_ACTIVE
		     || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY);
		ut_a(lock->trx->conc_state == TRX_ACTIVE ||
		     lock->trx->conc_state == TRX_PREPARED ||
		     lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY);

		ut_a(trx_in_trx_list(lock->trx));
	
		if (index) {
@@ -4600,8 +4603,9 @@ lock_rec_validate_page(
	}

	ut_a(trx_in_trx_list(lock->trx));
	ut_a(lock->trx->conc_state == TRX_ACTIVE
		     || lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY);
	ut_a(lock->trx->conc_state == TRX_ACTIVE ||
	     lock->trx->conc_state == TRX_PREPARED ||
	     lock->trx->conc_state == TRX_COMMITTED_IN_MEMORY);
	
	for (i = nth_bit; i < lock_rec_get_n_bits(lock); i++) {

+1 −3
Original line number Diff line number Diff line
@@ -1612,12 +1612,10 @@ trx_print(
			fputs(", not started", f);
			break;
		case TRX_ACTIVE:
		case TRX_PREPARED:
			fprintf(f, ", ACTIVE %lu sec",
				(ulong)difftime(time(NULL), trx->start_time));
                        break;
                case TRX_PREPARED:
			fputs(", PREPARED", f);
                        break;
		case TRX_COMMITTED_IN_MEMORY:
			fputs(", COMMITTED IN MEMORY", f);
			break;
+9 −41
Original line number Diff line number Diff line
@@ -162,12 +162,12 @@ static handlerton innobase_hton = {
  innobase_savepoint,
  innobase_rollback_to_savepoint,
  NULL,				/* savepoint_release */
  innobase_commit,
  innobase_rollback,
  innobase_xa_prepare, //makes flush_block_commit test to fail
  NULL,                         /* recover */
  NULL,                         /* commit_by_xid */
  NULL,                         /* rollback_by_xid */
  innobase_commit,		/* commit */
  innobase_rollback,		/* rollback */
  innobase_xa_prepare,		/* prepare */
  innobase_xa_recover,		/* recover */
  innobase_commit_by_xid,	/* commit_by_xid */
  innobase_rollback_by_xid,	/* rollback_by_xid */
};

/*********************************************************************
@@ -6019,36 +6019,4 @@ int innobase_rollback_by_xid(
	}
}

/***********************************************************************
This function is used to test commit/rollback of XA transactions */

int innobase_xa_end(
/*================*/
	THD*	thd)	/* in: MySQL thread handle of the user for whom
			transactions should be recovered */
{
        DBUG_ENTER("innobase_xa_end");

	XID trx_list[100];
	int trx_num, trx_num_max = 100;
	int i;
	XID xid;

	while((trx_num = innobase_xa_recover(trx_list, trx_num_max))) {

		for(i=0;i < trx_num; i++) {
			xid = trx_list[i];

			if ( i % 2) {
				innobase_commit_by_xid(&xid);
			} else {
				innobase_rollback_by_xid(&xid);
			}
		}
	}

	free(trx_list);

	DBUG_RETURN(0);
}
#endif /* HAVE_INNOBASE_DB */