~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/fsp/fsp0fsp.c

  • Committer: Monty Taylor
  • Date: 2008-09-15 17:24:04 UTC
  • Revision ID: monty@inaugust.com-20080915172404-ygh6hiyu0q7qpa9x
Removed strndup calls.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
#include "fut0fut.h"
20
20
#include "ut0byte.h"
21
21
#include "srv0srv.h"
22
 
#include "page0zip.h"
 
22
#include "page0types.h"
23
23
#include "ibuf0ibuf.h"
24
24
#include "btr0btr.h"
25
25
#include "btr0sea.h"
60
60
                                        about the first extent, but have not
61
61
                                        physically allocted those pages to the
62
62
                                        file */
63
 
#define FSP_SPACE_FLAGS         16      /* table->flags & ~DICT_TF_COMPACT */
 
63
#define FSP_LOWEST_NO_WRITE     16      /* The lowest page offset for which
 
64
                                        the page has not been written to disk
 
65
                                        (if it has been written, we know that
 
66
                                        the OS has really reserved the
 
67
                                        physical space for the page) */
64
68
#define FSP_FRAG_N_USED         20      /* number of used pages in the
65
69
                                        FSP_FREE_FRAG list */
66
70
#define FSP_FREE                24      /* list of free extents */
135
139
        (16 + 3 * FLST_BASE_NODE_SIZE                   \
136
140
         + FSEG_FRAG_ARR_N_SLOTS * FSEG_FRAG_SLOT_SIZE)
137
141
 
138
 
#define FSP_SEG_INODES_PER_PAGE(zip_size)               \
139
 
        (((zip_size ? zip_size : UNIV_PAGE_SIZE)        \
140
 
          - FSEG_ARR_OFFSET - 10) / FSEG_INODE_SIZE)
 
142
#define FSP_SEG_INODES_PER_PAGE                                         \
 
143
        ((UNIV_PAGE_SIZE - FSEG_ARR_OFFSET - 10) / FSEG_INODE_SIZE)
141
144
                                /* Number of segment inodes which fit on a
142
145
                                single page */
143
146
 
216
219
fsp_free_extent(
217
220
/*============*/
218
221
        ulint           space,  /* in: space id */
219
 
        ulint           zip_size,/* in: compressed page size in bytes
220
 
                                or 0 for uncompressed pages */
221
222
        ulint           page,   /* in: page offset in the extent */
222
223
        mtr_t*          mtr);   /* in: mtr */
223
224
/**************************************************************************
228
229
/*=============*/
229
230
        fseg_inode_t*   seg_inode, /* in: segment inode */
230
231
        ulint           space,  /* in: space id */
231
 
        ulint           zip_size,/* in: compressed page size in bytes
232
 
                                or 0 for uncompressed pages */
233
232
        ulint           page,   /* in: page offset in the extent */
234
233
        mtr_t*          mtr);   /* in: mtr handle */
235
234
/**************************************************************************
252
251
/*================*/
253
252
        fseg_inode_t*   seg_inode,/* in: segment inode */
254
253
        ulint           space,  /* in: space id */
255
 
        ulint           zip_size,/* in: compressed page size in bytes
256
 
                                or 0 for uncompressed pages */
257
254
        ulint           page,   /* in: page offset */
258
255
        mtr_t*          mtr);   /* in: mtr */
259
256
/**************************************************************************
267
264
                                /* out: the first extent descriptor, or NULL if
268
265
                                none */
269
266
        fseg_inode_t*   inode,  /* in: segment inode */
270
 
        ulint           space,  /* in: space id */
271
 
        ulint           zip_size,/* in: compressed page size in bytes
272
 
                                or 0 for uncompressed pages */
273
267
        mtr_t*          mtr);   /* in: mtr */
274
268
/**************************************************************************
275
269
Puts new extents to the free list if
299
293
                                /* out: the allocated page number, FIL_NULL
300
294
                                if no page could be allocated */
301
295
        ulint           space,  /* in: space */
302
 
        ulint           zip_size,/* in: compressed page size in bytes
303
 
                                or 0 for uncompressed pages */
304
296
        fseg_inode_t*   seg_inode, /* in: segment inode */
305
297
        ulint           hint,   /* in: hint of which page would be desirable */
306
298
        byte            direction, /* in: if the new page is needed because
313
305
 
314
306
/**************************************************************************
315
307
Reads the file space size stored in the header page. */
316
 
UNIV_INTERN
 
308
 
317
309
ulint
318
310
fsp_get_size_low(
319
311
/*=============*/
331
323
/*=================*/
332
324
                        /* out: pointer to the space header, page x-locked */
333
325
        ulint   id,     /* in: space id */
334
 
        ulint   zip_size,/* in: compressed page size in bytes
335
 
                        or 0 for uncompressed pages */
336
326
        mtr_t*  mtr)    /* in: mtr */
337
327
{
338
 
        buf_block_t*    block;
339
328
        fsp_header_t*   header;
340
329
 
341
 
        ut_ad(ut_is_2pow(zip_size));
342
 
        ut_ad(zip_size <= UNIV_PAGE_SIZE);
343
 
        ut_ad(!zip_size || zip_size >= PAGE_ZIP_MIN_SIZE);
344
 
        ut_ad(id || !zip_size);
 
330
        ut_ad(mtr);
345
331
 
346
 
        block = buf_page_get(id, zip_size, 0, RW_X_LATCH, mtr);
347
 
        header = FSP_HEADER_OFFSET + buf_block_get_frame(block);
 
332
        header = FSP_HEADER_OFFSET + buf_page_get(id, 0, RW_X_LATCH, mtr);
348
333
#ifdef UNIV_SYNC_DEBUG
349
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
334
        buf_page_dbg_add_level(header, SYNC_FSP_PAGE);
350
335
#endif /* UNIV_SYNC_DEBUG */
351
 
        ut_ad(id == mach_read_from_4(FSP_SPACE_ID + header));
352
 
        ut_ad(zip_size == dict_table_flags_to_zip_size(
353
 
                      mach_read_from_4(FSP_SPACE_FLAGS + header)));
354
336
        return(header);
355
337
}
356
338
 
371
353
        ulint   byte_index;
372
354
        ulint   bit_index;
373
355
 
374
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
356
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
357
                                MTR_MEMO_PAGE_X_FIX));
375
358
        ut_ad((bit == XDES_FREE_BIT) || (bit == XDES_CLEAN_BIT));
376
359
        ut_ad(offset < FSP_EXTENT_SIZE);
377
360
 
403
386
        ulint   bit_index;
404
387
        ulint   descr_byte;
405
388
 
406
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
389
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
390
                                MTR_MEMO_PAGE_X_FIX));
407
391
        ut_ad((bit == XDES_FREE_BIT) || (bit == XDES_CLEAN_BIT));
408
392
        ut_ad(offset < FSP_EXTENT_SIZE);
409
393
 
441
425
        ut_ad(descr && mtr);
442
426
        ut_ad(val <= TRUE);
443
427
        ut_ad(hint < FSP_EXTENT_SIZE);
444
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
428
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
429
                                MTR_MEMO_PAGE_X_FIX));
445
430
        for (i = hint; i < FSP_EXTENT_SIZE; i++) {
446
431
                if (val == xdes_get_bit(descr, bit, i, mtr)) {
447
432
 
479
464
        ut_ad(descr && mtr);
480
465
        ut_ad(val <= TRUE);
481
466
        ut_ad(hint < FSP_EXTENT_SIZE);
482
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
467
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
468
                                MTR_MEMO_PAGE_X_FIX));
483
469
        for (i = hint + 1; i > 0; i--) {
484
470
                if (val == xdes_get_bit(descr, bit, i - 1, mtr)) {
485
471
 
511
497
        ulint   count   = 0;
512
498
 
513
499
        ut_ad(descr && mtr);
514
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
500
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
501
                                MTR_MEMO_PAGE_X_FIX));
515
502
        for (i = 0; i < FSP_EXTENT_SIZE; i++) {
516
503
                if (FALSE == xdes_get_bit(descr, XDES_FREE_BIT, i, mtr)) {
517
504
                        count++;
570
557
        ut_ad(descr && mtr);
571
558
        ut_ad(state >= XDES_FREE);
572
559
        ut_ad(state <= XDES_FSEG);
573
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
560
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
561
                                MTR_MEMO_PAGE_X_FIX));
574
562
 
575
563
        mlog_write_ulint(descr + XDES_STATE, state, MLOG_4BYTES, mtr);
576
564
}
585
573
        xdes_t* descr,  /* in: descriptor */
586
574
        mtr_t*  mtr)    /* in: mtr handle */
587
575
{
588
 
        ulint   state;
589
 
 
590
576
        ut_ad(descr && mtr);
591
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
577
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
578
                                MTR_MEMO_PAGE_X_FIX));
592
579
 
593
 
        state = mtr_read_ulint(descr + XDES_STATE, MLOG_4BYTES, mtr);
594
 
        ut_ad(state - 1 < XDES_FSEG);
595
 
        return(state);
 
580
        return(mtr_read_ulint(descr + XDES_STATE, MLOG_4BYTES, mtr));
596
581
}
597
582
 
598
583
/**************************************************************************
607
592
        ulint   i;
608
593
 
609
594
        ut_ad(descr && mtr);
610
 
        ut_ad(mtr_memo_contains_page(mtr, descr, MTR_MEMO_PAGE_X_FIX));
 
595
        ut_ad(mtr_memo_contains(mtr, buf_block_align(descr),
 
596
                                MTR_MEMO_PAGE_X_FIX));
611
597
        ut_ad((XDES_SIZE - XDES_BITMAP) % 4 == 0);
612
598
 
613
599
        for (i = XDES_BITMAP; i < XDES_SIZE; i += 4) {
624
610
xdes_calc_descriptor_page(
625
611
/*======================*/
626
612
                                /* out: descriptor page offset */
627
 
        ulint   zip_size,       /* in: compressed page size in bytes;
628
 
                                0 for uncompressed pages */
629
613
        ulint   offset)         /* in: page offset */
630
614
{
631
615
#if UNIV_PAGE_SIZE <= XDES_ARR_OFFSET \
632
 
                + (UNIV_PAGE_SIZE / FSP_EXTENT_SIZE) * XDES_SIZE
633
 
# error
634
 
#endif
635
 
#if PAGE_ZIP_MIN_SIZE <= XDES_ARR_OFFSET \
636
 
                + (PAGE_ZIP_MIN_SIZE / FSP_EXTENT_SIZE) * XDES_SIZE
637
 
# error
638
 
#endif
639
 
        ut_ad(ut_is_2pow(zip_size));
 
616
                + (XDES_DESCRIBED_PER_PAGE / FSP_EXTENT_SIZE) * XDES_SIZE
 
617
# error
 
618
#endif
640
619
 
641
 
        if (!zip_size) {
642
 
                return(ut_2pow_round(offset, UNIV_PAGE_SIZE));
643
 
        } else {
644
 
                ut_ad(zip_size > XDES_ARR_OFFSET
645
 
                      + (zip_size / FSP_EXTENT_SIZE) * XDES_SIZE);
646
 
                return(ut_2pow_round(offset, zip_size));
647
 
        }
 
620
        return(ut_2pow_round(offset, XDES_DESCRIBED_PER_PAGE));
648
621
}
649
622
 
650
623
/************************************************************************
654
627
xdes_calc_descriptor_index(
655
628
/*=======================*/
656
629
                                /* out: descriptor index */
657
 
        ulint   zip_size,       /* in: compressed page size in bytes;
658
 
                                0 for uncompressed pages */
659
630
        ulint   offset)         /* in: page offset */
660
631
{
661
 
        ut_ad(ut_is_2pow(zip_size));
662
 
 
663
 
        if (!zip_size) {
664
 
                return(ut_2pow_remainder(offset, UNIV_PAGE_SIZE)
665
 
                       / FSP_EXTENT_SIZE);
666
 
        } else {
667
 
                return(ut_2pow_remainder(offset, zip_size) / FSP_EXTENT_SIZE);
668
 
        }
 
632
        return(ut_2pow_remainder(offset, XDES_DESCRIBED_PER_PAGE)
 
633
               / FSP_EXTENT_SIZE);
669
634
}
670
635
 
671
636
/************************************************************************
691
656
{
692
657
        ulint   limit;
693
658
        ulint   size;
694
 
        ulint   zip_size;
695
659
        ulint   descr_page_no;
696
660
        page_t* descr_page;
697
661
 
698
662
        ut_ad(mtr);
699
 
        ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL),
 
663
        ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space),
700
664
                                MTR_MEMO_X_LOCK));
701
 
        ut_ad(mtr_memo_contains_page(mtr, sp_header, MTR_MEMO_PAGE_S_FIX)
702
 
              || mtr_memo_contains_page(mtr, sp_header, MTR_MEMO_PAGE_X_FIX));
703
665
        /* Read free limit and space size */
704
 
        limit = mach_read_from_4(sp_header + FSP_FREE_LIMIT);
705
 
        size  = mach_read_from_4(sp_header + FSP_SIZE);
706
 
        zip_size = dict_table_flags_to_zip_size(
707
 
                mach_read_from_4(sp_header + FSP_SPACE_FLAGS));
 
666
        limit = mtr_read_ulint(sp_header + FSP_FREE_LIMIT, MLOG_4BYTES, mtr);
 
667
        size  = mtr_read_ulint(sp_header + FSP_SIZE, MLOG_4BYTES, mtr);
708
668
 
709
669
        /* If offset is >= size or > limit, return NULL */
710
670
 
719
679
                fsp_fill_free_list(FALSE, space, sp_header, mtr);
720
680
        }
721
681
 
722
 
        descr_page_no = xdes_calc_descriptor_page(zip_size, offset);
 
682
        descr_page_no = xdes_calc_descriptor_page(offset);
723
683
 
724
684
        if (descr_page_no == 0) {
725
685
                /* It is on the space header page */
726
686
 
727
 
                descr_page = page_align(sp_header);
 
687
                descr_page = buf_frame_align(sp_header);
728
688
        } else {
729
 
                buf_block_t*    block;
730
 
 
731
 
                block = buf_page_get(space, zip_size, descr_page_no,
732
 
                                     RW_X_LATCH, mtr);
 
689
                descr_page = buf_page_get(space, descr_page_no, RW_X_LATCH,
 
690
                                          mtr);
733
691
#ifdef UNIV_SYNC_DEBUG
734
 
                buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
692
                buf_page_dbg_add_level(descr_page, SYNC_FSP_PAGE);
735
693
#endif /* UNIV_SYNC_DEBUG */
736
 
                descr_page = buf_block_get_frame(block);
737
694
        }
738
695
 
739
696
        return(descr_page + XDES_ARR_OFFSET
740
 
               + XDES_SIZE * xdes_calc_descriptor_index(zip_size, offset));
 
697
               + XDES_SIZE * xdes_calc_descriptor_index(offset));
741
698
}
742
699
 
743
700
/************************************************************************
755
712
                        page does not exist in the space or if offset > free
756
713
                        limit */
757
714
        ulint   space,  /* in: space id */
758
 
        ulint   zip_size,/* in: compressed page size in bytes
759
 
                        or 0 for uncompressed pages */
760
715
        ulint   offset, /* in: page offset; if equal to the free limit,
761
716
                        we try to add new extents to the space free list */
762
717
        mtr_t*  mtr)    /* in: mtr handle */
763
718
{
764
 
        buf_block_t*    block;
765
719
        fsp_header_t*   sp_header;
766
720
 
767
 
        block = buf_page_get(space, zip_size, 0, RW_X_LATCH, mtr);
 
721
        sp_header = FSP_HEADER_OFFSET
 
722
                + buf_page_get(space, 0, RW_X_LATCH, mtr);
768
723
#ifdef UNIV_SYNC_DEBUG
769
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
724
        buf_page_dbg_add_level(sp_header, SYNC_FSP_PAGE);
770
725
#endif /* UNIV_SYNC_DEBUG */
771
 
        sp_header = FSP_HEADER_OFFSET + buf_block_get_frame(block);
772
726
        return(xdes_get_descriptor_with_space_hdr(sp_header, space, offset,
773
727
                                                  mtr));
774
728
}
783
737
/*====================*/
784
738
                                /* out: pointer to the extent descriptor */
785
739
        ulint           space,  /* in: space id */
786
 
        ulint           zip_size,/* in: compressed page size in bytes
787
 
                                or 0 for uncompressed pages */
788
740
        fil_addr_t      lst_node,/* in: file address of the list node
789
741
                                contained in the descriptor */
790
742
        mtr_t*          mtr)    /* in: mtr handle */
792
744
        xdes_t* descr;
793
745
 
794
746
        ut_ad(mtr);
795
 
        ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL),
 
747
        ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space),
796
748
                                MTR_MEMO_X_LOCK));
797
 
        descr = fut_get_ptr(space, zip_size, lst_node, RW_X_LATCH, mtr)
798
 
                - XDES_FLST_NODE;
 
749
        descr = fut_get_ptr(space, lst_node, RW_X_LATCH, mtr) - XDES_FLST_NODE;
799
750
 
800
751
        return(descr);
801
752
}
802
753
 
803
754
/************************************************************************
 
755
Gets pointer to the next descriptor in a descriptor list and x-locks its
 
756
page. */
 
757
UNIV_INLINE
 
758
xdes_t*
 
759
xdes_lst_get_next(
 
760
/*==============*/
 
761
        xdes_t* descr,  /* in: pointer to a descriptor */
 
762
        mtr_t*  mtr)    /* in: mtr handle */
 
763
{
 
764
        ulint   space;
 
765
 
 
766
        ut_ad(mtr && descr);
 
767
 
 
768
        space = buf_frame_get_space_id(descr);
 
769
 
 
770
        return(xdes_lst_get_descriptor(
 
771
                       space,
 
772
                       flst_get_next_addr(descr + XDES_FLST_NODE, mtr), mtr));
 
773
}
 
774
 
 
775
/************************************************************************
804
776
Returns page offset of the first page in extent described by a descriptor. */
805
777
UNIV_INLINE
806
778
ulint
811
783
{
812
784
        ut_ad(descr);
813
785
 
814
 
        return(page_get_page_no(page_align(descr))
815
 
               + ((page_offset(descr) - XDES_ARR_OFFSET) / XDES_SIZE)
 
786
        return(buf_frame_get_page_no(descr)
 
787
               + ((descr - buf_frame_align(descr) - XDES_ARR_OFFSET)
 
788
                  / XDES_SIZE)
816
789
               * FSP_EXTENT_SIZE);
817
790
}
818
791
 
822
795
void
823
796
fsp_init_file_page_low(
824
797
/*===================*/
825
 
        buf_block_t*    block)  /* in: pointer to a page */
 
798
        byte*   ptr)    /* in: pointer to a page */
826
799
{
827
 
        page_t*         page    = buf_block_get_frame(block);
828
 
        page_zip_des_t* page_zip= buf_block_get_page_zip(block);
829
 
 
830
 
        block->check_index_page_at_flush = FALSE;
831
 
 
832
 
        if (UNIV_LIKELY_NULL(page_zip)) {
833
 
                memset(page, 0, UNIV_PAGE_SIZE);
834
 
                memset(page_zip->data, 0, page_zip_get_size(page_zip));
835
 
                mach_write_to_4(page + FIL_PAGE_OFFSET,
836
 
                                buf_block_get_page_no(block));
837
 
                mach_write_to_4(page
838
 
                                + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
839
 
                                buf_block_get_space(block));
840
 
                memcpy(page_zip->data + FIL_PAGE_OFFSET,
841
 
                       page + FIL_PAGE_OFFSET, 4);
842
 
                memcpy(page_zip->data + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
843
 
                       page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 4);
844
 
                return;
845
 
        }
 
800
        page_t* page;
 
801
        page = buf_frame_align(ptr);
 
802
 
 
803
        buf_block_align(page)->check_index_page_at_flush = FALSE;
846
804
 
847
805
#ifdef UNIV_BASIC_LOG_DEBUG
848
806
        memset(page, 0xff, UNIV_PAGE_SIZE);
849
807
#endif
850
 
        mach_write_to_4(page + FIL_PAGE_OFFSET, buf_block_get_page_no(block));
851
 
        memset(page + FIL_PAGE_LSN, 0, 8);
852
 
        mach_write_to_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID,
853
 
                        buf_block_get_space(block));
854
 
        memset(page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM, 0, 8);
 
808
        mach_write_to_8(page + UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM,
 
809
                        ut_dulint_zero);
 
810
        mach_write_to_8(page + FIL_PAGE_LSN, ut_dulint_zero);
855
811
}
856
812
 
857
813
/***************************************************************
860
816
void
861
817
fsp_init_file_page(
862
818
/*===============*/
863
 
        buf_block_t*    block,  /* in: pointer to a page */
864
 
        mtr_t*          mtr)    /* in: mtr */
 
819
        page_t* page,   /* in: page */
 
820
        mtr_t*  mtr)    /* in: mtr */
865
821
{
866
 
        fsp_init_file_page_low(block);
 
822
        fsp_init_file_page_low(page);
867
823
 
868
 
        mlog_write_initial_log_record(buf_block_get_frame(block),
869
 
                                      MLOG_INIT_FILE_PAGE, mtr);
 
824
        mlog_write_initial_log_record(page, MLOG_INIT_FILE_PAGE, mtr);
870
825
}
871
826
 
872
827
/***************************************************************
873
828
Parses a redo log record of a file page init. */
874
 
UNIV_INTERN
 
829
 
875
830
byte*
876
831
fsp_parse_init_file_page(
877
832
/*=====================*/
878
 
                                /* out: end of log record or NULL */
879
 
        byte*           ptr,    /* in: buffer */
880
 
        byte*           end_ptr __attribute__((unused)), /* in: buffer end */
881
 
        buf_block_t*    block)  /* in: block or NULL */
 
833
                        /* out: end of log record or NULL */
 
834
        byte*   ptr,    /* in: buffer */
 
835
        byte*   end_ptr __attribute__((unused)), /* in: buffer end */
 
836
        page_t* page)   /* in: page or NULL */
882
837
{
883
838
        ut_ad(ptr && end_ptr);
884
839
 
885
 
        if (block) {
886
 
                fsp_init_file_page_low(block);
 
840
        if (page) {
 
841
                fsp_init_file_page_low(page);
887
842
        }
888
843
 
889
844
        return(ptr);
891
846
 
892
847
/**************************************************************************
893
848
Initializes the fsp system. */
894
 
UNIV_INTERN
 
849
 
895
850
void
896
851
fsp_init(void)
897
852
/*==========*/
900
855
}
901
856
 
902
857
/**************************************************************************
903
 
Writes the space id and compressed page size to a tablespace header.
904
 
This function is used past the buffer pool when we in fil0fil.c create
905
 
a new single-table tablespace. */
906
 
UNIV_INTERN
 
858
Writes the space id to a tablespace header. This function is used past the
 
859
buffer pool when we in fil0fil.c create a new single-table tablespace. */
 
860
 
907
861
void
908
 
fsp_header_init_fields(
909
 
/*===================*/
910
 
        page_t* page,           /* in/out: first page in the space */
911
 
        ulint   space_id,       /* in: space id */
912
 
        ulint   flags)          /* in: tablespace flags (FSP_SPACE_FLAGS):
913
 
                                0, or table->flags if newer than COMPACT */
 
862
fsp_header_write_space_id(
 
863
/*======================*/
 
864
        page_t* page,           /* in: first page in the space */
 
865
        ulint   space_id)       /* in: space id */
914
866
{
915
 
        /* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
916
 
        ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
917
 
        ROW_FORMAT=REDUNDANT (table->flags == 0).  For any other
918
 
        format, the tablespace flags should equal table->flags. */
919
 
        ut_a(flags != DICT_TF_COMPACT);
920
 
 
921
 
        mach_write_to_4(FSP_HEADER_OFFSET + FSP_SPACE_ID + page,
922
 
                        space_id);
923
 
        mach_write_to_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page,
924
 
                        flags);
 
867
        mach_write_to_4(page + FSP_HEADER_OFFSET + FSP_SPACE_ID, space_id);
925
868
}
926
869
 
927
870
/**************************************************************************
928
871
Initializes the space header of a new created space and creates also the
929
872
insert buffer tree root if space == 0. */
930
 
UNIV_INTERN
 
873
 
931
874
void
932
875
fsp_header_init(
933
876
/*============*/
934
 
        ulint   space,          /* in: space id */
935
 
        ulint   size,           /* in: current size in blocks */
936
 
        mtr_t*  mtr)            /* in: mini-transaction handle */
 
877
        ulint   space,  /* in: space id */
 
878
        ulint   size,   /* in: current size in blocks */
 
879
        mtr_t*  mtr)    /* in: mini-transaction handle */
937
880
{
938
881
        fsp_header_t*   header;
939
 
        buf_block_t*    block;
940
882
        page_t*         page;
941
 
        ulint           flags;
942
 
        ulint           zip_size;
943
883
 
944
884
        ut_ad(mtr);
945
885
 
946
 
        mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
 
886
        mtr_x_lock(fil_space_get_latch(space), mtr);
947
887
 
948
 
        zip_size = dict_table_flags_to_zip_size(flags);
949
 
        block = buf_page_create(space, 0, zip_size, mtr);
950
 
        buf_page_get(space, zip_size, 0, RW_X_LATCH, mtr);
 
888
        page = buf_page_create(space, 0, mtr);
 
889
        buf_page_get(space, 0, RW_X_LATCH, mtr);
951
890
#ifdef UNIV_SYNC_DEBUG
952
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
891
        buf_page_dbg_add_level(page, SYNC_FSP_PAGE);
953
892
#endif /* UNIV_SYNC_DEBUG */
954
893
 
955
894
        /* The prior contents of the file page should be ignored */
956
895
 
957
 
        fsp_init_file_page(block, mtr);
958
 
        page = buf_block_get_frame(block);
 
896
        fsp_init_file_page(page, mtr);
959
897
 
960
898
        mlog_write_ulint(page + FIL_PAGE_TYPE, FIL_PAGE_TYPE_FSP_HDR,
961
899
                         MLOG_2BYTES, mtr);
967
905
 
968
906
        mlog_write_ulint(header + FSP_SIZE, size, MLOG_4BYTES, mtr);
969
907
        mlog_write_ulint(header + FSP_FREE_LIMIT, 0, MLOG_4BYTES, mtr);
970
 
        mlog_write_ulint(header + FSP_SPACE_FLAGS, flags,
971
 
                         MLOG_4BYTES, mtr);
 
908
        mlog_write_ulint(header + FSP_LOWEST_NO_WRITE, 0, MLOG_4BYTES, mtr);
972
909
        mlog_write_ulint(header + FSP_FRAG_N_USED, 0, MLOG_4BYTES, mtr);
973
910
 
974
911
        flst_init(header + FSP_FREE, mtr);
980
917
        mlog_write_dulint(header + FSP_SEG_ID, ut_dulint_create(0, 1), mtr);
981
918
        if (space == 0) {
982
919
                fsp_fill_free_list(FALSE, space, header, mtr);
983
 
                btr_create(DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF,
984
 
                           0, 0, ut_dulint_add(DICT_IBUF_ID_MIN, space),
985
 
                           srv_sys->dummy_ind1, mtr);
 
920
                btr_create(DICT_CLUSTERED | DICT_UNIVERSAL | DICT_IBUF, space,
 
921
                           ut_dulint_add(DICT_IBUF_ID_MIN, space), FALSE, mtr);
986
922
        } else {
987
923
                fsp_fill_free_list(TRUE, space, header, mtr);
988
924
        }
990
926
 
991
927
/**************************************************************************
992
928
Reads the space id from the first page of a tablespace. */
993
 
UNIV_INTERN
 
929
 
994
930
ulint
995
931
fsp_header_get_space_id(
996
932
/*====================*/
997
 
                                /* out: space id, ULINT UNDEFINED if error */
998
 
        const page_t*   page)   /* in: first page of a tablespace */
 
933
                        /* out: space id, ULINT UNDEFINED if error */
 
934
        page_t* page)   /* in: first page of a tablespace */
999
935
{
1000
936
        ulint   fsp_id;
1001
937
        ulint   id;
1017
953
}
1018
954
 
1019
955
/**************************************************************************
1020
 
Reads the space flags from the first page of a tablespace. */
1021
 
UNIV_INTERN
1022
 
ulint
1023
 
fsp_header_get_flags(
1024
 
/*=================*/
1025
 
                                /* out: flags */
1026
 
        const page_t*   page)   /* in: first page of a tablespace */
1027
 
{
1028
 
        ut_ad(!page_offset(page));
1029
 
 
1030
 
        return(mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page));
1031
 
}
1032
 
 
1033
 
/**************************************************************************
1034
 
Reads the compressed page size from the first page of a tablespace. */
1035
 
UNIV_INTERN
1036
 
ulint
1037
 
fsp_header_get_zip_size(
1038
 
/*====================*/
1039
 
                                /* out: compressed page size in bytes,
1040
 
                                or 0 if uncompressed */
1041
 
        const page_t*   page)   /* in: first page of a tablespace */
1042
 
{
1043
 
        ulint   flags = fsp_header_get_flags(page);
1044
 
 
1045
 
        return(dict_table_flags_to_zip_size(flags));
1046
 
}
1047
 
 
1048
 
/**************************************************************************
1049
956
Increases the space size field of a space. */
1050
 
UNIV_INTERN
 
957
 
1051
958
void
1052
959
fsp_header_inc_size(
1053
960
/*================*/
1057
964
{
1058
965
        fsp_header_t*   header;
1059
966
        ulint           size;
1060
 
        ulint           flags;
1061
967
 
1062
968
        ut_ad(mtr);
1063
969
 
1064
 
        mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
 
970
        mtr_x_lock(fil_space_get_latch(space), mtr);
1065
971
 
1066
 
        header = fsp_get_space_header(space,
1067
 
                                      dict_table_flags_to_zip_size(flags),
1068
 
                                      mtr);
 
972
        header = fsp_get_space_header(space, mtr);
1069
973
 
1070
974
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, mtr);
1071
975
 
1074
978
}
1075
979
 
1076
980
/**************************************************************************
1077
 
Gets the current free limit of the system tablespace.  The free limit
1078
 
means the place of the first page which has never been put to the the
1079
 
free list for allocation.  The space above that address is initialized
1080
 
to zero.  Sets also the global variable log_fsp_current_free_limit. */
1081
 
UNIV_INTERN
 
981
Gets the current free limit of a tablespace. The free limit means the
 
982
place of the first page which has never been put to the the free list
 
983
for allocation. The space above that address is initialized to zero.
 
984
Sets also the global variable log_fsp_current_free_limit. */
 
985
 
1082
986
ulint
1083
 
fsp_header_get_free_limit(void)
1084
 
/*===========================*/
 
987
fsp_header_get_free_limit(
 
988
/*======================*/
1085
989
                        /* out: free limit in megabytes */
 
990
        ulint   space)  /* in: space id, must be 0 */
1086
991
{
1087
992
        fsp_header_t*   header;
1088
993
        ulint           limit;
1089
994
        mtr_t           mtr;
1090
995
 
 
996
        ut_a(space == 0); /* We have only one log_fsp_current_... variable */
 
997
 
1091
998
        mtr_start(&mtr);
1092
999
 
1093
 
        mtr_x_lock(fil_space_get_latch(0, NULL), &mtr);
 
1000
        mtr_x_lock(fil_space_get_latch(space), &mtr);
1094
1001
 
1095
 
        header = fsp_get_space_header(0, 0, &mtr);
 
1002
        header = fsp_get_space_header(space, &mtr);
1096
1003
 
1097
1004
        limit = mtr_read_ulint(header + FSP_FREE_LIMIT, MLOG_4BYTES, &mtr);
1098
1005
 
1099
 
        limit /= ((1024 * 1024) / UNIV_PAGE_SIZE);
 
1006
        limit = limit / ((1024 * 1024) / UNIV_PAGE_SIZE);
1100
1007
 
1101
1008
        log_fsp_current_free_limit_set_and_checkpoint(limit);
1102
1009
 
1106
1013
}
1107
1014
 
1108
1015
/**************************************************************************
1109
 
Gets the size of the system tablespace from the tablespace header.  If
1110
 
we do not have an auto-extending data file, this should be equal to
1111
 
the size of the data files.  If there is an auto-extending data file,
1112
 
this can be smaller. */
1113
 
UNIV_INTERN
 
1016
Gets the size of the tablespace from the tablespace header. If we do not
 
1017
have an auto-extending data file, this should be equal to the size of the
 
1018
data files. If there is an auto-extending data file, this can be smaller. */
 
1019
 
1114
1020
ulint
1115
 
fsp_header_get_tablespace_size(void)
1116
 
/*================================*/
 
1021
fsp_header_get_tablespace_size(
 
1022
/*===========================*/
1117
1023
                        /* out: size in pages */
 
1024
        ulint   space)  /* in: space id, must be 0 */
1118
1025
{
1119
1026
        fsp_header_t*   header;
1120
1027
        ulint           size;
1121
1028
        mtr_t           mtr;
1122
1029
 
 
1030
        ut_a(space == 0); /* We have only one log_fsp_current_... variable */
 
1031
 
1123
1032
        mtr_start(&mtr);
1124
1033
 
1125
 
        mtr_x_lock(fil_space_get_latch(0, NULL), &mtr);
 
1034
        mtr_x_lock(fil_space_get_latch(space), &mtr);
1126
1035
 
1127
 
        header = fsp_get_space_header(0, 0, &mtr);
 
1036
        header = fsp_get_space_header(space, &mtr);
1128
1037
 
1129
1038
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, &mtr);
1130
1039
 
1183
1092
        mtr_t*          mtr)            /* in: mtr */
1184
1093
{
1185
1094
        ulint   size;
1186
 
        ulint   zip_size;
1187
1095
        ulint   new_size;
1188
1096
        ulint   old_size;
1189
1097
        ulint   size_increase;
1198
1106
        }
1199
1107
 
1200
1108
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, mtr);
1201
 
        zip_size = dict_table_flags_to_zip_size(
1202
 
                mach_read_from_4(header + FSP_SPACE_FLAGS));
1203
1109
 
1204
1110
        old_size = size;
1205
1111
 
1206
 
        if (space == 0) {
1207
 
                if (!srv_last_file_size_max) {
 
1112
        if (space == 0 && srv_last_file_size_max != 0) {
 
1113
                if (srv_last_file_size_max
 
1114
                    < srv_data_file_sizes[srv_n_data_files - 1]) {
 
1115
 
 
1116
                        fprintf(stderr,
 
1117
                                "InnoDB: Error: Last data file size is %lu,"
 
1118
                                " max size allowed %lu\n",
 
1119
                                (ulong) srv_data_file_sizes[
 
1120
                                        srv_n_data_files - 1],
 
1121
                                (ulong) srv_last_file_size_max);
 
1122
                }
 
1123
 
 
1124
                size_increase = srv_last_file_size_max
 
1125
                        - srv_data_file_sizes[srv_n_data_files - 1];
 
1126
                if (size_increase > SRV_AUTO_EXTEND_INCREMENT) {
1208
1127
                        size_increase = SRV_AUTO_EXTEND_INCREMENT;
1209
 
                } else {
1210
 
                        if (srv_last_file_size_max
1211
 
                            < srv_data_file_sizes[srv_n_data_files - 1]) {
1212
 
 
1213
 
                                fprintf(stderr,
1214
 
                                        "InnoDB: Error: Last data file size"
1215
 
                                        " is %lu, max size allowed %lu\n",
1216
 
                                        (ulong) srv_data_file_sizes[
1217
 
                                                srv_n_data_files - 1],
1218
 
                                        (ulong) srv_last_file_size_max);
1219
 
                        }
1220
 
 
1221
 
                        size_increase = srv_last_file_size_max
1222
 
                                - srv_data_file_sizes[srv_n_data_files - 1];
1223
 
                        if (size_increase > SRV_AUTO_EXTEND_INCREMENT) {
1224
 
                                size_increase = SRV_AUTO_EXTEND_INCREMENT;
1225
 
                        }
1226
1128
                }
1227
1129
        } else {
1228
 
                /* We extend single-table tablespaces first one extent
1229
 
                at a time, but for bigger tablespaces more. It is not
1230
 
                enough to extend always by one extent, because some
1231
 
                extents are frag page extents. */
1232
 
                ulint   extent_size;    /* one megabyte, in pages */
1233
 
 
1234
 
                if (!zip_size) {
1235
 
                        extent_size = FSP_EXTENT_SIZE;
1236
 
                } else {
1237
 
                        extent_size = FSP_EXTENT_SIZE
1238
 
                                * UNIV_PAGE_SIZE / zip_size;
1239
 
                }
1240
 
 
1241
 
                if (size < extent_size) {
1242
 
                        /* Let us first extend the file to extent_size */
1243
 
                        success = fsp_try_extend_data_file_with_pages(
1244
 
                                space, extent_size - 1, header, mtr);
1245
 
                        if (!success) {
1246
 
                                new_size = mtr_read_ulint(header + FSP_SIZE,
1247
 
                                                          MLOG_4BYTES, mtr);
1248
 
 
1249
 
                                *actual_increase = new_size - old_size;
1250
 
 
1251
 
                                return(FALSE);
1252
 
                        }
1253
 
 
1254
 
                        size = extent_size;
1255
 
                }
1256
 
 
1257
 
                if (size < 32 * extent_size) {
1258
 
                        size_increase = extent_size;
1259
 
                } else {
1260
 
                        /* Below in fsp_fill_free_list() we assume
1261
 
                        that we add at most FSP_FREE_ADD extents at
1262
 
                        a time */
1263
 
                        size_increase = FSP_FREE_ADD * extent_size;
 
1130
                if (space == 0) {
 
1131
                        size_increase = SRV_AUTO_EXTEND_INCREMENT;
 
1132
                } else {
 
1133
                        /* We extend single-table tablespaces first one extent
 
1134
                        at a time, but for bigger tablespaces more. It is not
 
1135
                        enough to extend always by one extent, because some
 
1136
                        extents are frag page extents. */
 
1137
 
 
1138
                        if (size < FSP_EXTENT_SIZE) {
 
1139
                                /* Let us first extend the file to 64 pages */
 
1140
                                success = fsp_try_extend_data_file_with_pages(
 
1141
                                        space, FSP_EXTENT_SIZE - 1,
 
1142
                                        header, mtr);
 
1143
                                if (!success) {
 
1144
                                        new_size = mtr_read_ulint(
 
1145
                                                header + FSP_SIZE,
 
1146
                                                MLOG_4BYTES, mtr);
 
1147
 
 
1148
                                        *actual_increase = new_size - old_size;
 
1149
 
 
1150
                                        return(FALSE);
 
1151
                                }
 
1152
 
 
1153
                                size = FSP_EXTENT_SIZE;
 
1154
                        }
 
1155
 
 
1156
                        if (size < 32 * FSP_EXTENT_SIZE) {
 
1157
                                size_increase = FSP_EXTENT_SIZE;
 
1158
                        } else {
 
1159
                                /* Below in fsp_fill_free_list() we assume
 
1160
                                that we add at most FSP_FREE_ADD extents at
 
1161
                                a time */
 
1162
                                size_increase = FSP_FREE_ADD * FSP_EXTENT_SIZE;
 
1163
                        }
1264
1164
                }
1265
1165
        }
1266
1166
 
1274
1174
        /* We ignore any fragments of a full megabyte when storing the size
1275
1175
        to the space header */
1276
1176
 
1277
 
        if (!zip_size) {
1278
 
                new_size = ut_calc_align_down(actual_size,
1279
 
                                              (1024 * 1024) / UNIV_PAGE_SIZE);
1280
 
        } else {
1281
 
                new_size = ut_calc_align_down(actual_size,
1282
 
                                              (1024 * 1024) / zip_size);
1283
 
        }
1284
 
        mlog_write_ulint(header + FSP_SIZE, new_size, MLOG_4BYTES, mtr);
 
1177
        mlog_write_ulint(header + FSP_SIZE,
 
1178
                         ut_calc_align_down(actual_size,
 
1179
                                            (1024 * 1024) / UNIV_PAGE_SIZE),
 
1180
                         MLOG_4BYTES, mtr);
 
1181
        new_size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, mtr);
1285
1182
 
1286
1183
        *actual_increase = new_size - old_size;
1287
1184
 
1307
1204
{
1308
1205
        ulint   limit;
1309
1206
        ulint   size;
1310
 
        ulint   zip_size;
1311
1207
        xdes_t* descr;
1312
1208
        ulint   count           = 0;
1313
1209
        ulint   frag_n_used;
 
1210
        page_t* descr_page;
 
1211
        page_t* ibuf_page;
1314
1212
        ulint   actual_increase;
1315
1213
        ulint   i;
1316
1214
        mtr_t   ibuf_mtr;
1321
1219
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, mtr);
1322
1220
        limit = mtr_read_ulint(header + FSP_FREE_LIMIT, MLOG_4BYTES, mtr);
1323
1221
 
1324
 
        zip_size = dict_table_flags_to_zip_size(
1325
 
                mach_read_from_4(FSP_SPACE_FLAGS + header));
1326
 
        ut_a(ut_is_2pow(zip_size));
1327
 
        ut_a(zip_size <= UNIV_PAGE_SIZE);
1328
 
        ut_a(!zip_size || zip_size >= PAGE_ZIP_MIN_SIZE);
1329
 
 
1330
1222
        if (space == 0 && srv_auto_extend_last_data_file
1331
1223
            && size < limit + FSP_EXTENT_SIZE * FSP_FREE_ADD) {
1332
1224
 
1348
1240
        while ((init_space && i < 1)
1349
1241
               || ((i + FSP_EXTENT_SIZE <= size) && (count < FSP_FREE_ADD))) {
1350
1242
 
1351
 
                ibool   init_xdes;
1352
 
                if (zip_size) {
1353
 
                        init_xdes = ut_2pow_remainder(i, zip_size) == 0;
1354
 
                } else {
1355
 
                        init_xdes = ut_2pow_remainder(i, UNIV_PAGE_SIZE) == 0;
1356
 
                }
1357
 
 
1358
1243
                mlog_write_ulint(header + FSP_FREE_LIMIT, i + FSP_EXTENT_SIZE,
1359
1244
                                 MLOG_4BYTES, mtr);
1360
1245
 
1361
1246
                /* Update the free limit info in the log system and make
1362
1247
                a checkpoint */
1363
1248
                if (space == 0) {
1364
 
                        ut_a(!zip_size);
1365
1249
                        log_fsp_current_free_limit_set_and_checkpoint(
1366
1250
                                (i + FSP_EXTENT_SIZE)
1367
1251
                                / ((1024 * 1024) / UNIV_PAGE_SIZE));
1368
1252
                }
1369
1253
 
1370
 
                if (UNIV_UNLIKELY(init_xdes)) {
1371
 
 
1372
 
                        buf_block_t*    block;
 
1254
                if (0 == i % XDES_DESCRIBED_PER_PAGE) {
1373
1255
 
1374
1256
                        /* We are going to initialize a new descriptor page
1375
1257
                        and a new ibuf bitmap page: the prior contents of the
1376
1258
                        pages should be ignored. */
1377
1259
 
1378
1260
                        if (i > 0) {
1379
 
                                block = buf_page_create(
1380
 
                                        space, i, zip_size, mtr);
1381
 
                                buf_page_get(space, zip_size, i,
1382
 
                                             RW_X_LATCH, mtr);
 
1261
                                descr_page = buf_page_create(space, i, mtr);
 
1262
                                buf_page_get(space, i, RW_X_LATCH, mtr);
1383
1263
#ifdef UNIV_SYNC_DEBUG
1384
 
                                buf_block_dbg_add_level(block,
1385
 
                                                        SYNC_FSP_PAGE);
 
1264
                                buf_page_dbg_add_level(descr_page,
 
1265
                                                       SYNC_FSP_PAGE);
1386
1266
#endif /* UNIV_SYNC_DEBUG */
1387
 
                                fsp_init_file_page(block, mtr);
1388
 
                                mlog_write_ulint(buf_block_get_frame(block)
1389
 
                                                 + FIL_PAGE_TYPE,
 
1267
                                fsp_init_file_page(descr_page, mtr);
 
1268
                                mlog_write_ulint(descr_page + FIL_PAGE_TYPE,
1390
1269
                                                 FIL_PAGE_TYPE_XDES,
1391
1270
                                                 MLOG_2BYTES, mtr);
1392
1271
                        }
1398
1277
 
1399
1278
                        mtr_start(&ibuf_mtr);
1400
1279
 
1401
 
                        block = buf_page_create(space,
 
1280
                        ibuf_page = buf_page_create(space,
1402
1281
                                                    i + FSP_IBUF_BITMAP_OFFSET,
1403
 
                                                    zip_size, &ibuf_mtr);
1404
 
                        buf_page_get(space, zip_size,
1405
 
                                     i + FSP_IBUF_BITMAP_OFFSET,
 
1282
                                                    &ibuf_mtr);
 
1283
                        buf_page_get(space, i + FSP_IBUF_BITMAP_OFFSET,
1406
1284
                                     RW_X_LATCH, &ibuf_mtr);
1407
1285
#ifdef UNIV_SYNC_DEBUG
1408
 
                        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
1286
                        buf_page_dbg_add_level(ibuf_page, SYNC_FSP_PAGE);
1409
1287
#endif /* UNIV_SYNC_DEBUG */
1410
 
                        fsp_init_file_page(block, &ibuf_mtr);
 
1288
                        fsp_init_file_page(ibuf_page, &ibuf_mtr);
1411
1289
 
1412
 
                        ibuf_bitmap_page_init(block, &ibuf_mtr);
 
1290
                        ibuf_bitmap_page_init(ibuf_page, &ibuf_mtr);
1413
1291
 
1414
1292
                        mtr_commit(&ibuf_mtr);
1415
1293
                }
1418
1296
                                                           mtr);
1419
1297
                xdes_init(descr, mtr);
1420
1298
 
1421
 
#if UNIV_PAGE_SIZE % FSP_EXTENT_SIZE
1422
 
# error "UNIV_PAGE_SIZE % FSP_EXTENT_SIZE != 0"
1423
 
#endif
1424
 
#if PAGE_ZIP_MIN_SIZE % FSP_EXTENT_SIZE
1425
 
# error "PAGE_ZIP_MIN_SIZE % FSP_EXTENT_SIZE != 0"
 
1299
#if XDES_DESCRIBED_PER_PAGE % FSP_EXTENT_SIZE
 
1300
# error "XDES_DESCRIBED_PER_PAGE % FSP_EXTENT_SIZE != 0"
1426
1301
#endif
1427
1302
 
1428
 
                if (UNIV_UNLIKELY(init_xdes)) {
 
1303
                if (0 == i % XDES_DESCRIBED_PER_PAGE) {
1429
1304
 
1430
1305
                        /* The first page in the extent is a descriptor page
1431
1306
                        and the second is an ibuf bitmap page: mark them
1461
1336
                        /* out: extent descriptor, NULL if cannot be
1462
1337
                        allocated */
1463
1338
        ulint   space,  /* in: space id */
1464
 
        ulint   zip_size,/* in: compressed page size in bytes
1465
 
                        or 0 for uncompressed pages */
1466
1339
        ulint   hint,   /* in: hint of which extent would be desirable: any
1467
1340
                        page offset in the extent goes; the hint must not
1468
1341
                        be > FSP_FREE_LIMIT */
1474
1347
 
1475
1348
        ut_ad(mtr);
1476
1349
 
1477
 
        header = fsp_get_space_header(space, zip_size, mtr);
 
1350
        header = fsp_get_space_header(space, mtr);
1478
1351
 
1479
1352
        descr = xdes_get_descriptor_with_space_hdr(header, space, hint, mtr);
1480
1353
 
1495
1368
                        return(NULL);   /* No free extents left */
1496
1369
                }
1497
1370
 
1498
 
                descr = xdes_lst_get_descriptor(space, zip_size, first, mtr);
 
1371
                descr = xdes_lst_get_descriptor(space, first, mtr);
1499
1372
        }
1500
1373
 
1501
1374
        flst_remove(header + FSP_FREE, descr + XDES_FLST_NODE, mtr);
1512
1385
                        /* out: the page offset, FIL_NULL if no page could
1513
1386
                        be allocated */
1514
1387
        ulint   space,  /* in: space id */
1515
 
        ulint   zip_size,/* in: compressed page size in bytes
1516
 
                        or 0 for uncompressed pages */
1517
1388
        ulint   hint,   /* in: hint of which page would be desirable */
1518
1389
        mtr_t*  mtr)    /* in: mtr handle */
1519
1390
{
1520
1391
        fsp_header_t*   header;
1521
1392
        fil_addr_t      first;
1522
1393
        xdes_t*         descr;
1523
 
        buf_block_t*    block;
 
1394
        page_t*         page;
1524
1395
        ulint           free;
1525
1396
        ulint           frag_n_used;
1526
1397
        ulint           page_no;
1529
1400
 
1530
1401
        ut_ad(mtr);
1531
1402
 
1532
 
        header = fsp_get_space_header(space, zip_size, mtr);
 
1403
        header = fsp_get_space_header(space, mtr);
1533
1404
 
1534
1405
        /* Get the hinted descriptor */
1535
1406
        descr = xdes_get_descriptor_with_space_hdr(header, space, hint, mtr);
1548
1419
                        FREE_FRAG list. But we will allocate our page from the
1549
1420
                        the free extent anyway. */
1550
1421
 
1551
 
                        descr = fsp_alloc_free_extent(space, zip_size,
1552
 
                                                      hint, mtr);
 
1422
                        descr = fsp_alloc_free_extent(space, hint, mtr);
1553
1423
 
1554
1424
                        if (descr == NULL) {
1555
1425
                                /* No free space left */
1561
1431
                        flst_add_last(header + FSP_FREE_FRAG,
1562
1432
                                      descr + XDES_FLST_NODE, mtr);
1563
1433
                } else {
1564
 
                        descr = xdes_lst_get_descriptor(space, zip_size,
1565
 
                                                        first, mtr);
 
1434
                        descr = xdes_lst_get_descriptor(space, first, mtr);
1566
1435
                }
1567
1436
 
1568
1437
                /* Reset the hint */
1633
1502
        be obtained immediately with buf_page_get without need for a disk
1634
1503
        read. */
1635
1504
 
1636
 
        buf_page_create(space, page_no, zip_size, mtr);
 
1505
        buf_page_create(space, page_no, mtr);
1637
1506
 
1638
 
        block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
 
1507
        page = buf_page_get(space, page_no, RW_X_LATCH, mtr);
1639
1508
#ifdef UNIV_SYNC_DEBUG
1640
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
1509
        buf_page_dbg_add_level(page, SYNC_FSP_PAGE);
1641
1510
#endif /* UNIV_SYNC_DEBUG */
1642
1511
 
1643
1512
        /* Prior contents of the page should be ignored */
1644
 
        fsp_init_file_page(block, mtr);
 
1513
        fsp_init_file_page(page, mtr);
1645
1514
 
1646
1515
        return(page_no);
1647
1516
}
1653
1522
fsp_free_page(
1654
1523
/*==========*/
1655
1524
        ulint   space,  /* in: space id */
1656
 
        ulint   zip_size,/* in: compressed page size in bytes
1657
 
                        or 0 for uncompressed pages */
1658
1525
        ulint   page,   /* in: page offset */
1659
1526
        mtr_t*  mtr)    /* in: mtr handle */
1660
1527
{
1667
1534
 
1668
1535
        /* fprintf(stderr, "Freeing page %lu in space %lu\n", page, space); */
1669
1536
 
1670
 
        header = fsp_get_space_header(space, zip_size, mtr);
 
1537
        header = fsp_get_space_header(space, mtr);
1671
1538
 
1672
1539
        descr = xdes_get_descriptor_with_space_hdr(header, space, page, mtr);
1673
1540
 
1732
1599
                /* The extent has become free: move it to another list */
1733
1600
                flst_remove(header + FSP_FREE_FRAG, descr + XDES_FLST_NODE,
1734
1601
                            mtr);
1735
 
                fsp_free_extent(space, zip_size, page, mtr);
 
1602
                fsp_free_extent(space, page, mtr);
1736
1603
        }
1737
1604
}
1738
1605
 
1743
1610
fsp_free_extent(
1744
1611
/*============*/
1745
1612
        ulint   space,  /* in: space id */
1746
 
        ulint   zip_size,/* in: compressed page size in bytes
1747
 
                        or 0 for uncompressed pages */
1748
1613
        ulint   page,   /* in: page offset in the extent */
1749
1614
        mtr_t*  mtr)    /* in: mtr */
1750
1615
{
1753
1618
 
1754
1619
        ut_ad(mtr);
1755
1620
 
1756
 
        header = fsp_get_space_header(space, zip_size, mtr);
 
1621
        header = fsp_get_space_header(space, mtr);
1757
1622
 
1758
1623
        descr = xdes_get_descriptor_with_space_hdr(header, space, page, mtr);
1759
1624
 
1778
1643
                        /* out: segment inode */
1779
1644
        page_t* page,   /* in: segment inode page */
1780
1645
        ulint   i,      /* in: inode index on page */
1781
 
        ulint   zip_size __attribute__((unused)),
1782
 
                        /* in: compressed page size, or 0 */
1783
 
        mtr_t*  mtr __attribute__((unused)))
1784
 
                        /* in: mini-transaction handle */
 
1646
        mtr_t*  mtr __attribute__((unused))) /* in: mini-transaction handle */
1785
1647
{
1786
 
        ut_ad(i < FSP_SEG_INODES_PER_PAGE(zip_size));
1787
 
        ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX));
 
1648
        ut_ad(i < FSP_SEG_INODES_PER_PAGE);
 
1649
        ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
 
1650
                                MTR_MEMO_PAGE_X_FIX));
1788
1651
 
1789
1652
        return(page + FSEG_ARR_OFFSET + FSEG_INODE_SIZE * i);
1790
1653
}
1798
1661
                        /* out: segment inode index, or ULINT_UNDEFINED
1799
1662
                        if not found */
1800
1663
        page_t* page,   /* in: segment inode page */
1801
 
        ulint   zip_size,/* in: compressed page size, or 0 */
1802
1664
        mtr_t*  mtr)    /* in: mini-transaction handle */
1803
1665
{
1804
1666
        ulint           i;
1805
1667
        fseg_inode_t*   inode;
1806
1668
 
1807
 
        for (i = 0; i < FSP_SEG_INODES_PER_PAGE(zip_size); i++) {
1808
 
 
1809
 
                inode = fsp_seg_inode_page_get_nth_inode(
1810
 
                        page, i, zip_size, mtr);
1811
 
 
1812
 
                if (!ut_dulint_is_zero(mach_read_from_8(inode + FSEG_ID))) {
 
1669
        for (i = 0; i < FSP_SEG_INODES_PER_PAGE; i++) {
 
1670
 
 
1671
                inode = fsp_seg_inode_page_get_nth_inode(page, i, mtr);
 
1672
 
 
1673
                if (ut_dulint_cmp(mach_read_from_8(inode + FSEG_ID),
 
1674
                                  ut_dulint_zero) != 0) {
1813
1675
                        /* This is used */
1814
1676
 
1815
1677
                        return(i);
1828
1690
                        /* out: segment inode index, or ULINT_UNDEFINED
1829
1691
                        if not found */
1830
1692
        page_t* page,   /* in: segment inode page */
1831
 
        ulint   i,      /* in: search forward starting from this index */
1832
 
        ulint   zip_size,/* in: compressed page size, or 0 */
 
1693
        ulint   j,      /* in: search forward starting from this index */
1833
1694
        mtr_t*  mtr)    /* in: mini-transaction handle */
1834
1695
{
 
1696
        ulint           i;
1835
1697
        fseg_inode_t*   inode;
1836
1698
 
1837
 
        for (; i < FSP_SEG_INODES_PER_PAGE(zip_size); i++) {
1838
 
 
1839
 
                inode = fsp_seg_inode_page_get_nth_inode(
1840
 
                        page, i, zip_size, mtr);
1841
 
 
1842
 
                if (ut_dulint_is_zero(mach_read_from_8(inode + FSEG_ID))) {
 
1699
        for (i = j; i < FSP_SEG_INODES_PER_PAGE; i++) {
 
1700
 
 
1701
                inode = fsp_seg_inode_page_get_nth_inode(page, i, mtr);
 
1702
 
 
1703
                if (ut_dulint_cmp(mach_read_from_8(inode + FSEG_ID),
 
1704
                                  ut_dulint_zero) == 0) {
1843
1705
                        /* This is unused */
1844
1706
 
1845
1707
                        return(i);
1860
1722
        mtr_t*          mtr)            /* in: mini-transaction handle */
1861
1723
{
1862
1724
        fseg_inode_t*   inode;
1863
 
        buf_block_t*    block;
1864
1725
        page_t*         page;
1865
1726
        ulint           page_no;
1866
1727
        ulint           space;
1867
 
        ulint           zip_size;
1868
1728
        ulint           i;
1869
1729
 
1870
 
        space = page_get_space_id(page_align(space_header));
1871
 
        zip_size = dict_table_flags_to_zip_size(
1872
 
                mach_read_from_4(FSP_SPACE_FLAGS + space_header));
 
1730
        space = buf_frame_get_space_id(space_header);
1873
1731
 
1874
 
        page_no = fsp_alloc_free_page(space, zip_size, 0, mtr);
 
1732
        page_no = fsp_alloc_free_page(space, 0, mtr);
1875
1733
 
1876
1734
        if (page_no == FIL_NULL) {
1877
1735
 
1878
1736
                return(FALSE);
1879
1737
        }
1880
1738
 
1881
 
        block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
1882
 
#ifdef UNIV_SYNC_DEBUG
1883
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
1884
 
#endif /* UNIV_SYNC_DEBUG */
1885
 
 
1886
 
        block->check_index_page_at_flush = FALSE;
1887
 
 
1888
 
        page = buf_block_get_frame(block);
 
1739
        page = buf_page_get(space, page_no, RW_X_LATCH, mtr);
 
1740
 
 
1741
        buf_block_align(page)->check_index_page_at_flush = FALSE;
1889
1742
 
1890
1743
        mlog_write_ulint(page + FIL_PAGE_TYPE, FIL_PAGE_INODE,
1891
1744
                         MLOG_2BYTES, mtr);
1892
 
 
1893
 
        for (i = 0; i < FSP_SEG_INODES_PER_PAGE(zip_size); i++) {
1894
 
 
1895
 
                inode = fsp_seg_inode_page_get_nth_inode(page, i,
1896
 
                                                         zip_size, mtr);
 
1745
#ifdef UNIV_SYNC_DEBUG
 
1746
        buf_page_dbg_add_level(page, SYNC_FSP_PAGE);
 
1747
#endif /* UNIV_SYNC_DEBUG */
 
1748
 
 
1749
        for (i = 0; i < FSP_SEG_INODES_PER_PAGE; i++) {
 
1750
 
 
1751
                inode = fsp_seg_inode_page_get_nth_inode(page, i, mtr);
1897
1752
 
1898
1753
                mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, mtr);
1899
1754
        }
1915
1770
        mtr_t*          mtr)            /* in: mini-transaction handle */
1916
1771
{
1917
1772
        ulint           page_no;
1918
 
        buf_block_t*    block;
1919
1773
        page_t*         page;
1920
1774
        fseg_inode_t*   inode;
1921
1775
        ibool           success;
1922
 
        ulint           zip_size;
1923
1776
        ulint           n;
1924
1777
 
1925
1778
        if (flst_get_len(space_header + FSP_SEG_INODES_FREE, mtr) == 0) {
1935
1788
 
1936
1789
        page_no = flst_get_first(space_header + FSP_SEG_INODES_FREE, mtr).page;
1937
1790
 
1938
 
        zip_size = dict_table_flags_to_zip_size(
1939
 
                mach_read_from_4(FSP_SPACE_FLAGS + space_header));
1940
 
        block = buf_page_get(page_get_space_id(page_align(space_header)),
1941
 
                             zip_size, page_no, RW_X_LATCH, mtr);
 
1791
        page = buf_page_get(buf_frame_get_space_id(space_header), page_no,
 
1792
                            RW_X_LATCH, mtr);
1942
1793
#ifdef UNIV_SYNC_DEBUG
1943
 
        buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
1794
        buf_page_dbg_add_level(page, SYNC_FSP_PAGE);
1944
1795
#endif /* UNIV_SYNC_DEBUG */
1945
 
        page = buf_block_get_frame(block);
1946
1796
 
1947
 
        n = fsp_seg_inode_page_find_free(page, 0, zip_size, mtr);
 
1797
        n = fsp_seg_inode_page_find_free(page, 0, mtr);
1948
1798
 
1949
1799
        ut_a(n != ULINT_UNDEFINED);
1950
1800
 
1951
 
        inode = fsp_seg_inode_page_get_nth_inode(page, n, zip_size, mtr);
 
1801
        inode = fsp_seg_inode_page_get_nth_inode(page, n, mtr);
1952
1802
 
1953
1803
        if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(page, n + 1,
1954
 
                                                            zip_size, mtr)) {
 
1804
                                                            mtr)) {
1955
1805
                /* There are no other unused headers left on the page: move it
1956
1806
                to another list */
1957
1807
 
1972
1822
fsp_free_seg_inode(
1973
1823
/*===============*/
1974
1824
        ulint           space,  /* in: space id */
1975
 
        ulint           zip_size,/* in: compressed page size in bytes
1976
 
                                or 0 for uncompressed pages */
1977
1825
        fseg_inode_t*   inode,  /* in: segment inode */
1978
1826
        mtr_t*          mtr)    /* in: mini-transaction handle */
1979
1827
{
1980
1828
        page_t*         page;
1981
1829
        fsp_header_t*   space_header;
1982
1830
 
1983
 
        page = page_align(inode);
 
1831
        page = buf_frame_align(inode);
1984
1832
 
1985
 
        space_header = fsp_get_space_header(space, zip_size, mtr);
 
1833
        space_header = fsp_get_space_header(space, mtr);
1986
1834
 
1987
1835
        ut_ad(mach_read_from_4(inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE);
1988
1836
 
1989
 
        if (ULINT_UNDEFINED
1990
 
            == fsp_seg_inode_page_find_free(page, 0, zip_size, mtr)) {
 
1837
        if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(page, 0, mtr)) {
1991
1838
 
1992
1839
                /* Move the page to another list */
1993
1840
 
2001
1848
        mlog_write_dulint(inode + FSEG_ID, ut_dulint_zero, mtr);
2002
1849
        mlog_write_ulint(inode + FSEG_MAGIC_N, 0, MLOG_4BYTES, mtr);
2003
1850
 
2004
 
        if (ULINT_UNDEFINED
2005
 
            == fsp_seg_inode_page_find_used(page, zip_size, mtr)) {
 
1851
        if (ULINT_UNDEFINED == fsp_seg_inode_page_find_used(page, mtr)) {
2006
1852
 
2007
1853
                /* There are no other used headers left on the page: free it */
2008
1854
 
2009
1855
                flst_remove(space_header + FSP_SEG_INODES_FREE,
2010
1856
                            page + FSEG_INODE_PAGE_NODE, mtr);
2011
1857
 
2012
 
                fsp_free_page(space, zip_size, page_get_page_no(page), mtr);
 
1858
                fsp_free_page(space, buf_frame_get_page_no(page), mtr);
2013
1859
        }
2014
1860
}
2015
1861
 
2021
1867
/*===========*/
2022
1868
                                /* out: segment inode, page x-latched */
2023
1869
        fseg_header_t*  header, /* in: segment header */
2024
 
        ulint           space,  /* in: space id */
2025
 
        ulint           zip_size,/* in: compressed page size in bytes
2026
 
                                or 0 for uncompressed pages */
2027
1870
        mtr_t*          mtr)    /* in: mtr handle */
2028
1871
{
2029
1872
        fil_addr_t      inode_addr;
2031
1874
 
2032
1875
        inode_addr.page = mach_read_from_4(header + FSEG_HDR_PAGE_NO);
2033
1876
        inode_addr.boffset = mach_read_from_2(header + FSEG_HDR_OFFSET);
2034
 
        ut_ad(space == mach_read_from_4(header + FSEG_HDR_SPACE));
2035
1877
 
2036
 
        inode = fut_get_ptr(space, zip_size, inode_addr, RW_X_LATCH, mtr);
 
1878
        inode = fut_get_ptr(mach_read_from_4(header + FSEG_HDR_SPACE),
 
1879
                            inode_addr, RW_X_LATCH, mtr);
2037
1880
 
2038
1881
        ut_ad(mach_read_from_4(inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE);
2039
1882
 
2053
1896
{
2054
1897
        ut_ad(inode && mtr);
2055
1898
        ut_ad(n < FSEG_FRAG_ARR_N_SLOTS);
2056
 
        ut_ad(mtr_memo_contains_page(mtr, inode, MTR_MEMO_PAGE_X_FIX));
 
1899
        ut_ad(mtr_memo_contains(mtr, buf_block_align(inode),
 
1900
                                MTR_MEMO_PAGE_X_FIX));
2057
1901
        return(mach_read_from_4(inode + FSEG_FRAG_ARR
2058
1902
                                + n * FSEG_FRAG_SLOT_SIZE));
2059
1903
}
2071
1915
{
2072
1916
        ut_ad(inode && mtr);
2073
1917
        ut_ad(n < FSEG_FRAG_ARR_N_SLOTS);
2074
 
        ut_ad(mtr_memo_contains_page(mtr, inode, MTR_MEMO_PAGE_X_FIX));
 
1918
        ut_ad(mtr_memo_contains(mtr, buf_block_align(inode),
 
1919
                                MTR_MEMO_PAGE_X_FIX));
2075
1920
 
2076
1921
        mlog_write_ulint(inode + FSEG_FRAG_ARR + n * FSEG_FRAG_SLOT_SIZE,
2077
1922
                         page_no, MLOG_4BYTES, mtr);
2160
2005
 
2161
2006
/**************************************************************************
2162
2007
Creates a new segment. */
2163
 
UNIV_INTERN
2164
 
buf_block_t*
 
2008
 
 
2009
page_t*
2165
2010
fseg_create_general(
2166
2011
/*================*/
2167
 
                        /* out: the block where the segment header is placed,
 
2012
                        /* out: the page where the segment header is placed,
2168
2013
                        x-latched, NULL if could not create segment
2169
2014
                        because of lack of space */
2170
2015
        ulint   space,  /* in: space id */
2182
2027
                        operation */
2183
2028
        mtr_t*  mtr)    /* in: mtr */
2184
2029
{
2185
 
        ulint           flags;
2186
 
        ulint           zip_size;
2187
2030
        fsp_header_t*   space_header;
2188
2031
        fseg_inode_t*   inode;
2189
2032
        dulint          seg_id;
2190
 
        buf_block_t*    block   = 0; /* remove warning */
2191
 
        fseg_header_t*  header  = 0; /* remove warning */
 
2033
        fseg_header_t*  header = 0; /* remove warning */
2192
2034
        rw_lock_t*      latch;
2193
2035
        ibool           success;
2194
2036
        ulint           n_reserved;
 
2037
        page_t*         ret             = NULL;
2195
2038
        ulint           i;
2196
2039
 
2197
2040
        ut_ad(mtr);
2198
 
        ut_ad(byte_offset + FSEG_HEADER_SIZE
2199
 
              <= UNIV_PAGE_SIZE - FIL_PAGE_DATA_END);
2200
 
 
2201
 
        latch = fil_space_get_latch(space, &flags);
2202
 
        zip_size = dict_table_flags_to_zip_size(flags);
2203
2041
 
2204
2042
        if (page != 0) {
2205
 
                block = buf_page_get(space, zip_size, page, RW_X_LATCH, mtr);
2206
 
                header = byte_offset + buf_block_get_frame(block);
 
2043
                header = byte_offset + buf_page_get(space, page, RW_X_LATCH,
 
2044
                                                    mtr);
2207
2045
        }
2208
2046
 
2209
2047
        ut_ad(!mutex_own(&kernel_mutex)
2210
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
 
2048
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
2049
                                   MTR_MEMO_X_LOCK));
 
2050
        latch = fil_space_get_latch(space);
2211
2051
 
2212
2052
        mtr_x_lock(latch, mtr);
2213
2053
 
2216
2056
                excess pages from the insert buffer free list */
2217
2057
 
2218
2058
                if (space == 0) {
2219
 
                        ibuf_free_excess_pages(0);
 
2059
                        ibuf_free_excess_pages(space);
2220
2060
                }
2221
2061
        }
2222
2062
 
2228
2068
                }
2229
2069
        }
2230
2070
 
2231
 
        space_header = fsp_get_space_header(space, zip_size, mtr);
 
2071
        space_header = fsp_get_space_header(space, mtr);
2232
2072
 
2233
2073
        inode = fsp_alloc_seg_inode(space_header, mtr);
2234
2074
 
2259
2099
        }
2260
2100
 
2261
2101
        if (page == 0) {
2262
 
                page = fseg_alloc_free_page_low(space, zip_size,
2263
 
                                                inode, 0, FSP_UP, mtr);
 
2102
                page = fseg_alloc_free_page_low(space, inode, 0, FSP_UP, mtr);
2264
2103
 
2265
2104
                if (page == FIL_NULL) {
2266
2105
 
2267
 
                        fsp_free_seg_inode(space, zip_size, inode, mtr);
 
2106
                        fsp_free_seg_inode(space, inode, mtr);
2268
2107
 
2269
2108
                        goto funct_exit;
2270
2109
                }
2271
2110
 
2272
 
                block = buf_page_get(space, zip_size, page, RW_X_LATCH, mtr);
2273
 
                header = byte_offset + buf_block_get_frame(block);
 
2111
                header = byte_offset
 
2112
                        + buf_page_get(space, page, RW_X_LATCH, mtr);
2274
2113
                mlog_write_ulint(header - byte_offset + FIL_PAGE_TYPE,
2275
2114
                                 FIL_PAGE_TYPE_SYS, MLOG_2BYTES, mtr);
2276
2115
        }
2277
2116
 
2278
2117
        mlog_write_ulint(header + FSEG_HDR_OFFSET,
2279
 
                         page_offset(inode), MLOG_2BYTES, mtr);
 
2118
                         inode - buf_frame_align(inode), MLOG_2BYTES, mtr);
2280
2119
 
2281
2120
        mlog_write_ulint(header + FSEG_HDR_PAGE_NO,
2282
 
                         page_get_page_no(page_align(inode)),
2283
 
                         MLOG_4BYTES, mtr);
 
2121
                         buf_frame_get_page_no(inode), MLOG_4BYTES, mtr);
2284
2122
 
2285
2123
        mlog_write_ulint(header + FSEG_HDR_SPACE, space, MLOG_4BYTES, mtr);
2286
2124
 
 
2125
        ret = buf_frame_align(header);
 
2126
 
2287
2127
funct_exit:
2288
2128
        if (!has_done_reservation) {
2289
2129
 
2290
2130
                fil_space_release_free_extents(space, n_reserved);
2291
2131
        }
2292
2132
 
2293
 
        return(block);
 
2133
        return(ret);
2294
2134
}
2295
2135
 
2296
2136
/**************************************************************************
2297
2137
Creates a new segment. */
2298
 
UNIV_INTERN
2299
 
buf_block_t*
 
2138
 
 
2139
page_t*
2300
2140
fseg_create(
2301
2141
/*========*/
2302
 
                        /* out: the block where the segment header is placed,
 
2142
                        /* out: the page where the segment header is placed,
2303
2143
                        x-latched, NULL if could not create segment
2304
2144
                        because of lack of space */
2305
2145
        ulint   space,  /* in: space id */
2329
2169
        ulint   ret;
2330
2170
 
2331
2171
        ut_ad(inode && used && mtr);
2332
 
        ut_ad(mtr_memo_contains_page(mtr, inode, MTR_MEMO_PAGE_X_FIX));
 
2172
        ut_ad(mtr_memo_contains(mtr, buf_block_align(inode),
 
2173
                                MTR_MEMO_PAGE_X_FIX));
2333
2174
 
2334
2175
        *used = mtr_read_ulint(inode + FSEG_NOT_FULL_N_USED, MLOG_4BYTES, mtr)
2335
2176
                + FSP_EXTENT_SIZE * flst_get_len(inode + FSEG_FULL, mtr)
2346
2187
/**************************************************************************
2347
2188
Calculates the number of pages reserved by a segment, and how many pages are
2348
2189
currently used. */
2349
 
UNIV_INTERN
 
2190
 
2350
2191
ulint
2351
2192
fseg_n_reserved_pages(
2352
2193
/*==================*/
2358
2199
        ulint           ret;
2359
2200
        fseg_inode_t*   inode;
2360
2201
        ulint           space;
2361
 
        ulint           flags;
2362
 
        ulint           zip_size;
2363
 
        rw_lock_t*      latch;
2364
2202
 
2365
 
        space = page_get_space_id(page_align(header));
2366
 
        latch = fil_space_get_latch(space, &flags);
2367
 
        zip_size = dict_table_flags_to_zip_size(flags);
 
2203
        space = buf_frame_get_space_id(header);
2368
2204
 
2369
2205
        ut_ad(!mutex_own(&kernel_mutex)
2370
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
2371
 
 
2372
 
        mtr_x_lock(latch, mtr);
2373
 
 
2374
 
        inode = fseg_inode_get(header, space, zip_size, mtr);
 
2206
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
2207
                                   MTR_MEMO_X_LOCK));
 
2208
 
 
2209
        mtr_x_lock(fil_space_get_latch(space), mtr);
 
2210
 
 
2211
        inode = fseg_inode_get(header, mtr);
2375
2212
 
2376
2213
        ret = fseg_n_reserved_pages_low(inode, used, mtr);
2377
2214
 
2389
2226
/*================*/
2390
2227
        fseg_inode_t*   inode,  /* in: segment inode */
2391
2228
        ulint           space,  /* in: space id */
2392
 
        ulint           zip_size,/* in: compressed page size in bytes
2393
 
                                or 0 for uncompressed pages */
2394
2229
        ulint           hint,   /* in: hint which extent would be good as
2395
2230
                                the first extent */
2396
2231
        mtr_t*          mtr)    /* in: mtr */
2419
2254
        }
2420
2255
 
2421
2256
        for (i = 0; i < FSEG_FREE_LIST_MAX_LEN; i++) {
2422
 
                descr = xdes_get_descriptor(space, zip_size, hint, mtr);
 
2257
                descr = xdes_get_descriptor(space, hint, mtr);
2423
2258
 
2424
2259
                if ((descr == NULL)
2425
2260
                    || (XDES_FREE != xdes_get_state(descr, mtr))) {
2429
2264
                        return;
2430
2265
                }
2431
2266
 
2432
 
                descr = fsp_alloc_free_extent(space, zip_size, hint, mtr);
 
2267
                descr = fsp_alloc_free_extent(space, hint, mtr);
2433
2268
 
2434
2269
                xdes_set_state(descr, XDES_FSEG, mtr);
2435
2270
 
2454
2289
                                not be allocated */
2455
2290
        fseg_inode_t*   inode,  /* in: segment inode */
2456
2291
        ulint           space,  /* in: space id */
2457
 
        ulint           zip_size,/* in: compressed page size in bytes
2458
 
                                or 0 for uncompressed pages */
2459
2292
        mtr_t*          mtr)    /* in: mtr */
2460
2293
{
2461
2294
        xdes_t*         descr;
2467
2300
 
2468
2301
                first = flst_get_first(inode + FSEG_FREE, mtr);
2469
2302
 
2470
 
                descr = xdes_lst_get_descriptor(space, zip_size, first, mtr);
 
2303
                descr = xdes_lst_get_descriptor(space, first, mtr);
2471
2304
        } else {
2472
2305
                /* Segment free list was empty, allocate from space */
2473
 
                descr = fsp_alloc_free_extent(space, zip_size, 0, mtr);
 
2306
                descr = fsp_alloc_free_extent(space, 0, mtr);
2474
2307
 
2475
2308
                if (descr == NULL) {
2476
2309
 
2484
2317
                flst_add_last(inode + FSEG_FREE, descr + XDES_FLST_NODE, mtr);
2485
2318
 
2486
2319
                /* Try to fill the segment free list */
2487
 
                fseg_fill_free_list(inode, space, zip_size,
 
2320
                fseg_fill_free_list(inode, space,
2488
2321
                                    xdes_get_offset(descr) + FSP_EXTENT_SIZE,
2489
2322
                                    mtr);
2490
2323
        }
2503
2336
                                /* out: the allocated page number, FIL_NULL
2504
2337
                                if no page could be allocated */
2505
2338
        ulint           space,  /* in: space */
2506
 
        ulint           zip_size,/* in: compressed page size in bytes
2507
 
                                or 0 for uncompressed pages */
2508
2339
        fseg_inode_t*   seg_inode, /* in: segment inode */
2509
2340
        ulint           hint,   /* in: hint of which page would be desirable */
2510
2341
        byte            direction, /* in: if the new page is needed because
2523
2354
        ulint           ret_page;       /* the allocated page offset, FIL_NULL
2524
2355
                                        if could not be allocated */
2525
2356
        xdes_t*         ret_descr;      /* the extent of the allocated page */
 
2357
        page_t*         page;
2526
2358
        ibool           frag_page_allocated = FALSE;
2527
2359
        ibool           success;
2528
2360
        ulint           n;
2533
2365
              == FSEG_MAGIC_N_VALUE);
2534
2366
        seg_id = mtr_read_dulint(seg_inode + FSEG_ID, mtr);
2535
2367
 
2536
 
        ut_ad(!ut_dulint_is_zero(seg_id));
 
2368
        ut_ad(ut_dulint_cmp(seg_id, ut_dulint_zero) > 0);
2537
2369
 
2538
2370
        reserved = fseg_n_reserved_pages_low(seg_inode, &used, mtr);
2539
2371
 
2540
 
        space_header = fsp_get_space_header(space, zip_size, mtr);
 
2372
        space_header = fsp_get_space_header(space, mtr);
2541
2373
 
2542
2374
        descr = xdes_get_descriptor_with_space_hdr(space_header, space,
2543
2375
                                                   hint, mtr);
2545
2377
                /* Hint outside space or too high above free limit: reset
2546
2378
                hint */
2547
2379
                hint = 0;
2548
 
                descr = xdes_get_descriptor(space, zip_size, hint, mtr);
 
2380
                descr = xdes_get_descriptor(space, hint, mtr);
2549
2381
        }
2550
2382
 
2551
2383
        /* In the big if-else below we look for ret_page and ret_descr */
2569
2401
                =========================================================
2570
2402
                the hinted page
2571
2403
                ===============*/
2572
 
                ret_descr = fsp_alloc_free_extent(space, zip_size, hint, mtr);
 
2404
                ret_descr = fsp_alloc_free_extent(space, hint, mtr);
2573
2405
 
2574
2406
                ut_a(ret_descr == descr);
2575
2407
 
2579
2411
                              ret_descr + XDES_FLST_NODE, mtr);
2580
2412
 
2581
2413
                /* Try to fill the segment free list */
2582
 
                fseg_fill_free_list(seg_inode, space, zip_size,
 
2414
                fseg_fill_free_list(seg_inode, space,
2583
2415
                                    hint + FSP_EXTENT_SIZE, mtr);
2584
2416
                ret_page = hint;
2585
2417
                /*-----------------------------------------------------------*/
2587
2419
                   && ((reserved - used) < reserved / FSEG_FILLFACTOR)
2588
2420
                   && (used >= FSEG_FRAG_LIMIT)
2589
2421
                   && (!!(ret_descr
2590
 
                          = fseg_alloc_free_extent(seg_inode,
2591
 
                                                   space, zip_size, mtr)))) {
 
2422
                          = fseg_alloc_free_extent(seg_inode, space, mtr)))) {
2592
2423
 
2593
2424
                /* 3. We take any free extent (which was already assigned above
2594
2425
                ===============================================================
2633
2464
                        return(FIL_NULL);
2634
2465
                }
2635
2466
 
2636
 
                ret_descr = xdes_lst_get_descriptor(space, zip_size,
2637
 
                                                    first, mtr);
 
2467
                ret_descr = xdes_lst_get_descriptor(space, first, mtr);
2638
2468
                ret_page = xdes_get_offset(ret_descr)
2639
2469
                        + xdes_find_bit(ret_descr, XDES_FREE_BIT, TRUE,
2640
2470
                                        0, mtr);
2642
2472
        } else if (used < FSEG_FRAG_LIMIT) {
2643
2473
                /* 6. We allocate an individual page from the space
2644
2474
                ===================================================*/
2645
 
                ret_page = fsp_alloc_free_page(space, zip_size, hint, mtr);
 
2475
                ret_page = fsp_alloc_free_page(space, hint, mtr);
2646
2476
                ret_descr = NULL;
2647
2477
 
2648
2478
                frag_page_allocated = TRUE;
2660
2490
        } else {
2661
2491
                /* 7. We allocate a new extent and take its first page
2662
2492
                ======================================================*/
2663
 
                ret_descr = fseg_alloc_free_extent(seg_inode,
2664
 
                                                   space, zip_size, mtr);
 
2493
                ret_descr = fseg_alloc_free_extent(seg_inode, space, mtr);
2665
2494
 
2666
2495
                if (ret_descr == NULL) {
2667
2496
                        ret_page = FIL_NULL;
2707
2536
                /* Initialize the allocated page to buffer pool, so that it
2708
2537
                can be obtained immediately with buf_page_get without need
2709
2538
                for a disk read */
2710
 
                buf_block_t*    block;
2711
 
                ulint           zip_size = dict_table_flags_to_zip_size(
2712
 
                        mach_read_from_4(FSP_SPACE_FLAGS + space_header));
2713
 
 
2714
 
                block = buf_page_create(space, ret_page, zip_size, mtr);
 
2539
 
 
2540
                page = buf_page_create(space, ret_page, mtr);
 
2541
 
 
2542
                ut_a(page == buf_page_get(space, ret_page, RW_X_LATCH, mtr));
 
2543
 
2715
2544
#ifdef UNIV_SYNC_DEBUG
2716
 
                buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
 
2545
                buf_page_dbg_add_level(page, SYNC_FSP_PAGE);
2717
2546
#endif /* UNIV_SYNC_DEBUG */
2718
 
                if (UNIV_UNLIKELY(block != buf_page_get(space, zip_size,
2719
 
                                                        ret_page, RW_X_LATCH,
2720
 
                                                        mtr))) {
2721
 
                        ut_error;
2722
 
                }
2723
2547
 
2724
2548
                /* The prior contents of the page should be ignored */
2725
 
                fsp_init_file_page(block, mtr);
 
2549
                fsp_init_file_page(page, mtr);
2726
2550
 
2727
2551
                /* At this point we know the extent and the page offset.
2728
2552
                The extent is still in the appropriate list (FSEG_NOT_FULL
2729
2553
                or FSEG_FREE), and the page is not yet marked as used. */
2730
2554
 
2731
 
                ut_ad(xdes_get_descriptor(space, zip_size, ret_page, mtr)
2732
 
                      == ret_descr);
 
2555
                ut_ad(xdes_get_descriptor(space, ret_page, mtr) == ret_descr);
2733
2556
                ut_ad(xdes_get_bit(ret_descr, XDES_FREE_BIT,
2734
2557
                                   ret_page % FSP_EXTENT_SIZE, mtr) == TRUE);
2735
2558
 
2736
 
                fseg_mark_page_used(seg_inode, space, zip_size, ret_page, mtr);
 
2559
                fseg_mark_page_used(seg_inode, space, ret_page, mtr);
2737
2560
        }
2738
2561
 
2739
2562
        buf_reset_check_index_page_at_flush(space, ret_page);
2745
2568
Allocates a single free page from a segment. This function implements
2746
2569
the intelligent allocation strategy which tries to minimize file space
2747
2570
fragmentation. */
2748
 
UNIV_INTERN
 
2571
 
2749
2572
ulint
2750
2573
fseg_alloc_free_page_general(
2751
2574
/*=========================*/
2767
2590
{
2768
2591
        fseg_inode_t*   inode;
2769
2592
        ulint           space;
2770
 
        ulint           flags;
2771
 
        ulint           zip_size;
2772
2593
        rw_lock_t*      latch;
2773
2594
        ibool           success;
2774
2595
        ulint           page_no;
2775
2596
        ulint           n_reserved;
2776
2597
 
2777
 
        space = page_get_space_id(page_align(seg_header));
2778
 
 
2779
 
        latch = fil_space_get_latch(space, &flags);
2780
 
 
2781
 
        zip_size = dict_table_flags_to_zip_size(flags);
 
2598
        space = buf_frame_get_space_id(seg_header);
2782
2599
 
2783
2600
        ut_ad(!mutex_own(&kernel_mutex)
2784
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
 
2601
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
2602
                                   MTR_MEMO_X_LOCK));
 
2603
        latch = fil_space_get_latch(space);
2785
2604
 
2786
2605
        mtr_x_lock(latch, mtr);
2787
2606
 
2790
2609
                excess pages from the insert buffer free list */
2791
2610
 
2792
2611
                if (space == 0) {
2793
 
                        ibuf_free_excess_pages(0);
 
2612
                        ibuf_free_excess_pages(space);
2794
2613
                }
2795
2614
        }
2796
2615
 
2797
 
        inode = fseg_inode_get(seg_header, space, zip_size, mtr);
 
2616
        inode = fseg_inode_get(seg_header, mtr);
2798
2617
 
2799
2618
        if (!has_done_reservation) {
2800
2619
                success = fsp_reserve_free_extents(&n_reserved, space, 2,
2804
2623
                }
2805
2624
        }
2806
2625
 
2807
 
        page_no = fseg_alloc_free_page_low(space, zip_size,
 
2626
        page_no = fseg_alloc_free_page_low(buf_frame_get_space_id(inode),
2808
2627
                                           inode, hint, direction, mtr);
2809
2628
        if (!has_done_reservation) {
2810
2629
                fil_space_release_free_extents(space, n_reserved);
2817
2636
Allocates a single free page from a segment. This function implements
2818
2637
the intelligent allocation strategy which tries to minimize file space
2819
2638
fragmentation. */
2820
 
UNIV_INTERN
 
2639
 
2821
2640
ulint
2822
2641
fseg_alloc_free_page(
2823
2642
/*=================*/
2901
2720
split or merge in a B-tree. But we do not want to waste disk space if the table
2902
2721
only occupies < 32 pages. That is why we apply different rules in that special
2903
2722
case, just ensuring that there are 3 free pages available. */
2904
 
UNIV_INTERN
 
2723
 
2905
2724
ibool
2906
2725
fsp_reserve_free_extents(
2907
2726
/*=====================*/
2919
2738
        ulint           n_free_list_ext;
2920
2739
        ulint           free_limit;
2921
2740
        ulint           size;
2922
 
        ulint           flags;
2923
 
        ulint           zip_size;
2924
2741
        ulint           n_free;
2925
2742
        ulint           n_free_up;
2926
2743
        ulint           reserve;
2928
2745
        ulint           n_pages_added;
2929
2746
 
2930
2747
        ut_ad(mtr);
 
2748
        ut_ad(!mutex_own(&kernel_mutex)
 
2749
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
2750
                                   MTR_MEMO_X_LOCK));
2931
2751
        *n_reserved = n_ext;
2932
2752
 
2933
 
        latch = fil_space_get_latch(space, &flags);
2934
 
        zip_size = dict_table_flags_to_zip_size(flags);
2935
 
 
2936
 
        ut_ad(!mutex_own(&kernel_mutex)
2937
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
 
2753
        latch = fil_space_get_latch(space);
2938
2754
 
2939
2755
        mtr_x_lock(latch, mtr);
2940
2756
 
2941
 
        space_header = fsp_get_space_header(space, zip_size, mtr);
 
2757
        space_header = fsp_get_space_header(space, mtr);
2942
2758
try_again:
2943
2759
        size = mtr_read_ulint(space_header + FSP_SIZE, MLOG_4BYTES, mtr);
2944
2760
 
2961
2777
 
2962
2778
        if (n_free_up > 0) {
2963
2779
                n_free_up--;
2964
 
                if (!zip_size) {
2965
 
                        n_free_up -= n_free_up
2966
 
                                / (UNIV_PAGE_SIZE / FSP_EXTENT_SIZE);
2967
 
                } else {
2968
 
                        n_free_up -= n_free_up
2969
 
                                / (zip_size / FSP_EXTENT_SIZE);
2970
 
                }
 
2780
                n_free_up = n_free_up - n_free_up
 
2781
                        / (XDES_DESCRIBED_PER_PAGE / FSP_EXTENT_SIZE);
2971
2782
        }
2972
2783
 
2973
2784
        n_free = n_free_list_ext + n_free_up;
3017
2828
will be able to insert new data to the database without running out the
3018
2829
tablespace. Only free extents are taken into account and we also subtract
3019
2830
the safety margin required by the above function fsp_reserve_free_extents. */
3020
 
UNIV_INTERN
 
2831
 
3021
2832
ullint
3022
2833
fsp_get_available_space_in_free_extents(
3023
2834
/*====================================*/
3028
2839
        ulint           n_free_list_ext;
3029
2840
        ulint           free_limit;
3030
2841
        ulint           size;
3031
 
        ulint           flags;
3032
 
        ulint           zip_size;
3033
2842
        ulint           n_free;
3034
2843
        ulint           n_free_up;
3035
2844
        ulint           reserve;
3040
2849
 
3041
2850
        mtr_start(&mtr);
3042
2851
 
3043
 
        latch = fil_space_get_latch(space, &flags);
3044
 
        zip_size = dict_table_flags_to_zip_size(flags);
 
2852
        latch = fil_space_get_latch(space);
3045
2853
 
3046
2854
        mtr_x_lock(latch, &mtr);
3047
2855
 
3048
 
        space_header = fsp_get_space_header(space, zip_size, &mtr);
 
2856
        space_header = fsp_get_space_header(space, &mtr);
3049
2857
 
3050
2858
        size = mtr_read_ulint(space_header + FSP_SIZE, MLOG_4BYTES, &mtr);
3051
2859
 
3071
2879
 
3072
2880
        if (n_free_up > 0) {
3073
2881
                n_free_up--;
3074
 
                if (!zip_size) {
3075
 
                        n_free_up -= n_free_up
3076
 
                                / (UNIV_PAGE_SIZE / FSP_EXTENT_SIZE);
3077
 
                } else {
3078
 
                        n_free_up -= n_free_up
3079
 
                                / (zip_size / FSP_EXTENT_SIZE);
3080
 
                }
 
2882
                n_free_up = n_free_up - n_free_up
 
2883
                        / (XDES_DESCRIBED_PER_PAGE / FSP_EXTENT_SIZE);
3081
2884
        }
3082
2885
 
3083
2886
        n_free = n_free_list_ext + n_free_up;
3092
2895
                return(0);
3093
2896
        }
3094
2897
 
3095
 
        if (!zip_size) {
3096
 
                return((ullint) (n_free - reserve)
3097
 
                       * FSP_EXTENT_SIZE
3098
 
                       * (UNIV_PAGE_SIZE / 1024));
3099
 
        } else {
3100
 
                return((ullint) (n_free - reserve)
3101
 
                       * FSP_EXTENT_SIZE
3102
 
                       * (zip_size / 1024));
3103
 
        }
 
2898
        return((ullint)(n_free - reserve)
 
2899
               * FSP_EXTENT_SIZE
 
2900
               * (UNIV_PAGE_SIZE / 1024));
3104
2901
}
3105
2902
 
3106
2903
/************************************************************************
3112
2909
/*================*/
3113
2910
        fseg_inode_t*   seg_inode,/* in: segment inode */
3114
2911
        ulint           space,  /* in: space id */
3115
 
        ulint           zip_size,/* in: compressed page size in bytes
3116
 
                                or 0 for uncompressed pages */
3117
2912
        ulint           page,   /* in: page offset */
3118
2913
        mtr_t*          mtr)    /* in: mtr */
3119
2914
{
3122
2917
 
3123
2918
        ut_ad(seg_inode && mtr);
3124
2919
 
3125
 
        descr = xdes_get_descriptor(space, zip_size, page, mtr);
 
2920
        descr = xdes_get_descriptor(space, page, mtr);
3126
2921
 
3127
2922
        ut_ad(mtr_read_ulint(seg_inode + FSEG_ID, MLOG_4BYTES, mtr)
3128
2923
              == mtr_read_ulint(descr + XDES_ID, MLOG_4BYTES, mtr));
3168
2963
/*===============*/
3169
2964
        fseg_inode_t*   seg_inode, /* in: segment inode */
3170
2965
        ulint           space,  /* in: space id */
3171
 
        ulint           zip_size,/* in: compressed page size in bytes
3172
 
                                or 0 for uncompressed pages */
3173
2966
        ulint           page,   /* in: page offset */
3174
2967
        mtr_t*          mtr)    /* in: mtr handle */
3175
2968
{
3187
2980
        /* Drop search system page hash index if the page is found in
3188
2981
        the pool and is hashed */
3189
2982
 
3190
 
        btr_search_drop_page_hash_when_freed(space, zip_size, page);
 
2983
        btr_search_drop_page_hash_when_freed(space, page);
3191
2984
 
3192
 
        descr = xdes_get_descriptor(space, zip_size, page, mtr);
 
2985
        descr = xdes_get_descriptor(space, page, mtr);
3193
2986
 
3194
2987
        ut_a(descr);
3195
2988
        if (xdes_get_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, mtr)) {
3229
3022
                        }
3230
3023
                }
3231
3024
 
3232
 
                fsp_free_page(space, zip_size, page, mtr);
 
3025
                fsp_free_page(space, page, mtr);
3233
3026
 
3234
3027
                return;
3235
3028
        }
3295
3088
                /* The extent has become free: free it to space */
3296
3089
                flst_remove(seg_inode + FSEG_NOT_FULL,
3297
3090
                            descr + XDES_FLST_NODE, mtr);
3298
 
                fsp_free_extent(space, zip_size, page, mtr);
 
3091
                fsp_free_extent(space, page, mtr);
3299
3092
        }
3300
3093
}
3301
3094
 
3302
3095
/**************************************************************************
3303
3096
Frees a single page of a segment. */
3304
 
UNIV_INTERN
 
3097
 
3305
3098
void
3306
3099
fseg_free_page(
3307
3100
/*===========*/
3310
3103
        ulint           page,   /* in: page offset */
3311
3104
        mtr_t*          mtr)    /* in: mtr handle */
3312
3105
{
3313
 
        ulint           flags;
3314
 
        ulint           zip_size;
3315
3106
        fseg_inode_t*   seg_inode;
3316
 
        rw_lock_t*      latch;
3317
 
 
3318
 
        latch = fil_space_get_latch(space, &flags);
3319
 
        zip_size = dict_table_flags_to_zip_size(flags);
3320
3107
 
3321
3108
        ut_ad(!mutex_own(&kernel_mutex)
3322
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
3323
 
 
3324
 
        mtr_x_lock(latch, mtr);
3325
 
 
3326
 
        seg_inode = fseg_inode_get(seg_header, space, zip_size, mtr);
3327
 
 
3328
 
        fseg_free_page_low(seg_inode, space, zip_size, page, mtr);
 
3109
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
3110
                                   MTR_MEMO_X_LOCK));
 
3111
 
 
3112
        mtr_x_lock(fil_space_get_latch(space), mtr);
 
3113
 
 
3114
        seg_inode = fseg_inode_get(seg_header, mtr);
 
3115
 
 
3116
        fseg_free_page_low(seg_inode, space, page, mtr);
3329
3117
 
3330
3118
#ifdef UNIV_DEBUG_FILE_ACCESSES
3331
3119
        buf_page_set_file_page_was_freed(space, page);
3340
3128
/*=============*/
3341
3129
        fseg_inode_t*   seg_inode, /* in: segment inode */
3342
3130
        ulint           space,  /* in: space id */
3343
 
        ulint           zip_size,/* in: compressed page size in bytes
3344
 
                                or 0 for uncompressed pages */
3345
3131
        ulint           page,   /* in: a page in the extent */
3346
3132
        mtr_t*          mtr)    /* in: mtr handle */
3347
3133
{
3353
3139
 
3354
3140
        ut_ad(seg_inode && mtr);
3355
3141
 
3356
 
        descr = xdes_get_descriptor(space, zip_size, page, mtr);
 
3142
        descr = xdes_get_descriptor(space, page, mtr);
3357
3143
 
3358
3144
        ut_a(xdes_get_state(descr, mtr) == XDES_FSEG);
3359
3145
        ut_a(0 == ut_dulint_cmp(mtr_read_dulint(descr + XDES_ID, mtr),
3368
3154
                        found in the pool and is hashed */
3369
3155
 
3370
3156
                        btr_search_drop_page_hash_when_freed(
3371
 
                                space, zip_size, first_page_in_extent + i);
 
3157
                                space, first_page_in_extent + i);
3372
3158
                }
3373
3159
        }
3374
3160
 
3392
3178
                                 MLOG_4BYTES, mtr);
3393
3179
        }
3394
3180
 
3395
 
        fsp_free_extent(space, zip_size, page, mtr);
 
3181
        fsp_free_extent(space, page, mtr);
3396
3182
 
3397
3183
#ifdef UNIV_DEBUG_FILE_ACCESSES
3398
3184
        for (i = 0; i < FSP_EXTENT_SIZE; i++) {
3408
3194
repeatedly calling this function in different mini-transactions. Doing
3409
3195
the freeing in a single mini-transaction might result in too big a
3410
3196
mini-transaction. */
3411
 
UNIV_INTERN
 
3197
 
3412
3198
ibool
3413
3199
fseg_free_step(
3414
3200
/*===========*/
3424
3210
        xdes_t*         descr;
3425
3211
        fseg_inode_t*   inode;
3426
3212
        ulint           space;
3427
 
        ulint           flags;
3428
 
        ulint           zip_size;
3429
 
        ulint           header_page;
3430
 
        rw_lock_t*      latch;
3431
 
 
3432
 
        space = page_get_space_id(page_align(header));
3433
 
        header_page = page_get_page_no(page_align(header));
3434
 
 
3435
 
        latch = fil_space_get_latch(space, &flags);
3436
 
        zip_size = dict_table_flags_to_zip_size(flags);
 
3213
 
 
3214
        space = buf_frame_get_space_id(header);
3437
3215
 
3438
3216
        ut_ad(!mutex_own(&kernel_mutex)
3439
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
3440
 
 
3441
 
        mtr_x_lock(latch, mtr);
3442
 
 
3443
 
        descr = xdes_get_descriptor(space, zip_size, header_page, mtr);
 
3217
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
3218
                                   MTR_MEMO_X_LOCK));
 
3219
 
 
3220
        mtr_x_lock(fil_space_get_latch(space), mtr);
 
3221
 
 
3222
        descr = xdes_get_descriptor(space, buf_frame_get_page_no(header), mtr);
3444
3223
 
3445
3224
        /* Check that the header resides on a page which has not been
3446
3225
        freed yet */
3447
3226
 
3448
3227
        ut_a(descr);
3449
 
        ut_a(xdes_get_bit(descr, XDES_FREE_BIT,
3450
 
                          header_page % FSP_EXTENT_SIZE, mtr) == FALSE);
3451
 
        inode = fseg_inode_get(header, space, zip_size, mtr);
 
3228
        ut_a(xdes_get_bit(descr, XDES_FREE_BIT, buf_frame_get_page_no(header)
 
3229
                          % FSP_EXTENT_SIZE, mtr) == FALSE);
 
3230
        inode = fseg_inode_get(header, mtr);
3452
3231
 
3453
 
        descr = fseg_get_first_extent(inode, space, zip_size, mtr);
 
3232
        descr = fseg_get_first_extent(inode, mtr);
3454
3233
 
3455
3234
        if (descr != NULL) {
3456
3235
                /* Free the extent held by the segment */
3457
3236
                page = xdes_get_offset(descr);
3458
3237
 
3459
 
                fseg_free_extent(inode, space, zip_size, page, mtr);
 
3238
                fseg_free_extent(inode, space, page, mtr);
3460
3239
 
3461
3240
                return(FALSE);
3462
3241
        }
3466
3245
 
3467
3246
        if (n == ULINT_UNDEFINED) {
3468
3247
                /* Freeing completed: free the segment inode */
3469
 
                fsp_free_seg_inode(space, zip_size, inode, mtr);
 
3248
                fsp_free_seg_inode(space, inode, mtr);
3470
3249
 
3471
3250
                return(TRUE);
3472
3251
        }
3473
3252
 
3474
 
        fseg_free_page_low(inode, space, zip_size,
 
3253
        fseg_free_page_low(inode, space,
3475
3254
                           fseg_get_nth_frag_page_no(inode, n, mtr), mtr);
3476
3255
 
3477
3256
        n = fseg_find_last_used_frag_page_slot(inode, mtr);
3478
3257
 
3479
3258
        if (n == ULINT_UNDEFINED) {
3480
3259
                /* Freeing completed: free the segment inode */
3481
 
                fsp_free_seg_inode(space, zip_size, inode, mtr);
 
3260
                fsp_free_seg_inode(space, inode, mtr);
3482
3261
 
3483
3262
                return(TRUE);
3484
3263
        }
3489
3268
/**************************************************************************
3490
3269
Frees part of a segment. Differs from fseg_free_step because this function
3491
3270
leaves the header page unfreed. */
3492
 
UNIV_INTERN
 
3271
 
3493
3272
ibool
3494
3273
fseg_free_step_not_header(
3495
3274
/*======================*/
3504
3283
        xdes_t*         descr;
3505
3284
        fseg_inode_t*   inode;
3506
3285
        ulint           space;
3507
 
        ulint           flags;
3508
 
        ulint           zip_size;
3509
3286
        ulint           page_no;
3510
 
        rw_lock_t*      latch;
3511
 
 
3512
 
        space = page_get_space_id(page_align(header));
3513
 
 
3514
 
        latch = fil_space_get_latch(space, &flags);
3515
 
        zip_size = dict_table_flags_to_zip_size(flags);
 
3287
 
 
3288
        space = buf_frame_get_space_id(header);
3516
3289
 
3517
3290
        ut_ad(!mutex_own(&kernel_mutex)
3518
 
              || mtr_memo_contains(mtr, latch, MTR_MEMO_X_LOCK));
3519
 
 
3520
 
        mtr_x_lock(latch, mtr);
3521
 
 
3522
 
        inode = fseg_inode_get(header, space, zip_size, mtr);
3523
 
 
3524
 
        descr = fseg_get_first_extent(inode, space, zip_size, mtr);
 
3291
              || mtr_memo_contains(mtr, fil_space_get_latch(space),
 
3292
                                   MTR_MEMO_X_LOCK));
 
3293
 
 
3294
        mtr_x_lock(fil_space_get_latch(space), mtr);
 
3295
 
 
3296
        inode = fseg_inode_get(header, mtr);
 
3297
 
 
3298
        descr = fseg_get_first_extent(inode, mtr);
3525
3299
 
3526
3300
        if (descr != NULL) {
3527
3301
                /* Free the extent held by the segment */
3528
3302
                page = xdes_get_offset(descr);
3529
3303
 
3530
 
                fseg_free_extent(inode, space, zip_size, page, mtr);
 
3304
                fseg_free_extent(inode, space, page, mtr);
3531
3305
 
3532
3306
                return(FALSE);
3533
3307
        }
3542
3316
 
3543
3317
        page_no = fseg_get_nth_frag_page_no(inode, n, mtr);
3544
3318
 
3545
 
        if (page_no == page_get_page_no(page_align(header))) {
 
3319
        if (page_no == buf_frame_get_page_no(header)) {
3546
3320
 
3547
3321
                return(TRUE);
3548
3322
        }
3549
3323
 
3550
 
        fseg_free_page_low(inode, space, zip_size, page_no, mtr);
 
3324
        fseg_free_page_low(inode, space, page_no, mtr);
3551
3325
 
3552
3326
        return(FALSE);
3553
3327
}
3555
3329
/***********************************************************************
3556
3330
Frees a segment. The freeing is performed in several mini-transactions,
3557
3331
so that there is no danger of bufferfixing too many buffer pages. */
3558
 
UNIV_INTERN
 
3332
 
3559
3333
void
3560
3334
fseg_free(
3561
3335
/*======*/
3562
3336
        ulint   space,  /* in: space id */
3563
 
        ulint   zip_size,/* in: compressed page size in bytes
3564
 
                        or 0 for uncompressed pages */
3565
3337
        ulint   page_no,/* in: page number where the segment header is
3566
3338
                        placed */
3567
3339
        ulint   offset) /* in: byte offset of the segment header on that
3578
3350
        for (;;) {
3579
3351
                mtr_start(&mtr);
3580
3352
 
3581
 
                header = fut_get_ptr(space, zip_size, addr, RW_X_LATCH, &mtr);
 
3353
                header = fut_get_ptr(space, addr, RW_X_LATCH, &mtr);
3582
3354
 
3583
3355
                finished = fseg_free_step(header, &mtr);
3584
3356
 
3602
3374
                                /* out: the first extent descriptor, or NULL if
3603
3375
                                none */
3604
3376
        fseg_inode_t*   inode,  /* in: segment inode */
3605
 
        ulint           space,  /* in: space id */
3606
 
        ulint           zip_size,/* in: compressed page size in bytes
3607
 
                                or 0 for uncompressed pages */
3608
3377
        mtr_t*          mtr)    /* in: mtr */
3609
3378
{
3610
3379
        fil_addr_t      first;
 
3380
        ulint           space;
3611
3381
        xdes_t*         descr;
3612
3382
 
3613
3383
        ut_ad(inode && mtr);
3614
3384
 
3615
 
        ut_ad(space == page_get_space_id(page_align(inode)));
 
3385
        space = buf_frame_get_space_id(inode);
3616
3386
 
3617
3387
        first = fil_addr_null;
3618
3388
 
3633
3403
 
3634
3404
                return(NULL);
3635
3405
        }
3636
 
        descr = xdes_lst_get_descriptor(space, zip_size, first, mtr);
 
3406
        descr = xdes_lst_get_descriptor(space, first, mtr);
3637
3407
 
3638
3408
        return(descr);
3639
3409
}
3656
3426
        ulint           n_used          = 0;
3657
3427
        ulint           n_used2         = 0;
3658
3428
 
3659
 
        ut_ad(mtr_memo_contains_page(mtr2, inode, MTR_MEMO_PAGE_X_FIX));
 
3429
        ut_ad(mtr_memo_contains(mtr2, buf_block_align(inode),
 
3430
                                MTR_MEMO_PAGE_X_FIX));
3660
3431
        ut_ad(mach_read_from_4(inode + FSEG_MAGIC_N) == FSEG_MAGIC_N_VALUE);
3661
3432
 
3662
 
        space = page_get_space_id(page_align(inode));
 
3433
        space = buf_frame_get_space_id(inode);
3663
3434
 
3664
3435
        seg_id = mtr_read_dulint(inode + FSEG_ID, mtr2);
3665
3436
        n_used = mtr_read_ulint(inode + FSEG_NOT_FULL_N_USED,
3672
3443
        node_addr = flst_get_first(inode + FSEG_FREE, mtr2);
3673
3444
 
3674
3445
        while (!fil_addr_is_null(node_addr)) {
3675
 
                ulint   flags;
3676
 
                ulint   zip_size;
3677
 
 
3678
3446
                mtr_start(&mtr);
3679
 
                mtr_x_lock(fil_space_get_latch(space, &flags), &mtr);
3680
 
                zip_size = dict_table_flags_to_zip_size(flags);
 
3447
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3681
3448
 
3682
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3683
 
                                                node_addr, &mtr);
 
3449
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3684
3450
 
3685
3451
                ut_a(xdes_get_n_used(descr, &mtr) == 0);
3686
3452
                ut_a(xdes_get_state(descr, &mtr) == XDES_FSEG);
3696
3462
        node_addr = flst_get_first(inode + FSEG_NOT_FULL, mtr2);
3697
3463
 
3698
3464
        while (!fil_addr_is_null(node_addr)) {
3699
 
                ulint   flags;
3700
 
                ulint   zip_size;
3701
 
 
3702
3465
                mtr_start(&mtr);
3703
 
                mtr_x_lock(fil_space_get_latch(space, &flags), &mtr);
3704
 
                zip_size = dict_table_flags_to_zip_size(flags);
 
3466
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3705
3467
 
3706
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3707
 
                                                node_addr, &mtr);
 
3468
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3708
3469
 
3709
3470
                ut_a(xdes_get_n_used(descr, &mtr) > 0);
3710
3471
                ut_a(xdes_get_n_used(descr, &mtr) < FSP_EXTENT_SIZE);
3723
3484
        node_addr = flst_get_first(inode + FSEG_FULL, mtr2);
3724
3485
 
3725
3486
        while (!fil_addr_is_null(node_addr)) {
3726
 
                ulint   flags;
3727
 
                ulint   zip_size;
3728
 
 
3729
3487
                mtr_start(&mtr);
3730
 
                mtr_x_lock(fil_space_get_latch(space, &flags), &mtr);
3731
 
                zip_size = dict_table_flags_to_zip_size(flags);
 
3488
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3732
3489
 
3733
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3734
 
                                                node_addr, &mtr);
 
3490
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3735
3491
 
3736
3492
                ut_a(xdes_get_n_used(descr, &mtr) == FSP_EXTENT_SIZE);
3737
3493
                ut_a(xdes_get_state(descr, &mtr) == XDES_FSEG);
3749
3505
 
3750
3506
/***********************************************************************
3751
3507
Validates a segment. */
3752
 
UNIV_INTERN
 
3508
 
3753
3509
ibool
3754
3510
fseg_validate(
3755
3511
/*==========*/
3756
3512
                                /* out: TRUE if ok */
3757
3513
        fseg_header_t*  header, /* in: segment header */
3758
 
        mtr_t*          mtr)    /* in: mtr */
 
3514
        mtr_t*          mtr2)   /* in: mtr */
3759
3515
{
3760
3516
        fseg_inode_t*   inode;
3761
3517
        ibool           ret;
3762
3518
        ulint           space;
3763
 
        ulint           flags;
3764
 
        ulint           zip_size;
3765
 
 
3766
 
        space = page_get_space_id(page_align(header));
3767
 
 
3768
 
        mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
3769
 
        zip_size = dict_table_flags_to_zip_size(flags);
3770
 
 
3771
 
        inode = fseg_inode_get(header, space, zip_size, mtr);
3772
 
 
3773
 
        ret = fseg_validate_low(inode, mtr);
 
3519
 
 
3520
        space = buf_frame_get_space_id(header);
 
3521
 
 
3522
        mtr_x_lock(fil_space_get_latch(space), mtr2);
 
3523
 
 
3524
        inode = fseg_inode_get(header, mtr2);
 
3525
 
 
3526
        ret = fseg_validate_low(inode, mtr2);
3774
3527
 
3775
3528
        return(ret);
3776
3529
}
3797
3550
        ulint   page_no;
3798
3551
        dulint   d_var;
3799
3552
 
3800
 
        ut_ad(mtr_memo_contains_page(mtr, inode, MTR_MEMO_PAGE_X_FIX));
3801
 
        space = page_get_space_id(page_align(inode));
3802
 
        page_no = page_get_page_no(page_align(inode));
 
3553
        ut_ad(mtr_memo_contains(mtr, buf_block_align(inode),
 
3554
                                MTR_MEMO_PAGE_X_FIX));
 
3555
        space = buf_frame_get_space_id(inode);
 
3556
        page_no = buf_frame_get_page_no(inode);
3803
3557
 
3804
3558
        reserved = fseg_n_reserved_pages_low(inode, &used, mtr);
3805
3559
 
3827
3581
                (ulong) n_used);
3828
3582
}
3829
3583
 
3830
 
#ifdef UNIV_BTR_PRINT
3831
3584
/***********************************************************************
3832
3585
Writes info of a segment. */
3833
 
UNIV_INTERN
 
3586
 
3834
3587
void
3835
3588
fseg_print(
3836
3589
/*=======*/
3839
3592
{
3840
3593
        fseg_inode_t*   inode;
3841
3594
        ulint           space;
3842
 
        ulint           flags;
3843
 
        ulint           zip_size;
3844
 
 
3845
 
        space = page_get_space_id(page_align(header));
3846
 
 
3847
 
        mtr_x_lock(fil_space_get_latch(space, &flags), mtr);
3848
 
        zip_size = dict_table_flags_to_zip_size(flags);
3849
 
 
3850
 
        inode = fseg_inode_get(header, space, zip_size, mtr);
 
3595
 
 
3596
        space = buf_frame_get_space_id(header);
 
3597
 
 
3598
        mtr_x_lock(fil_space_get_latch(space), mtr);
 
3599
 
 
3600
        inode = fseg_inode_get(header, mtr);
3851
3601
 
3852
3602
        fseg_print_low(inode, mtr);
3853
3603
}
3854
 
#endif /* UNIV_BTR_PRINT */
3855
3604
 
3856
3605
/***********************************************************************
3857
3606
Validates the file space system and its segments. */
3858
 
UNIV_INTERN
 
3607
 
3859
3608
ibool
3860
3609
fsp_validate(
3861
3610
/*=========*/
3865
3614
        fsp_header_t*   header;
3866
3615
        fseg_inode_t*   seg_inode;
3867
3616
        page_t*         seg_inode_page;
3868
 
        rw_lock_t*      latch;
3869
3617
        ulint           size;
3870
 
        ulint           flags;
3871
 
        ulint           zip_size;
3872
3618
        ulint           free_limit;
3873
3619
        ulint           frag_n_used;
3874
3620
        mtr_t           mtr;
3884
3630
        ulint           seg_inode_len_free;
3885
3631
        ulint           seg_inode_len_full;
3886
3632
 
3887
 
        latch = fil_space_get_latch(space, &flags);
3888
 
        zip_size = dict_table_flags_to_zip_size(flags);
3889
 
        ut_a(ut_is_2pow(zip_size));
3890
 
        ut_a(zip_size <= UNIV_PAGE_SIZE);
3891
 
        ut_a(!zip_size || zip_size >= PAGE_ZIP_MIN_SIZE);
3892
 
 
3893
3633
        /* Start first a mini-transaction mtr2 to lock out all other threads
3894
3634
        from the fsp system */
3895
3635
        mtr_start(&mtr2);
3896
 
        mtr_x_lock(latch, &mtr2);
 
3636
        mtr_x_lock(fil_space_get_latch(space), &mtr2);
3897
3637
 
3898
3638
        mtr_start(&mtr);
3899
 
        mtr_x_lock(latch, &mtr);
 
3639
        mtr_x_lock(fil_space_get_latch(space), &mtr);
3900
3640
 
3901
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3641
        header = fsp_get_space_header(space, &mtr);
3902
3642
 
3903
3643
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, &mtr);
3904
3644
        free_limit = mtr_read_ulint(header + FSP_FREE_LIMIT,
3923
3663
 
3924
3664
        /* Validate FSP_FREE list */
3925
3665
        mtr_start(&mtr);
3926
 
        mtr_x_lock(latch, &mtr);
 
3666
        mtr_x_lock(fil_space_get_latch(space), &mtr);
3927
3667
 
3928
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3668
        header = fsp_get_space_header(space, &mtr);
3929
3669
        node_addr = flst_get_first(header + FSP_FREE, &mtr);
3930
3670
 
3931
3671
        mtr_commit(&mtr);
3932
3672
 
3933
3673
        while (!fil_addr_is_null(node_addr)) {
3934
3674
                mtr_start(&mtr);
3935
 
                mtr_x_lock(latch, &mtr);
 
3675
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3936
3676
 
3937
3677
                descr_count++;
3938
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3939
 
                                                node_addr, &mtr);
 
3678
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3940
3679
 
3941
3680
                ut_a(xdes_get_n_used(descr, &mtr) == 0);
3942
3681
                ut_a(xdes_get_state(descr, &mtr) == XDES_FREE);
3947
3686
 
3948
3687
        /* Validate FSP_FREE_FRAG list */
3949
3688
        mtr_start(&mtr);
3950
 
        mtr_x_lock(latch, &mtr);
 
3689
        mtr_x_lock(fil_space_get_latch(space), &mtr);
3951
3690
 
3952
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3691
        header = fsp_get_space_header(space, &mtr);
3953
3692
        node_addr = flst_get_first(header + FSP_FREE_FRAG, &mtr);
3954
3693
 
3955
3694
        mtr_commit(&mtr);
3956
3695
 
3957
3696
        while (!fil_addr_is_null(node_addr)) {
3958
3697
                mtr_start(&mtr);
3959
 
                mtr_x_lock(latch, &mtr);
 
3698
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3960
3699
 
3961
3700
                descr_count++;
3962
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3963
 
                                                node_addr, &mtr);
 
3701
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3964
3702
 
3965
3703
                ut_a(xdes_get_n_used(descr, &mtr) > 0);
3966
3704
                ut_a(xdes_get_n_used(descr, &mtr) < FSP_EXTENT_SIZE);
3974
3712
 
3975
3713
        /* Validate FSP_FULL_FRAG list */
3976
3714
        mtr_start(&mtr);
3977
 
        mtr_x_lock(latch, &mtr);
 
3715
        mtr_x_lock(fil_space_get_latch(space), &mtr);
3978
3716
 
3979
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3717
        header = fsp_get_space_header(space, &mtr);
3980
3718
        node_addr = flst_get_first(header + FSP_FULL_FRAG, &mtr);
3981
3719
 
3982
3720
        mtr_commit(&mtr);
3983
3721
 
3984
3722
        while (!fil_addr_is_null(node_addr)) {
3985
3723
                mtr_start(&mtr);
3986
 
                mtr_x_lock(latch, &mtr);
 
3724
                mtr_x_lock(fil_space_get_latch(space), &mtr);
3987
3725
 
3988
3726
                descr_count++;
3989
 
                descr = xdes_lst_get_descriptor(space, zip_size,
3990
 
                                                node_addr, &mtr);
 
3727
                descr = xdes_lst_get_descriptor(space, node_addr, &mtr);
3991
3728
 
3992
3729
                ut_a(xdes_get_n_used(descr, &mtr) == FSP_EXTENT_SIZE);
3993
3730
                ut_a(xdes_get_state(descr, &mtr) == XDES_FULL_FRAG);
3998
3735
 
3999
3736
        /* Validate segments */
4000
3737
        mtr_start(&mtr);
4001
 
        mtr_x_lock(latch, &mtr);
 
3738
        mtr_x_lock(fil_space_get_latch(space), &mtr);
4002
3739
 
4003
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3740
        header = fsp_get_space_header(space, &mtr);
4004
3741
 
4005
3742
        node_addr = flst_get_first(header + FSP_SEG_INODES_FULL, &mtr);
4006
3743
 
4010
3747
 
4011
3748
        while (!fil_addr_is_null(node_addr)) {
4012
3749
 
4013
 
                n = 0;
4014
 
                do {
 
3750
                for (n = 0; n < FSP_SEG_INODES_PER_PAGE; n++) {
 
3751
 
4015
3752
                        mtr_start(&mtr);
4016
 
                        mtr_x_lock(latch, &mtr);
 
3753
                        mtr_x_lock(fil_space_get_latch(space), &mtr);
4017
3754
 
4018
3755
                        seg_inode_page = fut_get_ptr(
4019
 
                                space, zip_size, node_addr, RW_X_LATCH, &mtr)
 
3756
                                space, node_addr, RW_X_LATCH, &mtr)
4020
3757
                                - FSEG_INODE_PAGE_NODE;
4021
3758
 
4022
3759
                        seg_inode = fsp_seg_inode_page_get_nth_inode(
4023
 
                                seg_inode_page, n, zip_size, &mtr);
4024
 
                        ut_a(!ut_dulint_is_zero(
4025
 
                                     mach_read_from_8(seg_inode + FSEG_ID)));
 
3760
                                seg_inode_page, n, &mtr);
 
3761
                        ut_a(ut_dulint_cmp(
 
3762
                                     mach_read_from_8(seg_inode + FSEG_ID),
 
3763
                                     ut_dulint_zero) != 0);
4026
3764
                        fseg_validate_low(seg_inode, &mtr);
4027
3765
 
4028
3766
                        descr_count += flst_get_len(seg_inode + FSEG_FREE,
4037
3775
                        next_node_addr = flst_get_next_addr(
4038
3776
                                seg_inode_page + FSEG_INODE_PAGE_NODE, &mtr);
4039
3777
                        mtr_commit(&mtr);
4040
 
                } while (++n < FSP_SEG_INODES_PER_PAGE(zip_size));
 
3778
                }
4041
3779
 
4042
3780
                node_addr = next_node_addr;
4043
3781
        }
4044
3782
 
4045
3783
        mtr_start(&mtr);
4046
 
        mtr_x_lock(latch, &mtr);
 
3784
        mtr_x_lock(fil_space_get_latch(space), &mtr);
4047
3785
 
4048
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3786
        header = fsp_get_space_header(space, &mtr);
4049
3787
 
4050
3788
        node_addr = flst_get_first(header + FSP_SEG_INODES_FREE, &mtr);
4051
3789
 
4055
3793
 
4056
3794
        while (!fil_addr_is_null(node_addr)) {
4057
3795
 
4058
 
                n = 0;
 
3796
                for (n = 0; n < FSP_SEG_INODES_PER_PAGE; n++) {
4059
3797
 
4060
 
                do {
4061
3798
                        mtr_start(&mtr);
4062
 
                        mtr_x_lock(latch, &mtr);
 
3799
                        mtr_x_lock(fil_space_get_latch(space), &mtr);
4063
3800
 
4064
3801
                        seg_inode_page = fut_get_ptr(
4065
 
                                space, zip_size, node_addr, RW_X_LATCH, &mtr)
 
3802
                                space, node_addr, RW_X_LATCH, &mtr)
4066
3803
                                - FSEG_INODE_PAGE_NODE;
4067
3804
 
4068
3805
                        seg_inode = fsp_seg_inode_page_get_nth_inode(
4069
 
                                seg_inode_page, n, zip_size, &mtr);
4070
 
                        if (!ut_dulint_is_zero(
4071
 
                                    mach_read_from_8(seg_inode + FSEG_ID))) {
 
3806
                                seg_inode_page, n, &mtr);
 
3807
                        if (ut_dulint_cmp(
 
3808
                                    mach_read_from_8(seg_inode + FSEG_ID),
 
3809
                                    ut_dulint_zero) != 0) {
4072
3810
                                fseg_validate_low(seg_inode, &mtr);
4073
3811
 
4074
3812
                                descr_count += flst_get_len(
4084
3822
                        next_node_addr = flst_get_next_addr(
4085
3823
                                seg_inode_page + FSEG_INODE_PAGE_NODE, &mtr);
4086
3824
                        mtr_commit(&mtr);
4087
 
                } while (++n < FSP_SEG_INODES_PER_PAGE(zip_size));
 
3825
                }
4088
3826
 
4089
3827
                node_addr = next_node_addr;
4090
3828
        }
4091
3829
 
4092
3830
        ut_a(descr_count * FSP_EXTENT_SIZE == free_limit);
4093
 
        if (!zip_size) {
4094
 
                ut_a(n_used + n_full_frag_pages
4095
 
                     == n_used2 + 2 * ((free_limit + (UNIV_PAGE_SIZE - 1))
4096
 
                                       / UNIV_PAGE_SIZE)
4097
 
                     + seg_inode_len_full + seg_inode_len_free);
4098
 
        } else {
4099
 
                ut_a(n_used + n_full_frag_pages
4100
 
                     == n_used2 + 2 * ((free_limit + (zip_size - 1))
4101
 
                                       / zip_size)
4102
 
                     + seg_inode_len_full + seg_inode_len_free);
4103
 
        }
 
3831
        ut_a(n_used + n_full_frag_pages
 
3832
             == n_used2 + 2* ((free_limit + XDES_DESCRIBED_PER_PAGE - 1)
 
3833
                              / XDES_DESCRIBED_PER_PAGE)
 
3834
             + seg_inode_len_full + seg_inode_len_free);
4104
3835
        ut_a(frag_n_used == n_used);
4105
3836
 
4106
3837
        mtr_commit(&mtr2);
4110
3841
 
4111
3842
/***********************************************************************
4112
3843
Prints info of a file space. */
4113
 
UNIV_INTERN
 
3844
 
4114
3845
void
4115
3846
fsp_print(
4116
3847
/*======*/
4119
3850
        fsp_header_t*   header;
4120
3851
        fseg_inode_t*   seg_inode;
4121
3852
        page_t*         seg_inode_page;
4122
 
        rw_lock_t*      latch;
4123
 
        ulint           flags;
4124
 
        ulint           zip_size;
4125
3853
        ulint           size;
4126
3854
        ulint           free_limit;
4127
3855
        ulint           frag_n_used;
4138
3866
        mtr_t           mtr;
4139
3867
        mtr_t           mtr2;
4140
3868
 
4141
 
        latch = fil_space_get_latch(space, &flags);
4142
 
        zip_size = dict_table_flags_to_zip_size(flags);
4143
 
 
4144
3869
        /* Start first a mini-transaction mtr2 to lock out all other threads
4145
3870
        from the fsp system */
4146
3871
 
4147
3872
        mtr_start(&mtr2);
4148
3873
 
4149
 
        mtr_x_lock(latch, &mtr2);
 
3874
        mtr_x_lock(fil_space_get_latch(space), &mtr2);
4150
3875
 
4151
3876
        mtr_start(&mtr);
4152
3877
 
4153
 
        mtr_x_lock(latch, &mtr);
 
3878
        mtr_x_lock(fil_space_get_latch(space), &mtr);
4154
3879
 
4155
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3880
        header = fsp_get_space_header(space, &mtr);
4156
3881
 
4157
3882
        size = mtr_read_ulint(header + FSP_SIZE, MLOG_4BYTES, &mtr);
4158
3883
 
4175
3900
                "not full frag extents %lu: used pages %lu,"
4176
3901
                " full frag extents %lu\n"
4177
3902
                "first seg id not used %lu %lu\n",
4178
 
                (ulong) space,
 
3903
                (long) space,
4179
3904
                (ulong) size, (ulong) free_limit, (ulong) n_free,
4180
3905
                (ulong) n_free_frag, (ulong) frag_n_used, (ulong) n_full_frag,
4181
3906
                (ulong) seg_id_high, (ulong) seg_id_low);
4185
3910
        /* Print segments */
4186
3911
 
4187
3912
        mtr_start(&mtr);
4188
 
        mtr_x_lock(latch, &mtr);
 
3913
        mtr_x_lock(fil_space_get_latch(space), &mtr);
4189
3914
 
4190
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3915
        header = fsp_get_space_header(space, &mtr);
4191
3916
 
4192
3917
        node_addr = flst_get_first(header + FSP_SEG_INODES_FULL, &mtr);
4193
3918
 
4195
3920
 
4196
3921
        while (!fil_addr_is_null(node_addr)) {
4197
3922
 
4198
 
                n = 0;
4199
 
 
4200
 
                do {
 
3923
                for (n = 0; n < FSP_SEG_INODES_PER_PAGE; n++) {
4201
3924
 
4202
3925
                        mtr_start(&mtr);
4203
 
                        mtr_x_lock(latch, &mtr);
 
3926
                        mtr_x_lock(fil_space_get_latch(space), &mtr);
4204
3927
 
4205
3928
                        seg_inode_page = fut_get_ptr(
4206
 
                                space, zip_size, node_addr, RW_X_LATCH, &mtr)
 
3929
                                space, node_addr, RW_X_LATCH, &mtr)
4207
3930
                                - FSEG_INODE_PAGE_NODE;
4208
3931
 
4209
3932
                        seg_inode = fsp_seg_inode_page_get_nth_inode(
4210
 
                                seg_inode_page, n, zip_size, &mtr);
4211
 
                        ut_a(!ut_dulint_is_zero(
4212
 
                                     mach_read_from_8(seg_inode + FSEG_ID)));
 
3933
                                seg_inode_page, n, &mtr);
 
3934
                        ut_a(ut_dulint_cmp(
 
3935
                                     mach_read_from_8(seg_inode + FSEG_ID),
 
3936
                                     ut_dulint_zero) != 0);
4213
3937
                        fseg_print_low(seg_inode, &mtr);
4214
3938
 
4215
3939
                        n_segs++;
4217
3941
                        next_node_addr = flst_get_next_addr(
4218
3942
                                seg_inode_page + FSEG_INODE_PAGE_NODE, &mtr);
4219
3943
                        mtr_commit(&mtr);
4220
 
                } while (++n < FSP_SEG_INODES_PER_PAGE(zip_size));
 
3944
                }
4221
3945
 
4222
3946
                node_addr = next_node_addr;
4223
3947
        }
4224
3948
 
4225
3949
        mtr_start(&mtr);
4226
 
        mtr_x_lock(latch, &mtr);
 
3950
        mtr_x_lock(fil_space_get_latch(space), &mtr);
4227
3951
 
4228
 
        header = fsp_get_space_header(space, zip_size, &mtr);
 
3952
        header = fsp_get_space_header(space, &mtr);
4229
3953
 
4230
3954
        node_addr = flst_get_first(header + FSP_SEG_INODES_FREE, &mtr);
4231
3955
 
4233
3957
 
4234
3958
        while (!fil_addr_is_null(node_addr)) {
4235
3959
 
4236
 
                n = 0;
4237
 
 
4238
 
                do {
 
3960
                for (n = 0; n < FSP_SEG_INODES_PER_PAGE; n++) {
4239
3961
 
4240
3962
                        mtr_start(&mtr);
4241
 
                        mtr_x_lock(latch, &mtr);
 
3963
                        mtr_x_lock(fil_space_get_latch(space), &mtr);
4242
3964
 
4243
3965
                        seg_inode_page = fut_get_ptr(
4244
 
                                space, zip_size, node_addr, RW_X_LATCH, &mtr)
 
3966
                                space, node_addr, RW_X_LATCH, &mtr)
4245
3967
                                - FSEG_INODE_PAGE_NODE;
4246
3968
 
4247
3969
                        seg_inode = fsp_seg_inode_page_get_nth_inode(
4248
 
                                seg_inode_page, n, zip_size, &mtr);
4249
 
                        if (!ut_dulint_is_zero(
4250
 
                                    mach_read_from_8(seg_inode + FSEG_ID))) {
 
3970
                                seg_inode_page, n, &mtr);
 
3971
                        if (ut_dulint_cmp(
 
3972
                                    mach_read_from_8(seg_inode + FSEG_ID),
 
3973
                                    ut_dulint_zero) != 0) {
4251
3974
 
4252
3975
                                fseg_print_low(seg_inode, &mtr);
4253
3976
                                n_segs++;
4256
3979
                        next_node_addr = flst_get_next_addr(
4257
3980
                                seg_inode_page + FSEG_INODE_PAGE_NODE, &mtr);
4258
3981
                        mtr_commit(&mtr);
4259
 
                } while (++n < FSP_SEG_INODES_PER_PAGE(zip_size));
 
3982
                }
4260
3983
 
4261
3984
                node_addr = next_node_addr;
4262
3985
        }