~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/innobase/trx/trx0sys.cc

  • Committer: Stewart Smith
  • Date: 2011-01-14 05:19:11 UTC
  • mto: (2086.1.3 build)
  • mto: This revision was merged to the branch mainline in revision 2087.
  • Revision ID: stewart@flamingspork.com-20110114051911-blfrsfy6yjvjg9rs
add note that impl of DROP INDEX should be documented

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
                                        fields */
53
53
};
54
54
 
55
 
#include <drizzled/errmsg_print.h>
56
 
 
57
55
/** The file format tag */
58
56
typedef struct file_format_struct       file_format_t;
59
57
 
92
90
UNIV_INTERN char        trx_sys_mysql_bin_log_name[TRX_SYS_MYSQL_LOG_NAME_LEN];
93
91
/** Binlog file position, or -1 if unknown */
94
92
UNIV_INTERN ib_int64_t  trx_sys_mysql_bin_log_pos       = -1;
95
 
 
96
 
UNIV_INTERN drizzled::atomic<uint64_t> trx_sys_commit_id;
97
 
 
98
93
/* @} */
99
94
#endif /* !UNIV_HOTBACKUP */
100
95
 
679
674
        mtr_commit(&mtr);
680
675
}
681
676
 
 
677
/*****************************************************************//**
 
678
Updates the offset information about the end of the MySQL binlog entry
 
679
which corresponds to the transaction just being committed. In a MySQL
 
680
replication slave updates the latest master binlog position up to which
 
681
replication has proceeded. */
682
682
UNIV_INTERN
683
683
void
684
 
trx_sys_flush_commit_id(uint64_t commit_id, ulint field, mtr_t* mtr)
 
684
trx_sys_update_mysql_binlog_offset(
 
685
/*===============================*/
 
686
        const char*     file_name,/*!< in: MySQL log file name */
 
687
        ib_int64_t      offset, /*!< in: position in that log file */
 
688
        ulint           field,  /*!< in: offset of the MySQL log info field in
 
689
                                the trx sys header */
 
690
        mtr_t*          mtr)    /*!< in: mtr */
685
691
{
686
 
        trx_sysf_t*     sys_header;
687
 
  
 
692
        trx_sysf_t*     sys_header;
 
693
 
 
694
        if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) {
 
695
 
 
696
                /* We cannot fit the name to the 512 bytes we have reserved */
 
697
 
 
698
                return;
 
699
        }
 
700
 
688
701
        sys_header = trx_sysf_get(mtr);
689
702
 
690
 
        mlog_write_ull(sys_header + field + TRX_SYS_DRIZZLE_MAX_COMMIT_ID, 
691
 
                       commit_id, mtr);
 
703
        if (mach_read_from_4(sys_header + field
 
704
                             + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
 
705
            != TRX_SYS_MYSQL_LOG_MAGIC_N) {
 
706
 
 
707
                mlog_write_ulint(sys_header + field
 
708
                                 + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD,
 
709
                                 TRX_SYS_MYSQL_LOG_MAGIC_N,
 
710
                                 MLOG_4BYTES, mtr);
 
711
        }
 
712
 
 
713
        if (0 != strcmp((char*) (sys_header + field + TRX_SYS_MYSQL_LOG_NAME),
 
714
                        file_name)) {
 
715
 
 
716
                mlog_write_string(sys_header + field
 
717
                                  + TRX_SYS_MYSQL_LOG_NAME,
 
718
                                  (byte*) file_name, 1 + ut_strlen(file_name),
 
719
                                  mtr);
 
720
        }
 
721
 
 
722
        if (mach_read_from_4(sys_header + field
 
723
                             + TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0
 
724
            || (offset >> 32) > 0) {
 
725
 
 
726
                mlog_write_ulint(sys_header + field
 
727
                                 + TRX_SYS_MYSQL_LOG_OFFSET_HIGH,
 
728
                                 (ulint)(offset >> 32),
 
729
                                 MLOG_4BYTES, mtr);
 
730
        }
 
731
 
 
732
        mlog_write_ulint(sys_header + field
 
733
                         + TRX_SYS_MYSQL_LOG_OFFSET_LOW,
 
734
                         (ulint)(offset & 0xFFFFFFFFUL),
 
735
                         MLOG_4BYTES, mtr);
692
736
}
693
737
 
694
 
 
 
738
/*****************************************************************//**
 
739
Stores the MySQL binlog offset info in the trx system header if
 
740
the magic number shows it valid, and print the info to stderr */
695
741
UNIV_INTERN
696
742
void
697
 
trx_sys_read_commit_id(void)
 
743
trx_sys_print_mysql_binlog_offset(void)
698
744
/*===================================*/
699
745
{
700
 
        trx_sysf_t*     sys_header;
701
 
        mtr_t           mtr;
702
 
 
703
 
        mtr_start(&mtr);
704
 
 
705
 
        sys_header = trx_sysf_get(&mtr);
706
 
 
707
 
        trx_sys_commit_id = mach_read_from_8(sys_header + TRX_SYS_DRIZZLE_LOG_INFO 
708
 
                                             + TRX_SYS_DRIZZLE_MAX_COMMIT_ID);
709
 
 
 
746
        trx_sysf_t*     sys_header;
 
747
        mtr_t           mtr;
 
748
        ulint           trx_sys_mysql_bin_log_pos_high;
 
749
        ulint           trx_sys_mysql_bin_log_pos_low;
 
750
 
 
751
        mtr_start(&mtr);
 
752
 
 
753
        sys_header = trx_sysf_get(&mtr);
 
754
 
 
755
        if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
 
756
                             + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
 
757
            != TRX_SYS_MYSQL_LOG_MAGIC_N) {
 
758
 
 
759
                mtr_commit(&mtr);
 
760
 
 
761
                return;
 
762
        }
 
763
 
 
764
        trx_sys_mysql_bin_log_pos_high = mach_read_from_4(
 
765
                sys_header + TRX_SYS_MYSQL_LOG_INFO
 
766
                + TRX_SYS_MYSQL_LOG_OFFSET_HIGH);
 
767
        trx_sys_mysql_bin_log_pos_low = mach_read_from_4(
 
768
                sys_header + TRX_SYS_MYSQL_LOG_INFO
 
769
                + TRX_SYS_MYSQL_LOG_OFFSET_LOW);
 
770
 
 
771
        trx_sys_mysql_bin_log_pos
 
772
                = (((ib_int64_t)trx_sys_mysql_bin_log_pos_high) << 32)
 
773
                + (ib_int64_t)trx_sys_mysql_bin_log_pos_low;
 
774
 
 
775
        ut_memcpy(trx_sys_mysql_bin_log_name,
 
776
                  sys_header + TRX_SYS_MYSQL_LOG_INFO
 
777
                  + TRX_SYS_MYSQL_LOG_NAME, TRX_SYS_MYSQL_LOG_NAME_LEN);
 
778
 
 
779
        fprintf(stderr,
 
780
                "InnoDB: Last MySQL binlog file position %lu %lu,"
 
781
                " file name %s\n",
 
782
                trx_sys_mysql_bin_log_pos_high, trx_sys_mysql_bin_log_pos_low,
 
783
                trx_sys_mysql_bin_log_name);
 
784
 
 
785
        mtr_commit(&mtr);
 
786
}
 
787
 
 
788
/*****************************************************************//**
 
789
Prints to stderr the MySQL master log offset info in the trx system header if
 
790
the magic number shows it valid. */
 
791
UNIV_INTERN
 
792
void
 
793
trx_sys_print_mysql_master_log_pos(void)
 
794
/*====================================*/
 
795
{
 
796
        trx_sysf_t*     sys_header;
 
797
        mtr_t           mtr;
 
798
 
 
799
        mtr_start(&mtr);
 
800
 
 
801
        sys_header = trx_sysf_get(&mtr);
 
802
 
 
803
        if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
804
                             + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
 
805
            != TRX_SYS_MYSQL_LOG_MAGIC_N) {
 
806
 
 
807
                mtr_commit(&mtr);
 
808
 
 
809
                return;
 
810
        }
 
811
 
 
812
        fprintf(stderr,
 
813
                "InnoDB: In a MySQL replication slave the last"
 
814
                " master binlog file\n"
 
815
                "InnoDB: position %lu %lu, file name %s\n",
 
816
                (ulong) mach_read_from_4(sys_header
 
817
                                         + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
818
                                         + TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
 
819
                (ulong) mach_read_from_4(sys_header
 
820
                                         + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
821
                                         + TRX_SYS_MYSQL_LOG_OFFSET_LOW),
 
822
                sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
823
                + TRX_SYS_MYSQL_LOG_NAME);
 
824
        /* Copy the master log position info to global variables we can
 
825
        use in ha_innobase.cc to initialize glob_mi to right values */
 
826
 
 
827
        ut_memcpy(trx_sys_mysql_master_log_name,
 
828
                  sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
829
                  + TRX_SYS_MYSQL_LOG_NAME,
 
830
                  TRX_SYS_MYSQL_LOG_NAME_LEN);
 
831
 
 
832
        trx_sys_mysql_master_log_pos
 
833
                = (((ib_int64_t) mach_read_from_4(
 
834
                            sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
835
                            + TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) << 32)
 
836
                + ((ib_int64_t) mach_read_from_4(
 
837
                           sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO
 
838
                           + TRX_SYS_MYSQL_LOG_OFFSET_LOW));
710
839
        mtr_commit(&mtr);
711
840
}
712
841
 
1029
1158
                format_id = DICT_TF_FORMAT_MIN;
1030
1159
        }
1031
1160
 
1032
 
        drizzled::errmsg_printf(drizzled::error::INFO, "InnoDB: highest supported file format is %s",
1033
 
                                trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX));
 
1161
        ut_print_timestamp(stderr);
 
1162
        fprintf(stderr,
 
1163
                "  InnoDB: highest supported file format is %s.\n",
 
1164
                trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX));
1034
1165
 
1035
1166
        if (format_id > DICT_TF_FORMAT_MAX) {
1036
1167
 
1037
1168
                ut_a(format_id < FILE_FORMAT_NAME_N);
1038
1169
 
1039
 
                drizzled::errmsg_printf(drizzled::error::ERROR,
1040
 
                        "InnoDB: %s: the system tablespace is in a file "
1041
 
                        "format that this version doesn't support - %s",
 
1170
                ut_print_timestamp(stderr);
 
1171
                fprintf(stderr,
 
1172
                        "  InnoDB: %s: the system tablespace is in a file "
 
1173
                        "format that this version doesn't support - %s\n",
1042
1174
                        ((max_format_id <= DICT_TF_FORMAT_MAX)
1043
1175
                                ? "Error" : "Warning"),
1044
1176
                        trx_sys_file_format_id_to_name(format_id));
1209
1341
}
1210
1342
 
1211
1343
#else /* !UNIV_HOTBACKUP */
 
1344
/*****************************************************************//**
 
1345
Prints to stderr the MySQL binlog info in the system header if the
 
1346
magic number shows it valid. */
 
1347
UNIV_INTERN
 
1348
void
 
1349
trx_sys_print_mysql_binlog_offset_from_page(
 
1350
/*========================================*/
 
1351
        const byte*     page)   /*!< in: buffer containing the trx
 
1352
                                system header page, i.e., page number
 
1353
                                TRX_SYS_PAGE_NO in the tablespace */
 
1354
{
 
1355
        const trx_sysf_t*       sys_header;
 
1356
 
 
1357
        sys_header = page + TRX_SYS;
 
1358
 
 
1359
        if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO
 
1360
                             + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD)
 
1361
            == TRX_SYS_MYSQL_LOG_MAGIC_N) {
 
1362
 
 
1363
                fprintf(stderr,
 
1364
                        "ibbackup: Last MySQL binlog file position %lu %lu,"
 
1365
                        " file name %s\n",
 
1366
                        (ulong) mach_read_from_4(
 
1367
                                sys_header + TRX_SYS_MYSQL_LOG_INFO
 
1368
                                + TRX_SYS_MYSQL_LOG_OFFSET_HIGH),
 
1369
                        (ulong) mach_read_from_4(
 
1370
                                sys_header + TRX_SYS_MYSQL_LOG_INFO
 
1371
                                + TRX_SYS_MYSQL_LOG_OFFSET_LOW),
 
1372
                        sys_header + TRX_SYS_MYSQL_LOG_INFO
 
1373
                        + TRX_SYS_MYSQL_LOG_NAME);
 
1374
        }
 
1375
}
 
1376
 
1212
1377
 
1213
1378
/* THESE ARE COPIED FROM NON-HOTBACKUP PART OF THE INNODB SOURCE TREE
1214
1379
   (This code duplicaton should be fixed at some point!)