~tplavcic/percona-xtrabackup/bld-26-2.0

« back to all changes in this revision

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

  • Committer: Alexey Kopytov
  • Date: 2012-02-10 20:05:56 UTC
  • 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) 2009 Michihiro NAKAJIMA
 
3
 * Copyright (c) 2003-2006 Tim Kientzle
 
4
 * All rights reserved.
 
5
 *
 
6
 * Redistribution and use in source and binary forms, with or without
 
7
 * modification, are permitted provided that the following conditions
 
8
 * are met:
 
9
 * 1. Redistributions of source code must retain the above copyright
 
10
 *    notice, this list of conditions and the following disclaimer
 
11
 *    in this position and unchanged.
 
12
 * 2. Redistributions in binary form must reproduce the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer in the
 
14
 *    documentation and/or other materials provided with the distribution.
 
15
 *
 
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 
17
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
18
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
19
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
 
20
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
21
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
22
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
23
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
24
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
25
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
26
 *
 
27
 * $FreeBSD$
 
28
 */
 
29
 
 
30
#ifndef __LIBARCHIVE_BUILD
 
31
#error This header is only to be used internally to libarchive.
 
32
#endif
 
33
 
 
34
/*
 
35
 * TODO: A lot of stuff in here isn't actually used by libarchive and
 
36
 * can be trimmed out.  Note that this file is used by libarchive and
 
37
 * libarchive_test but nowhere else.  (But note that it gets compiled
 
38
 * with many different Windows environments, including MinGW, Visual
 
39
 * Studio, and Cygwin.  Significant changes should be tested in all three.)
 
40
 */
 
41
 
 
42
/*
 
43
 * TODO: Don't use off_t in here.  Use __int64 instead.  Note that
 
44
 * Visual Studio and the Windows SDK define off_t as 32 bits; Win32's
 
45
 * more modern file handling APIs all use __int64 instead of off_t.
 
46
 */
 
47
 
 
48
#ifndef LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED
 
49
#define LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED
 
50
 
 
51
/* Start of configuration for native Win32  */
 
52
 
 
53
#include <errno.h>
 
54
#define set_errno(val)  ((errno)=val)
 
55
#include <io.h>
 
56
#include <stdlib.h>   //brings in NULL
 
57
#if defined(HAVE_STDINT_H)
 
58
#include <stdint.h>
 
59
#endif
 
60
#include <stdio.h>
 
61
#include <fcntl.h>
 
62
#include <sys/stat.h>
 
63
#include <process.h>
 
64
#include <direct.h>
 
65
#define NOCRYPT
 
66
#include <windows.h>
 
67
//#define       EFTYPE 7
 
68
 
 
69
#if !defined(STDIN_FILENO)
 
70
#define STDIN_FILENO 0
 
71
#endif
 
72
 
 
73
#if !defined(STDOUT_FILENO)
 
74
#define STDOUT_FILENO 1
 
75
#endif
 
76
 
 
77
#if !defined(STDERR_FILENO)
 
78
#define STDERR_FILENO 2
 
79
#endif
 
80
 
 
81
 
 
82
#if defined(_MSC_VER)
 
83
/* TODO: Fix the code, don't suppress the warnings. */
 
84
#pragma warning(disable:4244)   /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */
 
85
#endif
 
86
#if defined(__BORLANDC__)
 
87
#pragma warn -8068      /* Constant out of range in comparison. */
 
88
#pragma warn -8072      /* Suspicious pointer arithmetic. */
 
89
#endif
 
90
 
 
91
#ifndef NULL
 
92
#ifdef  __cplusplus
 
93
#define NULL    0
 
94
#else
 
95
#define NULL    ((void *)0)
 
96
#endif
 
97
#endif
 
98
 
 
99
/* Alias the Windows _function to the POSIX equivalent. */
 
100
#define access          _access
 
101
#define chdir           __la_chdir
 
102
#define chmod           __la_chmod
 
103
#define close           _close
 
104
#define fcntl           __la_fcntl
 
105
#ifndef fileno
 
106
#define fileno          _fileno
 
107
#endif
 
108
#define fstat           __la_fstat
 
109
#define ftruncate       __la_ftruncate
 
110
#define futimes         __la_futimes
 
111
#define getcwd          _getcwd
 
112
#define link            __la_link
 
113
#define lseek           __la_lseek
 
114
#define lstat           __la_stat
 
115
#define mbstowcs        __la_mbstowcs
 
116
#define mkdir(d,m)      __la_mkdir(d, m)
 
117
#define mktemp          _mktemp
 
118
#define open            __la_open
 
119
#define read            __la_read
 
120
#define rmdir           __la_rmdir
 
121
#if !defined(__BORLANDC__)
 
122
#define setmode         _setmode
 
123
#endif
 
124
#define stat(path,stref)                __la_stat(path,stref)
 
125
#if !defined(__BORLANDC__)
 
126
#define strdup          _strdup
 
127
#endif
 
128
#define tzset           _tzset
 
129
#if !defined(__BORLANDC__)
 
130
#define umask           _umask
 
131
#endif
 
132
#define unlink          __la_unlink
 
133
#define utimes          __la_utimes
 
134
#define waitpid         __la_waitpid
 
135
#define write           __la_write
 
136
 
 
137
#ifndef O_RDONLY
 
138
#define O_RDONLY        _O_RDONLY
 
139
#define O_WRONLY        _O_WRONLY
 
140
#define O_TRUNC         _O_TRUNC
 
141
#define O_CREAT         _O_CREAT
 
142
#define O_EXCL          _O_EXCL
 
143
#define O_BINARY        _O_BINARY
 
144
#endif
 
145
 
 
146
#ifndef _S_IFIFO
 
147
  #define       _S_IFIFO        0010000   /* pipe */
 
148
#endif
 
149
#ifndef _S_IFCHR
 
150
  #define       _S_IFCHR        0020000   /* character special */
 
151
#endif
 
152
#ifndef _S_IFDIR
 
153
  #define       _S_IFDIR        0040000   /* directory */
 
154
#endif
 
155
#ifndef _S_IFBLK
 
156
  #define       _S_IFBLK        0060000   /* block special */
 
157
#endif
 
158
#ifndef _S_IFLNK
 
159
  #define       _S_IFLNK        0120000   /* symbolic link */
 
160
#endif
 
161
#ifndef _S_IFSOCK
 
162
  #define       _S_IFSOCK       0140000   /* socket */
 
163
#endif
 
164
#ifndef _S_IFREG
 
165
  #define       _S_IFREG        0100000   /* regular */
 
166
#endif
 
167
#ifndef _S_IFMT
 
168
  #define       _S_IFMT         0170000   /* file type mask */
 
169
#endif
 
170
 
 
171
#ifndef S_IFIFO
 
172
#define S_IFIFO     _S_IFIFO
 
173
#endif
 
174
//#define       S_IFCHR  _S_IFCHR
 
175
//#define       S_IFDIR  _S_IFDIR
 
176
#ifndef S_IFBLK
 
177
#define S_IFBLK     _S_IFBLK
 
178
#endif
 
179
#ifndef S_IFLNK
 
180
#define S_IFLNK     _S_IFLNK
 
181
#endif
 
182
#ifndef S_IFSOCK
 
183
#define S_IFSOCK    _S_IFSOCK
 
184
#endif
 
185
//#define       S_IFREG  _S_IFREG
 
186
//#define       S_IFMT   _S_IFMT
 
187
 
 
188
#ifndef S_ISBLK
 
189
#define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)     /* block special */
 
190
#define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)     /* fifo or socket */
 
191
#define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)     /* char special */
 
192
#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)     /* directory */
 
193
#define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)     /* regular file */
 
194
#endif
 
195
#define S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK) /* Symbolic link */
 
196
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) /* Socket */
 
197
 
 
198
#define _S_ISUID        0004000   /* set user id on execution */
 
199
#define _S_ISGID        0002000   /* set group id on execution */
 
200
#define _S_ISVTX        0001000   /* save swapped text even after use */
 
201
 
 
202
#define S_ISUID        _S_ISUID
 
203
#define S_ISGID        _S_ISGID
 
204
#define S_ISVTX        _S_ISVTX
 
205
 
 
206
#define _S_IRWXU             (_S_IREAD | _S_IWRITE | _S_IEXEC)
 
207
#define _S_IXUSR             _S_IEXEC  /* read permission, user */
 
208
#define _S_IWUSR             _S_IWRITE /* write permission, user */
 
209
#define _S_IRUSR             _S_IREAD  /* execute/search permission, user */
 
210
#define _S_IRWXG        (_S_IRWXU >> 3)
 
211
#define _S_IXGRP        (_S_IXUSR >> 3) /* read permission, group */
 
212
#define _S_IWGRP        (_S_IWUSR >> 3) /* write permission, group */
 
213
#define _S_IRGRP        (_S_IRUSR >> 3) /* execute/search permission, group */
 
214
#define _S_IRWXO        (_S_IRWXG >> 3) 
 
215
#define _S_IXOTH        (_S_IXGRP >> 3) /* read permission, other */
 
216
#define _S_IWOTH        (_S_IWGRP >> 3) /* write permission, other */
 
217
#define _S_IROTH        (_S_IRGRP  >> 3) /* execute/search permission, other */
 
218
 
 
219
#ifndef S_IRWXU
 
220
#define S_IRWXU      _S_IRWXU
 
221
#define S_IXUSR      _S_IXUSR
 
222
#define S_IWUSR      _S_IWUSR
 
223
#define S_IRUSR      _S_IRUSR
 
224
#endif
 
225
#define S_IRWXG        _S_IRWXG
 
226
#define S_IXGRP        _S_IXGRP
 
227
#define S_IWGRP        _S_IWGRP
 
228
#define S_IRGRP        _S_IRGRP
 
229
#define S_IRWXO        _S_IRWXO
 
230
#define S_IXOTH        _S_IXOTH
 
231
#define S_IWOTH        _S_IWOTH
 
232
#define S_IROTH        _S_IROTH
 
233
 
 
234
#define F_DUPFD         0       /* Duplicate file descriptor.  */
 
235
#define F_GETFD         1       /* Get file descriptor flags.  */
 
236
#define F_SETFD         2       /* Set file descriptor flags.  */
 
237
#define F_GETFL         3       /* Get file status flags.  */
 
238
#define F_SETFL         4       /* Set file status flags.  */
 
239
#define F_GETOWN                5       /* Get owner (receiver of SIGIO).  */
 
240
#define F_SETOWN                6       /* Set owner (receiver of SIGIO).  */
 
241
#define F_GETLK         7       /* Get record locking info.  */
 
242
#define F_SETLK         8       /* Set record locking info (non-blocking).  */
 
243
#define F_SETLKW                9       /* Set record locking info (blocking).  */
 
244
 
 
245
/* XXX missing */
 
246
#define F_GETLK64       7       /* Get record locking info.  */
 
247
#define F_SETLK64       8       /* Set record locking info (non-blocking).  */
 
248
#define F_SETLKW64      9       /* Set record locking info (blocking).  */
 
249
 
 
250
/* File descriptor flags used with F_GETFD and F_SETFD.  */
 
251
#define FD_CLOEXEC      1       /* Close on exec.  */
 
252
 
 
253
//NOT SURE IF O_NONBLOCK is OK here but at least the 0x0004 flag is not used by anything else...
 
254
#define O_NONBLOCK 0x0004 /* Non-blocking I/O.  */
 
255
//#define       O_NDELAY   O_NONBLOCK
 
256
 
 
257
/* Symbolic constants for the access() function */
 
258
#if !defined(F_OK)
 
259
    #define     R_OK    4       /*  Test for read permission    */
 
260
    #define     W_OK    2       /*  Test for write permission   */
 
261
    #define     X_OK    1       /*  Test for execute permission */
 
262
    #define     F_OK    0       /*  Test for existence of file  */
 
263
#endif
 
264
 
 
265
 
 
266
#ifdef _LARGEFILE_SOURCE
 
267
# define __USE_LARGEFILE 1              /* declare fseeko and ftello */
 
268
#endif
 
269
 
 
270
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
 
271
# define __USE_FILE_OFFSET64  1 /* replace 32-bit functions by 64-bit ones */
 
272
#endif
 
273
 
 
274
#if __USE_LARGEFILE && __USE_FILE_OFFSET64
 
275
/* replace stat and seek by their large-file equivalents */
 
276
#undef  stat
 
277
#define stat            _stati64
 
278
 
 
279
#undef  lseek
 
280
#define lseek       _lseeki64
 
281
#define lseek64     _lseeki64
 
282
#define tell        _telli64
 
283
#define tell64      _telli64
 
284
 
 
285
#ifdef __MINGW32__
 
286
# define fseek      fseeko64
 
287
# define fseeko     fseeko64
 
288
# define ftell      ftello64
 
289
# define ftello     ftello64
 
290
# define ftell64    ftello64
 
291
#endif /* __MINGW32__ */
 
292
#endif /* LARGE_FILES */
 
293
 
 
294
#ifdef USE_WINSOCK_TIMEVAL
 
295
/* Winsock timeval has long size tv_sec. */
 
296
#define __timeval timeval
 
297
#else
 
298
struct _timeval64i32 {
 
299
        time_t          tv_sec;
 
300
        long            tv_usec;
 
301
};
 
302
#define __timeval _timeval64i32
 
303
#endif
 
304
 
 
305
/* End of Win32 definitions. */
 
306
 
 
307
/* Tell libarchive code that we have simulations for these. */
 
308
#ifndef HAVE_FTRUNCATE
 
309
#define HAVE_FTRUNCATE 1
 
310
#endif
 
311
#ifndef HAVE_FUTIMES
 
312
#define HAVE_FUTIMES 1
 
313
#endif
 
314
#ifndef HAVE_UTIMES
 
315
#define HAVE_UTIMES 1
 
316
#endif
 
317
#ifndef HAVE_LINK
 
318
#define HAVE_LINK 1
 
319
#endif
 
320
 
 
321
/* Replacement POSIX function */
 
322
extern int       __la_chdir(const char *path);
 
323
extern int       __la_chmod(const char *path, mode_t mode);
 
324
extern int       __la_fcntl(int fd, int cmd, int val);
 
325
extern int       __la_fstat(int fd, struct stat *st);
 
326
extern int       __la_ftruncate(int fd, off_t length);
 
327
extern int       __la_futimes(int fd, const struct __timeval *times);
 
328
extern int       __la_link(const char *src, const char *dst);
 
329
extern __int64   __la_lseek(int fd, __int64 offset, int whence);
 
330
extern size_t    __la_mbstowcs(wchar_t *wcstr, const char *mbstr, size_t nwchars);
 
331
extern int       __la_mkdir(const char *path, mode_t mode);
 
332
extern int       __la_open(const char *path, int flags, ...);
 
333
extern ssize_t   __la_read(int fd, void *buf, size_t nbytes);
 
334
extern int       __la_rmdir(const char *path);
 
335
extern int       __la_stat(const char *path, struct stat *st);
 
336
extern int       __la_unlink(const char *path);
 
337
extern int       __la_utimes(const char *name, const struct __timeval *times);
 
338
extern pid_t     __la_waitpid(pid_t wpid, int *status, int option);
 
339
extern ssize_t   __la_write(int fd, const void *buf, size_t nbytes);
 
340
 
 
341
#define _stat64i32(path, st)    __la_stat(path, st)
 
342
#define _stat64(path, st)       __la_stat(path, st)
 
343
/* for status returned by la_waitpid */
 
344
#define WIFEXITED(sts)          ((sts & 0x100) == 0)
 
345
#define WEXITSTATUS(sts)        (sts & 0x0FF)
 
346
 
 
347
#endif /* LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED */