~akopytov/percona-xtrabackup/bug1166888-2.1

« back to all changes in this revision

Viewing changes to src/libarchive/libarchive/test/test.h

  • Committer: Alexey Kopytov
  • Date: 2012-02-10 20:05:56 UTC
  • mto: (391.1.5 staging)
  • mto: This revision was merged to the branch mainline in revision 390.
  • Revision ID: akopytov@gmail.com-20120210200556-6kx41z8wwrqfucro
Rebase of the parallel compression patch on new trunk + post-review
fixes.

Implementation of parallel compression and streaming for XtraBackup.

This revision implements the following changes:

* InnoDB files are now streamed by the xtrabackup binary rather than
innobackupex. As a result, integrity is now verified by xtrabackup and
thus tar4ibd is no longer needed, so it was removed.

* xtrabackup binary now accepts the new '--stream' option which has
exactly the same semantics as the '--stream' option in
innobackupex: it tells xtrabackup to stream all files to the standard
output in the specified format rather than storing them locally.

* The xtrabackup binary can now do parallel compression using the
quicklz library. Two new options were added to xtrabackup to support
this feature:

- '--compress' tells xtrabackup to compress all output data, including
the transaction log file and meta data files, using the specified
compression algorithm. The only currently supported algorithm is
'quicklz'. The resulting files have the qpress archive format,
i.e. every *.qp file produced by xtrabackup is essentially a one-file
qpress archive and can be extracted and uncompressed by the qpress
file archiver (http://www.quicklz.com/).

- '--compress-threads' specifies the number of worker threads used by
xtrabackup for parallel data compression. This option defaults to 1.

Parallel compression ('--compress-threads') can be used together with
parallel file copying ('--parallel'). For example, '--parallel=4
--compress --compress-threads=2' will create 4 IO threads that will
read the data and pipe it to 2 compression threads.

* To support simultaneous compression and streaming, a new custom
streaming format called 'xbstream' was introduced to XtraBackup in
addition to the 'tar' format. That was required to overcome some
limitations of traditional archive formats such as 'tar', 'cpio' and
others that do not allow streaming dynamically generated files, for
example dynamically compressed files.  Other advantages of xbstream over
traditional streaming/archive formats include ability to stream multiple
files concurrently (so it is possible to use streaming in the xbstream
format together with the --parallel option) and more compact data
storage.

* To allow streaming and extracting files to/from the xbstream format
produced by xtrabackup, a new utility aptly called 'xbstream' was
added to the XtraBackup distribution. This utility has a tar-like
interface:

- with the '-x' option it extracts files from the stream read from its
standard input to the current directory unless specified otherwise
with the '-C' option.

- with the '-c' option it streams files specified on the command line
to its standard output.

The utility also tries to minimize its impact on the OS page cache by
using the appropriate posix_fadvise() calls when available.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2003-2006 Tim Kientzle
 
3
 * All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 * 1. Redistributions of source code must retain the above copyright
 
9
 *    notice, this list of conditions and the following disclaimer.
 
10
 * 2. Redistributions in binary form must reproduce the above copyright
 
11
 *    notice, this list of conditions and the following disclaimer in the
 
12
 *    documentation and/or other materials provided with the distribution.
 
13
 *
 
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 
15
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
16
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
17
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
 
18
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
19
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
20
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
21
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
22
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
23
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
24
 *
 
25
 * $FreeBSD: head/lib/libarchive/test/test.h 201247 2009-12-30 05:59:21Z kientzle $
 
26
 */
 
27
 
 
28
/* Every test program should #include "test.h" as the first thing. */
 
29
 
 
30
/*
 
31
 * The goal of this file (and the matching test.c) is to
 
32
 * simplify the very repetitive test-*.c test programs.
 
33
 */
 
34
#if defined(HAVE_CONFIG_H)
 
35
/* Most POSIX platforms use the 'configure' script to build config.h */
 
36
#include "config.h"
 
37
#elif defined(__FreeBSD__)
 
38
/* Building as part of FreeBSD system requires a pre-built config.h. */
 
39
#include "config_freebsd.h"
 
40
#elif defined(_WIN32) && !defined(__CYGWIN__)
 
41
/* Win32 can't run the 'configure' script. */
 
42
#include "config_windows.h"
 
43
#else
 
44
/* Warn if the library hasn't been (automatically or manually) configured. */
 
45
#error Oops: No config.h and no pre-built configuration in test.h.
 
46
#endif
 
47
 
 
48
#include <sys/types.h>  /* Windows requires this before sys/stat.h */
 
49
#include <sys/stat.h>
 
50
 
 
51
#if HAVE_DIRENT_H
 
52
#include <dirent.h>
 
53
#endif
 
54
#ifdef HAVE_DIRECT_H
 
55
#include <direct.h>
 
56
#define dirent direct
 
57
#endif
 
58
#include <errno.h>
 
59
#include <fcntl.h>
 
60
#ifdef HAVE_IO_H
 
61
#include <io.h>
 
62
#endif
 
63
#ifdef HAVE_STDINT_H
 
64
#include <stdint.h>
 
65
#endif
 
66
#include <stdio.h>
 
67
#include <stdlib.h>
 
68
#include <string.h>
 
69
#include <time.h>
 
70
#ifdef HAVE_UNISTD_H
 
71
#include <unistd.h>
 
72
#endif
 
73
#include <wchar.h>
 
74
#ifdef HAVE_WINDOWS_H
 
75
#include <windows.h>
 
76
#endif
 
77
 
 
78
/*
 
79
 * System-specific tweaks.  We really want to minimize these
 
80
 * as much as possible, since they make it harder to understand
 
81
 * the mainline code.
 
82
 */
 
83
 
 
84
/* Windows (including Visual Studio and MinGW but not Cygwin) */
 
85
#if defined(_WIN32) && !defined(__CYGWIN__)
 
86
#if !defined(__BORLANDC__)
 
87
#define strdup _strdup
 
88
#endif
 
89
#define LOCALE_UTF8     NULL
 
90
#else
 
91
#define LOCALE_UTF8     "de_DE.UTF-8"
 
92
#endif
 
93
 
 
94
/* Visual Studio */
 
95
#ifdef _MSC_VER
 
96
#define snprintf        sprintf_s
 
97
#endif
 
98
 
 
99
#if defined(__BORLANDC__)
 
100
#pragma warn -8068      /* Constant out of range in comparison. */
 
101
#endif
 
102
 
 
103
/* Cygwin */
 
104
#if defined(__CYGWIN__)
 
105
/* Cygwin-1.7.x is lazy about populating nlinks, so don't
 
106
 * expect it to be accurate. */
 
107
# define NLINKS_INACCURATE_FOR_DIRS
 
108
#endif
 
109
 
 
110
/* Haiku OS */
 
111
#if defined(__HAIKU__)
 
112
/* Haiku has typedefs in stdint.h (needed for int64_t) */
 
113
#include <stdint.h>
 
114
#endif
 
115
 
 
116
/* Get a real definition for __FBSDID if we can */
 
117
#if HAVE_SYS_CDEFS_H
 
118
#include <sys/cdefs.h>
 
119
#endif
 
120
 
 
121
/* If not, define it so as to avoid dangling semicolons. */
 
122
#ifndef __FBSDID
 
123
#define __FBSDID(a)     struct _undefined_hack
 
124
#endif
 
125
 
 
126
#ifndef O_BINARY
 
127
#define O_BINARY 0
 
128
#endif
 
129
 
 
130
/*
 
131
 * Redefine DEFINE_TEST for use in defining the test functions.
 
132
 */
 
133
#undef DEFINE_TEST
 
134
#define DEFINE_TEST(name) void name(void); void name(void)
 
135
 
 
136
/* An implementation of the standard assert() macro */
 
137
#define assert(e)   assertion_assert(__FILE__, __LINE__, (e), #e, NULL)
 
138
/* chdir() and error if it fails */
 
139
#define assertChdir(path)  \
 
140
  assertion_chdir(__FILE__, __LINE__, path)
 
141
/* Assert two integers are the same.  Reports value of each one if not. */
 
142
#define assertEqualInt(v1,v2) \
 
143
  assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
 
144
/* Assert two strings are the same.  Reports value of each one if not. */
 
145
#define assertEqualString(v1,v2)   \
 
146
  assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
 
147
/* As above, but v1 and v2 are wchar_t * */
 
148
#define assertEqualWString(v1,v2)   \
 
149
  assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
 
150
/* As above, but raw blocks of bytes. */
 
151
#define assertEqualMem(v1, v2, l)       \
 
152
  assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
 
153
/* Assert two files are the same; allow printf-style expansion of second name.
 
154
 * See below for comments about variable arguments here...
 
155
 */
 
156
#define assertEqualFile         \
 
157
  assertion_setup(__FILE__, __LINE__);assertion_equal_file
 
158
/* Assert that a file is empty; supports printf-style arguments. */
 
159
#define assertEmptyFile         \
 
160
  assertion_setup(__FILE__, __LINE__);assertion_empty_file
 
161
/* Assert that a file is not empty; supports printf-style arguments. */
 
162
#define assertNonEmptyFile              \
 
163
  assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
 
164
#define assertFileAtime(pathname, sec, nsec)    \
 
165
  assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
 
166
#define assertFileAtimeRecent(pathname) \
 
167
  assertion_file_atime_recent(__FILE__, __LINE__, pathname)
 
168
#define assertFileBirthtime(pathname, sec, nsec)        \
 
169
  assertion_file_birthtime(__FILE__, __LINE__, pathname, sec, nsec)
 
170
#define assertFileBirthtimeRecent(pathname) \
 
171
  assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
 
172
/* Assert that a file exists; supports printf-style arguments. */
 
173
#define assertFileExists                \
 
174
  assertion_setup(__FILE__, __LINE__);assertion_file_exists
 
175
/* Assert that a file exists; supports printf-style arguments. */
 
176
#define assertFileNotExists             \
 
177
  assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
 
178
/* Assert that file contents match a string; supports printf-style arguments. */
 
179
#define assertFileContents             \
 
180
  assertion_setup(__FILE__, __LINE__);assertion_file_contents
 
181
#define assertFileMtime(pathname, sec, nsec)    \
 
182
  assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
 
183
#define assertFileMtimeRecent(pathname) \
 
184
  assertion_file_mtime_recent(__FILE__, __LINE__, pathname)
 
185
#define assertFileNLinks(pathname, nlinks)  \
 
186
  assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
 
187
#define assertFileSize(pathname, size)  \
 
188
  assertion_file_size(__FILE__, __LINE__, pathname, size)
 
189
#define assertTextFileContents         \
 
190
  assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
 
191
#define assertIsDir(pathname, mode)             \
 
192
  assertion_is_dir(__FILE__, __LINE__, pathname, mode)
 
193
#define assertIsHardlink(path1, path2)  \
 
194
  assertion_is_hardlink(__FILE__, __LINE__, path1, path2)
 
195
#define assertIsNotHardlink(path1, path2)       \
 
196
  assertion_is_not_hardlink(__FILE__, __LINE__, path1, path2)
 
197
#define assertIsReg(pathname, mode)             \
 
198
  assertion_is_reg(__FILE__, __LINE__, pathname, mode)
 
199
#define assertIsSymlink(pathname, contents)     \
 
200
  assertion_is_symlink(__FILE__, __LINE__, pathname, contents)
 
201
/* Create a directory, report error if it fails. */
 
202
#define assertMakeDir(dirname, mode)    \
 
203
  assertion_make_dir(__FILE__, __LINE__, dirname, mode)
 
204
#define assertMakeFile(path, mode, contents) \
 
205
  assertion_make_file(__FILE__, __LINE__, path, mode, contents)
 
206
#define assertMakeHardlink(newfile, oldfile)    \
 
207
  assertion_make_hardlink(__FILE__, __LINE__, newfile, oldfile)
 
208
#define assertMakeSymlink(newfile, linkto)      \
 
209
  assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
 
210
#define assertUmask(mask)       \
 
211
  assertion_umask(__FILE__, __LINE__, mask)
 
212
 
 
213
/*
 
214
 * This would be simple with C99 variadic macros, but I don't want to
 
215
 * require that.  Instead, I insert a function call before each
 
216
 * skipping() call to pass the file and line information down.  Crude,
 
217
 * but effective.
 
218
 */
 
219
#define skipping        \
 
220
  assertion_setup(__FILE__, __LINE__);test_skipping
 
221
 
 
222
/* Function declarations.  These are defined in test_utility.c. */
 
223
void failure(const char *fmt, ...);
 
224
int assertion_assert(const char *, int, int, const char *, void *);
 
225
int assertion_chdir(const char *, int, const char *);
 
226
int assertion_empty_file(const char *, ...);
 
227
int assertion_equal_file(const char *, const char *, ...);
 
228
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
 
229
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
 
230
int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
 
231
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
 
232
int assertion_file_atime(const char *, int, const char *, long, long);
 
233
int assertion_file_atime_recent(const char *, int, const char *);
 
234
int assertion_file_birthtime(const char *, int, const char *, long, long);
 
235
int assertion_file_birthtime_recent(const char *, int, const char *);
 
236
int assertion_file_contents(const void *, int, const char *, ...);
 
237
int assertion_file_exists(const char *, ...);
 
238
int assertion_file_mtime(const char *, int, const char *, long, long);
 
239
int assertion_file_mtime_recent(const char *, int, const char *);
 
240
int assertion_file_nlinks(const char *, int, const char *, int);
 
241
int assertion_file_not_exists(const char *, ...);
 
242
int assertion_file_size(const char *, int, const char *, long);
 
243
int assertion_is_dir(const char *, int, const char *, int);
 
244
int assertion_is_hardlink(const char *, int, const char *, const char *);
 
245
int assertion_is_not_hardlink(const char *, int, const char *, const char *);
 
246
int assertion_is_reg(const char *, int, const char *, int);
 
247
int assertion_is_symlink(const char *, int, const char *, const char *);
 
248
int assertion_make_dir(const char *, int, const char *, int);
 
249
int assertion_make_file(const char *, int, const char *, int, const char *);
 
250
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
 
251
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
 
252
int assertion_non_empty_file(const char *, ...);
 
253
int assertion_text_file_contents(const char *buff, const char *f);
 
254
int assertion_umask(const char *, int, int);
 
255
void assertion_setup(const char *, int);
 
256
 
 
257
void test_skipping(const char *fmt, ...);
 
258
 
 
259
/* Like sprintf, then system() */
 
260
int systemf(const char * fmt, ...);
 
261
 
 
262
/* Delay until time() returns a value after this. */
 
263
void sleepUntilAfter(time_t);
 
264
 
 
265
/* Return true if this platform can create symlinks. */
 
266
int canSymlink(void);
 
267
 
 
268
/* Return true if this platform can run the "gzip" program. */
 
269
int canGzip(void);
 
270
 
 
271
/* Return true if this platform can run the "gunzip" program. */
 
272
int canGunzip(void);
 
273
 
 
274
/* Suck file into string allocated via malloc(). Call free() when done. */
 
275
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
 
276
char *slurpfile(size_t *, const char *fmt, ...);
 
277
 
 
278
/* Extracts named reference file to the current directory. */
 
279
void extract_reference_file(const char *);
 
280
 
 
281
/*
 
282
 * Special interfaces for libarchive test harness.
 
283
 */
 
284
 
 
285
#include "archive.h"
 
286
#include "archive_entry.h"
 
287
 
 
288
/* Special customized read-from-memory interface. */
 
289
int read_open_memory(struct archive *, void *, size_t, size_t);
 
290
/* "2" version exercises a slightly different set of libarchive APIs. */
 
291
int read_open_memory2(struct archive *, void *, size_t, size_t);
 
292
 
 
293
/* Versions of above that accept an archive argument for additional info. */
 
294
#define assertA(e)   assertion_assert(__FILE__, __LINE__, (e), #e, (a))
 
295
#define assertEqualIntA(a,v1,v2)   \
 
296
  assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
 
297
#define assertEqualStringA(a,v1,v2)   \
 
298
  assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
 
299
 
 
300
#ifdef USE_DMALLOC
 
301
#include <dmalloc.h>
 
302
#endif