~thomir-deactivatedaccount/drizzle/drizzle-fix-bug653747

« back to all changes in this revision

Viewing changes to plugin/innobase/fil/fil0fil.c

  • Committer: Brian Aker
  • Date: 2010-10-10 02:07:52 UTC
  • mfrom: (1827.2.3 staging)
  • Revision ID: brian@tangent.org-20101010020752-ktv73isay5dxtvp3
Merge in switch on table_share_instance inheritance.

Show diffs side-by-side

added added

removed removed

Lines of Context:
321
321
/*=======================*/
322
322
        const char*     name);  /*!< in: table name in the standard
323
323
                                'databasename/tablename' format */
324
 
/*******************************************************************//**
325
 
Frees a space object from the tablespace memory cache. Closes the files in
326
 
the chain but does not delete them. There must not be any pending i/o's or
327
 
flushes on the files. */
328
 
static
329
 
ibool
330
 
fil_space_free(
331
 
/*===========*/
332
 
                                /* out: TRUE if success */
333
 
        ulint           id,     /* in: space id */
334
 
        ibool           own_mutex);/* in: TRUE if own system->mutex */
335
324
/********************************************************************//**
336
325
Reads data from a space to a buffer. Remember that the possible incomplete
337
326
blocks at the end of file are ignored: they are not taken into account when
605
594
 
606
595
        UT_LIST_ADD_LAST(chain, space->chain, node);
607
596
 
608
 
        if (id < SRV_LOG_SPACE_FIRST_ID && fil_system->max_assigned_id < id) {
609
 
 
610
 
                fil_system->max_assigned_id = id;
611
 
        }
612
 
 
613
597
        mutex_exit(&fil_system->mutex);
614
598
}
615
599
 
629
613
        ulint           size_high;
630
614
        ibool           ret;
631
615
        ibool           success;
 
616
#ifndef UNIV_HOTBACKUP
632
617
        byte*           buf2;
633
618
        byte*           page;
634
619
        ulint           space_id;
635
620
        ulint           flags;
 
621
#endif /* !UNIV_HOTBACKUP */
636
622
 
637
623
        ut_ad(mutex_own(&(system->mutex)));
638
624
        ut_a(node->n_pending == 0);
668
654
                size_bytes = (((ib_int64_t)size_high) << 32)
669
655
                        + (ib_int64_t)size_low;
670
656
#ifdef UNIV_HOTBACKUP
671
 
                if (space->id == 0) {
672
 
                        node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE);
673
 
                        os_file_close(node->handle);
674
 
                        goto add_size;
675
 
                }
676
 
#endif /* UNIV_HOTBACKUP */
 
657
                node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE);
 
658
                /* TODO: adjust to zip_size, like below? */
 
659
#else
677
660
                ut_a(space->purpose != FIL_LOG);
678
661
                ut_a(space->id != 0);
679
662
 
752
735
                                (size_bytes
753
736
                                 / dict_table_flags_to_zip_size(flags));
754
737
                }
755
 
 
756
 
#ifdef UNIV_HOTBACKUP
757
 
add_size:
758
 
#endif /* UNIV_HOTBACKUP */
 
738
#endif
759
739
                space->size += node->size;
760
740
        }
761
741
 
975
955
                        " while the maximum\n"
976
956
                        "InnoDB: allowed value would be %lu.\n"
977
957
                        "InnoDB: You may need to raise the value of"
978
 
                        " innodb_open_files in\n"
 
958
                        " innodb_max_files_open in\n"
979
959
                        "InnoDB: my.cnf.\n",
980
960
                        (ulong) fil_system->n_open,
981
961
                        (ulong) fil_system->max_n_open);
1101
1081
        ROW_FORMAT=REDUNDANT (table->flags == 0).  For any other
1102
1082
        format, the tablespace flags should equal table->flags. */
1103
1083
        ut_a(flags != DICT_TF_COMPACT);
1104
 
        ut_a(!(flags & (~0UL << DICT_TF_BITS)));
1105
1084
 
1106
1085
try_again:
1107
1086
        /*printf(
1156
1135
 
1157
1136
                mutex_exit(&fil_system->mutex);
1158
1137
 
1159
 
                fil_space_free(namesake_id, FALSE);
 
1138
                fil_space_free(namesake_id);
1160
1139
 
1161
1140
                goto try_again;
1162
1141
        }
1281
1260
the chain but does not delete them. There must not be any pending i/o's or
1282
1261
flushes on the files.
1283
1262
@return TRUE if success */
1284
 
static
 
1263
UNIV_INTERN
1285
1264
ibool
1286
1265
fil_space_free(
1287
1266
/*===========*/
1288
 
                                        /* out: TRUE if success */
1289
 
        ulint           id,             /* in: space id */
1290
 
        ibool           own_mutex)      /* in: TRUE if own system->mutex */
 
1267
        ulint   id)     /*!< in: space id */
1291
1268
{
1292
1269
        fil_space_t*    space;
1293
1270
        fil_space_t*    namespace;
1294
1271
        fil_node_t*     fil_node;
1295
1272
 
1296
 
        if (!own_mutex) {
1297
 
                mutex_enter(&fil_system->mutex);
1298
 
        }
 
1273
        mutex_enter(&fil_system->mutex);
1299
1274
 
1300
1275
        space = fil_space_get_by_id(id);
1301
1276
 
1342
1317
 
1343
1318
        ut_a(0 == UT_LIST_GET_LEN(space->chain));
1344
1319
 
1345
 
        if (!own_mutex) {
1346
 
                mutex_exit(&fil_system->mutex);
1347
 
        }
 
1320
        mutex_exit(&fil_system->mutex);
1348
1321
 
1349
1322
        rw_lock_free(&(space->latch));
1350
1323
 
1562
1535
                                        fprintf(stderr,
1563
1536
                                                "InnoDB: Warning: you must"
1564
1537
                                                " raise the value of"
1565
 
                                                " innodb_open_files in\n"
 
1538
                                                " innodb_max_open_files in\n"
1566
1539
                                                "InnoDB: my.cnf! Remember that"
1567
1540
                                                " InnoDB keeps all log files"
1568
1541
                                                " and all system\n"
1604
1577
        space = UT_LIST_GET_FIRST(fil_system->space_list);
1605
1578
 
1606
1579
        while (space != NULL) {
1607
 
                fil_space_t*    prev_space = space;
1608
 
 
1609
1580
                node = UT_LIST_GET_FIRST(space->chain);
1610
1581
 
1611
1582
                while (node != NULL) {
1615
1586
                        node = UT_LIST_GET_NEXT(chain, node);
1616
1587
                }
1617
1588
                space = UT_LIST_GET_NEXT(space_list, space);
1618
 
                fil_space_free(prev_space->id, TRUE);
1619
1589
        }
1620
1590
 
1621
1591
        mutex_exit(&fil_system->mutex);
2247
2217
#endif
2248
2218
        /* printf("Deleting tablespace %s id %lu\n", space->name, id); */
2249
2219
 
2250
 
        success = fil_space_free(id, FALSE);
 
2220
        success = fil_space_free(id);
2251
2221
 
2252
2222
        if (success) {
2253
2223
                success = os_file_delete(path);
2587
2557
        ROW_FORMAT=REDUNDANT (table->flags == 0).  For any other
2588
2558
        format, the tablespace flags should equal table->flags. */
2589
2559
        ut_a(flags != DICT_TF_COMPACT);
2590
 
        ut_a(!(flags & (~0UL << DICT_TF_BITS)));
2591
2560
 
2592
2561
        path = fil_make_ibd_name(tablename, is_temp);
2593
2562
 
2954
2923
        byte*           page;
2955
2924
        ulint           space_id;
2956
2925
        ulint           space_flags;
 
2926
        ibool           ret             = TRUE;
2957
2927
 
2958
2928
        filepath = fil_make_ibd_name(name, FALSE);
2959
2929
 
2960
2930
        /* The tablespace flags (FSP_SPACE_FLAGS) should be 0 for
2961
2931
        ROW_FORMAT=COMPACT (table->flags == DICT_TF_COMPACT) and
2962
2932
        ROW_FORMAT=REDUNDANT (table->flags == 0).  For any other
2963
 
        format, the tablespace flags should be equal to
2964
 
        table->flags & ~(~0 << DICT_TF_BITS). */
 
2933
        format, the tablespace flags should equal table->flags. */
2965
2934
        ut_a(flags != DICT_TF_COMPACT);
2966
 
        ut_a(!(flags & (~0UL << DICT_TF_BITS)));
2967
2935
 
2968
2936
        file = os_file_create_simple_no_error_handling(
2969
2937
                filepath, OS_FILE_OPEN, OS_FILE_READ_ONLY, &success);
3015
2983
 
3016
2984
        ut_free(buf2);
3017
2985
 
3018
 
        if (UNIV_UNLIKELY(space_id != id
3019
 
                          || space_flags != (flags & ~(~0 << DICT_TF_BITS)))) {
 
2986
        if (UNIV_UNLIKELY(space_id != id || space_flags != flags)) {
3020
2987
                ut_print_timestamp(stderr);
3021
2988
 
3022
2989
                fputs("  InnoDB: Error: tablespace id and flags in file ",
3034
3001
                        (ulong) space_id, (ulong) space_flags,
3035
3002
                        (ulong) id, (ulong) flags);
3036
3003
 
3037
 
                success = FALSE;
 
3004
                ret = FALSE;
3038
3005
 
3039
3006
                goto func_exit;
3040
3007
        }
3054
3021
        os_file_close(file);
3055
3022
        mem_free(filepath);
3056
3023
 
3057
 
        return(success);
 
3024
        return(ret);
3058
3025
}
3059
3026
#endif /* !UNIV_HOTBACKUP */
3060
3027
 
3270
3237
                fprintf(stderr,
3271
3238
                        "InnoDB: Renaming tablespace %s of id %lu,\n"
3272
3239
                        "InnoDB: to %s_ibbackup_old_vers_<timestamp>\n"
3273
 
                        "InnoDB: because its size %" PRId64 " is too small"
 
3240
                        "InnoDB: because its size %lld is too small"
3274
3241
                        " (< 4 pages 16 kB each),\n"
3275
3242
                        "InnoDB: or the space id in the file header"
3276
3243
                        " is not sensible.\n"
3332
3299
 
3333
3300
        if (!success) {
3334
3301
 
3335
 
                if (srv_force_recovery > 0) {
3336
 
                        fprintf(stderr,
3337
 
                                "InnoDB: innodb_force_recovery"
3338
 
                                " was set to %lu. Continuing crash recovery\n"
3339
 
                                "InnoDB: even though the tablespace creation"
3340
 
                                " of this table failed.\n",
3341
 
                                srv_force_recovery);
3342
 
                        goto func_exit;
3343
 
                }
3344
 
 
3345
 
                exit(1);
 
3302
                goto func_exit;
3346
3303
        }
3347
3304
 
3348
3305
        /* We do not use the size information we have about the file, because
4778
4735
 
4779
4736
        return(mach_read_from_2(page + FIL_PAGE_TYPE));
4780
4737
}
4781
 
 
4782
 
/********************************************************************
4783
 
Initializes the tablespace memory cache. */
4784
 
UNIV_INTERN
4785
 
void
4786
 
fil_close(void)
4787
 
/*===========*/
4788
 
{
4789
 
        /* The mutex should already have been freed. */
4790
 
        ut_ad(fil_system->mutex.magic_n == 0);
4791
 
 
4792
 
        hash_table_free(fil_system->spaces);
4793
 
 
4794
 
        hash_table_free(fil_system->name_hash);
4795
 
 
4796
 
        ut_a(UT_LIST_GET_LEN(fil_system->LRU) == 0);
4797
 
        ut_a(UT_LIST_GET_LEN(fil_system->unflushed_spaces) == 0);
4798
 
        ut_a(UT_LIST_GET_LEN(fil_system->space_list) == 0);
4799
 
 
4800
 
        mem_free(fil_system);
4801
 
 
4802
 
        fil_system = NULL;
4803
 
}