diff options
Diffstat (limited to 'src/third_party/wiredtiger/test/format/format.h')
-rw-r--r-- | src/third_party/wiredtiger/test/format/format.h | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/test/format/format.h b/src/third_party/wiredtiger/test/format/format.h new file mode 100644 index 00000000000..bf4d1c0a277 --- /dev/null +++ b/src/third_party/wiredtiger/test/format/format.h @@ -0,0 +1,355 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include <sys/stat.h> +#ifndef _WIN32 +#include <sys/time.h> +#endif +#include <sys/types.h> + +#include <assert.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <inttypes.h> +#include <limits.h> +#ifndef _WIN32 +#include <pthread.h> +#endif +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#ifndef _WIN32 +#include <unistd.h> +#endif +#include <time.h> + +#include "test_util.i" + +#ifdef BDB +#include <db.h> +#endif + +#if defined(__GNUC__) +#define WT_GCC_ATTRIBUTE(x) __attribute__(x) +#else +#define WT_GCC_ATTRIBUTE(x) +#endif + +#define EXTPATH "../../ext/" /* Extensions path */ + +#define BZIP_PATH \ + EXTPATH "compressors/bzip2/.libs/libwiredtiger_bzip2.so" +#define LZ4_PATH \ + EXTPATH "compressors/lz4/.libs/libwiredtiger_lz4.so" +#define SNAPPY_PATH \ + EXTPATH "compressors/snappy/.libs/libwiredtiger_snappy.so" +#define ZLIB_PATH \ + EXTPATH "compressors/zlib/.libs/libwiredtiger_zlib.so" + +#define REVERSE_PATH \ + EXTPATH "collators/reverse/.libs/libwiredtiger_reverse_collator.so" + +#define ROTN_PATH \ + EXTPATH "encryptors/rotn/.libs/libwiredtiger_rotn.so" + +#define KVS_BDB_PATH \ + EXTPATH "test/kvs_bdb/.libs/libwiredtiger_kvs_bdb.so" +#define HELIUM_PATH \ + EXTPATH "datasources/helium/.libs/libwiredtiger_helium.so" + +#define LZO_PATH ".libs/lzo_compress.so" + +#undef M +#define M(v) ((v) * 1000000) /* Million */ +#undef KILOBYTE +#define KILOBYTE(v) ((v) * 1024) +#undef MEGABYTE +#define MEGABYTE(v) ((v) * 1048576) + +#define WT_NAME "wt" /* Object name */ + +#define DATASOURCE(v) (strcmp(v, g.c_data_source) == 0 ? 1 : 0) +#define SINGLETHREADED (g.c_threads == 1) + +#define FORMAT_OPERATION_REPS 3 /* 3 thread operations sets */ + +#ifndef _WIN32 +#define SIZET_FMT "%zu" /* size_t format string */ +#else +#define SIZET_FMT "%Iu" /* size_t format string */ +#endif + +typedef struct { + char *progname; /* Program name */ + + char *home; /* Home directory */ + char *home_backup; /* Hot-backup directory */ + char *home_backup_init; /* Initialize backup command */ + char *home_bdb; /* BDB directory */ + char *home_config; /* Run CONFIG file path */ + char *home_init; /* Initialize home command */ + char *home_log; /* Operation log file path */ + char *home_rand; /* RNG log file path */ + char *home_salvage_copy; /* Salvage copy command */ + char *home_stats; /* Statistics file path */ + + char *helium_mount; /* Helium volume */ + + char wiredtiger_open_config[8 * 1024]; /* Database open config */ + +#ifdef HAVE_BERKELEY_DB + void *bdb; /* BDB comparison handle */ + void *dbc; /* BDB cursor handle */ +#endif + + WT_CONNECTION *wts_conn; + WT_EXTENSION_API *wt_api; + + int rand_log_stop; /* Logging turned off */ + FILE *randfp; /* Random number log */ + + uint32_t run_cnt; /* Run counter */ + + enum { + LOG_FILE=1, /* Use a log file */ + LOG_OPS=2 /* Log all operations */ + } logging; + FILE *logfp; /* Log file */ + + int replay; /* Replaying a run. */ + int track; /* Track progress */ + int workers_finished; /* Operations completed */ + + pthread_rwlock_t backup_lock; /* Hot backup running */ + + WT_RAND_STATE rnd; /* Global RNG state */ + + /* + * We have a list of records that are appended, but not yet "resolved", + * that is, we haven't yet incremented the g.rows value to reflect the + * new records. + */ + uint64_t *append; /* Appended records */ + size_t append_max; /* Maximum unresolved records */ + size_t append_cnt; /* Current unresolved records */ + pthread_rwlock_t append_lock; /* Single-thread resolution */ + + pthread_rwlock_t death_lock; /* Single-thread failure */ + + char *uri; /* Object name */ + + char *config_open; /* Command-line configuration */ + + uint32_t c_abort; /* Config values */ + uint32_t c_auto_throttle; + uint32_t c_backups; + uint32_t c_bitcnt; + uint32_t c_bloom; + uint32_t c_bloom_bit_count; + uint32_t c_bloom_hash_count; + uint32_t c_bloom_oldest; + uint32_t c_cache; + uint32_t c_compact; + uint32_t c_checkpoints; + char *c_checksum; + uint32_t c_chunk_size; + char *c_compression; + char *c_encryption; + char *c_config_open; + uint32_t c_data_extend; + char *c_data_source; + uint32_t c_delete_pct; + uint32_t c_dictionary; + uint32_t c_direct_io; + uint32_t c_evict_max; + uint32_t c_firstfit; + char *c_file_type; + uint32_t c_huffman_key; + uint32_t c_huffman_value; + uint32_t c_in_memory; + uint32_t c_insert_pct; + uint32_t c_internal_key_truncation; + uint32_t c_intl_page_max; + char *c_isolation; + uint32_t c_key_gap; + uint32_t c_key_max; + uint32_t c_key_min; + uint32_t c_leaf_page_max; + uint32_t c_leak_memory; + uint32_t c_logging; + uint32_t c_logging_archive; + char *c_logging_compression; + uint32_t c_logging_prealloc; + uint32_t c_long_running_txn; + uint32_t c_lsm_worker_threads; + uint32_t c_merge_max; + uint32_t c_mmap; + uint32_t c_ops; + uint32_t c_prefix_compression; + uint32_t c_prefix_compression_min; + uint32_t c_repeat_data_pct; + uint32_t c_reverse; + uint32_t c_rows; + uint32_t c_runs; + uint32_t c_rebalance; + uint32_t c_salvage; + uint32_t c_split_pct; + uint32_t c_statistics; + uint32_t c_statistics_server; + uint32_t c_threads; + uint32_t c_timer; + uint32_t c_value_max; + uint32_t c_value_min; + uint32_t c_verify; + uint32_t c_write_pct; + +#define FIX 1 +#define ROW 2 +#define VAR 3 + u_int type; /* File type's flag value */ + +#define CHECKSUM_OFF 1 +#define CHECKSUM_ON 2 +#define CHECKSUM_UNCOMPRESSED 3 + u_int c_checksum_flag; /* Checksum flag value */ + +#define COMPRESS_NONE 1 +#define COMPRESS_BZIP 2 +#define COMPRESS_BZIP_RAW 3 +#define COMPRESS_LZ4 4 +#define COMPRESS_LZ4_NO_RAW 5 +#define COMPRESS_LZO 6 +#define COMPRESS_SNAPPY 7 +#define COMPRESS_ZLIB 8 +#define COMPRESS_ZLIB_NO_RAW 9 + u_int c_compression_flag; /* Compression flag value */ + u_int c_logging_compression_flag; /* Log compression flag value */ + +#define ENCRYPT_NONE 1 +#define ENCRYPT_ROTN_7 2 + u_int c_encryption_flag; /* Encryption flag value */ + +#define ISOLATION_RANDOM 1 +#define ISOLATION_READ_UNCOMMITTED 2 +#define ISOLATION_READ_COMMITTED 3 +#define ISOLATION_SNAPSHOT 4 + u_int c_isolation_flag; /* Isolation flag value */ + + uint64_t key_cnt; /* Keys loaded so far */ + uint64_t rows; /* Total rows */ + + uint32_t key_rand_len[1031]; /* Key lengths */ +} GLOBAL; +extern GLOBAL g; + +typedef struct { + WT_RAND_STATE rnd; /* thread RNG state */ + + uint64_t search; /* operations */ + uint64_t insert; + uint64_t update; + uint64_t remove; + uint64_t ops; + + uint64_t commit; /* transaction resolution */ + uint64_t rollback; + uint64_t deadlock; + + int id; /* simple thread ID */ + pthread_t tid; /* thread ID */ + + int quit; /* thread should quit */ + +#define TINFO_RUNNING 1 /* Running */ +#define TINFO_COMPLETE 2 /* Finished */ +#define TINFO_JOINED 3 /* Resolved */ + volatile int state; /* state */ +} TINFO WT_GCC_ATTRIBUTE((aligned(WT_CACHE_LINE_ALIGNMENT))); + +#ifdef HAVE_BERKELEY_DB +void bdb_close(void); +void bdb_insert(const void *, size_t, const void *, size_t); +void bdb_np(int, void *, size_t *, void *, size_t *, int *); +void bdb_open(void); +void bdb_read(uint64_t, void *, size_t *, int *); +void bdb_remove(uint64_t, int *); +void bdb_update(const void *, size_t, const void *, size_t, int *); +#endif + +void *backup(void *); +void *compact(void *); +void config_clear(void); +void config_error(void); +void config_file(const char *); +void config_print(int); +void config_setup(void); +void config_single(const char *, int); +void *dmalloc(size_t); +char *dstrdup(const char *); +void fclose_and_clear(FILE **); +void key_gen(uint8_t *, size_t *, uint64_t); +void key_gen_insert(WT_RAND_STATE *, uint8_t *, size_t *, uint64_t); +void key_gen_setup(uint8_t **); +void key_len_setup(void); +void *lrt(void *); +void path_setup(const char *); +int read_row(WT_CURSOR *, WT_ITEM *, uint64_t, int); +uint32_t rng(WT_RAND_STATE *); +void track(const char *, uint64_t, TINFO *); +void val_gen(WT_RAND_STATE *, uint8_t *, size_t *, uint64_t); +void val_gen_setup(WT_RAND_STATE *, uint8_t **); +void wts_close(void); +void wts_create(void); +void wts_dump(const char *, int); +void wts_load(void); +void wts_open(const char *, int, WT_CONNECTION **); +void wts_ops(int); +void wts_read_scan(void); +void wts_rebalance(void); +void wts_reopen(void); +void wts_salvage(void); +void wts_stats(void); +void wts_verify(const char *); + +void die(int, const char *, ...) +#if defined(__GNUC__) +__attribute__((__noreturn__)) +#endif +; + +/* + * mmrand -- + * Return a random value between a min/max pair. + */ +static inline uint32_t +mmrand(WT_RAND_STATE *rnd, u_int min, u_int max) +{ + return (rng(rnd) % (((max) + 1) - (min)) + (min)); +} |