summaryrefslogtreecommitdiff
path: root/storage/tokudb/PerconaFT/src/ydb_env_func.cc
blob: cd5388106ac02d5e558910b61c8adaa675dd5940 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
#ident "$Id$"
/*======
This file is part of PerconaFT.


Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.

    PerconaFT is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2,
    as published by the Free Software Foundation.

    PerconaFT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with PerconaFT.  If not, see <http://www.gnu.org/licenses/>.

----------------------------------------

    PerconaFT is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License, version 3,
    as published by the Free Software Foundation.

    PerconaFT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with PerconaFT.  If not, see <http://www.gnu.org/licenses/>.
======= */

#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved."

#include <my_global.h>
#include <toku_portability.h>

#include <memory.h>
#include <db.h>

#include <ft/cachetable/checkpoint.h>
#include <ft/ft.h>
#include <ft/ft-ops.h>
#include <ft/ft-flusher.h>
#include <ft/logger/recover.h>
#include <ft/loader/loader.h>

#include "ydb_env_func.h"

// For test purposes only.
// These callbacks are never used in production code, only as a way to test the system
// (for example, by causing crashes at predictable times).
void (*checkpoint_callback_f)(void*) = NULL;
void * checkpoint_callback_extra     = NULL;
void (*checkpoint_callback2_f)(void*) = NULL;
void * checkpoint_callback2_extra     = NULL;

bool engine_status_enable = true; // if false, suppress engine status output on failed assert, for test programs only

void db_env_set_direct_io (bool direct_io_on) {
    toku_ft_set_direct_io(direct_io_on);
}

void db_env_set_compress_buffers_before_eviction (bool compress_buffers) {
    toku_ft_set_compress_buffers_before_eviction(compress_buffers);
}

void db_env_set_func_fsync (int (*fsync_function)(int)) {
    toku_set_func_fsync(fsync_function);
}

void db_env_set_func_pwrite (ssize_t (*pwrite_function)(int, const void *, size_t, toku_off_t)) {
    toku_set_func_pwrite(pwrite_function);
}

void db_env_set_func_full_pwrite (ssize_t (*pwrite_function)(int, const void *, size_t, toku_off_t)) {
    toku_set_func_full_pwrite(pwrite_function);
}

void db_env_set_func_write (ssize_t (*write_function)(int, const void *, size_t)) {
    toku_set_func_write(write_function);
}

void db_env_set_func_full_write (ssize_t (*write_function)(int, const void *, size_t)) {
    toku_set_func_full_write(write_function);
}

void db_env_set_func_fdopen (FILE * (*fdopen_function)(int, const char *)) {
    toku_set_func_fdopen(fdopen_function);
}

void db_env_set_func_fopen (FILE * (*fopen_function)(const char *, const char *)) {
    toku_set_func_fopen(fopen_function);
}

void db_env_set_func_open (int (*open_function)(const char *, int, int)) {
    toku_set_func_open(open_function);
}

void db_env_set_func_fclose (int (*fclose_function)(FILE*)) {
    toku_set_func_fclose(fclose_function);
}

void db_env_set_func_pread (ssize_t (*fun)(int, void *, size_t, off_t)) {
    toku_set_func_pread(fun);
}

void db_env_set_func_loader_fwrite (size_t (*fwrite_fun)(const void*,size_t,size_t,FILE*)) {
    ft_loader_set_os_fwrite(fwrite_fun);
}

void db_env_set_func_malloc (void *(*f)(size_t)) {
    toku_set_func_malloc(f);
}

void db_env_set_func_realloc (void *(*f)(void*, size_t)) {
    toku_set_func_realloc(f);
}

void db_env_set_func_free (void (*f)(void*)) {
    toku_set_func_free(f);
}

// For test purposes only.
// With this interface, all checkpoint users get the same callbacks and the same extras.
void 
db_env_set_checkpoint_callback (void (*callback_f)(void*), void* extra) {
    toku_checkpoint_safe_client_lock();
    checkpoint_callback_f = callback_f;
    checkpoint_callback_extra = extra;
    toku_checkpoint_safe_client_unlock();
}

void 
db_env_set_checkpoint_callback2 (void (*callback_f)(void*), void* extra) {
    toku_checkpoint_safe_client_lock();
    checkpoint_callback2_f = callback_f;
    checkpoint_callback2_extra = extra;
    toku_checkpoint_safe_client_unlock();
}

void 
db_env_set_recover_callback (void (*callback_f)(void*), void* extra) {
    toku_recover_set_callback(callback_f, extra);
}

void 
db_env_set_recover_callback2 (void (*callback_f)(void*), void* extra) {
    toku_recover_set_callback2(callback_f, extra);
}

void 
db_env_set_flusher_thread_callback(void (*callback_f)(int, void*), void* extra) {
    toku_flusher_thread_set_callback(callback_f, extra);
}

void 
db_env_set_loader_size_factor (uint32_t factor) {
    toku_ft_loader_set_size_factor(factor);
}

void 
db_env_set_mvcc_garbage_collection_verification(uint32_t verification_mode) {
    garbage_collection_debug = (verification_mode != 0);
}

// Purpose: allow test programs that expect to fail to suppress engine status output on failed assert.
void
db_env_enable_engine_status(bool enable) {
    engine_status_enable = enable;
}

void
db_env_set_num_bucket_mutexes(uint32_t num_mutexes) {
    toku_pair_list_set_lock_size(num_mutexes);
}

void db_env_try_gdb_stack_trace(const char *gdb_path) {
    toku_try_gdb_stack_trace(gdb_path);
}