| Current File : //usr/include/libshadowfs_impl.h |
/*
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _LIBSHADOWFS_IMPL_H
#define _LIBSHADOWFS_IMPL_H
#include <sys/types.h>
#include <sys/list.h>
#include <libzfs.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Shadow conspiracy SMF parameters */
#define CONFIG_PARAMS "config_params"
#define WORKER_THREADS "shadow_threads"
#define WORK_TIMEOUT "shadow_worker_timeout"
#define MOUNT_TIMEOUT "shadow_mount_timeout"
#define MOUNT_RETRY "shadow_mount_retry"
#define MOUNT_MAX_RETRY "shadow_mount_max_retry"
#define MOUNT_FREQ "shadow_mount_freq"
#define FAIL_THROTTLE "shadow_throttle"
#define DEBUG_FILE "shadow_debug"
#define MIGRATE_TIMEOUT "shadow_migrate_timeout"
#define CANARY_TIMEOUT "shadow_sanity_timeout"
#define MIGRATE_RETRY_WAIT "shadow_retry_wait"
#define FID_LOAD_COUNT "shadow_fid_load_count"
#define MT_FILE_SIZE "shadow_mt_file_size"
#define MT_FILE_ENTRIES "shadow_mt_file_entries"
#define STAT_THRESHOLD_BYTES "shadow_stat_threshold_bytes"
#define SHADOW_FM_CLASS "shadowmigration"
#define SHADOW_FM_SUBCLASS "done"
#define SHADOW_FM_COMPLETION_INFO "completion-details"
#define SHADOW_FM_DATASET "dataset"
#define SHADOW_FM_SOURCE "source"
/* Default/Min/Max values for shadow conspiracy SMF parameters */
#define DEFAULT_NWORKERS 8
#define MIN_NWORKERS 1
#define MAX_NWORKERS 128
#define DEFAULT_THROTTLE (500ULL * NANOSEC / MILLISEC)
#define MIN_THROTTLE (100ULL * NANOSEC / MILLISEC)
#define MAX_THROTTLE (2ULL * NANOSEC)
#define DEFAULT_MIGRATE_TIMEOUT (3ULL * 60ULL * NANOSEC)
#define MIN_MIGRATE_TIMEOUT (30ULL * NANOSEC)
#define MAX_MIGRATE_TIMEOUT (5ULL * 60ULL * NANOSEC)
#define DEFAULT_MOUNT_TIMEOUT (25ULL * NANOSEC)
#define MIN_MOUNT_TIMEOUT DEFAULT_MOUNT_TIMEOUT
#define MAX_MOUNT_TIMEOUT (2ULL * 60ULL * NANOSEC)
#define DEFAULT_MOUNT_RETRY (5ULL * 60ULL * NANOSEC)
#define MIN_MOUNT_RETRY (1ULL * 60ULL * NANOSEC)
#define MAX_MOUNT_RETRY (UINT64_MAX)
#define DEFAULT_MOUNT_MAX_RETRY (60ULL * 60ULL * NANOSEC)
#define MIN_MOUNT_MAX_RETRY (5ULL * 60ULL * NANOSEC)
#define MAX_MOUNT_MAX_RETRY (UINT64_MAX)
#define DEFAULT_MOUNT_FREQ (1ULL * 60ULL * NANOSEC)
#define MIN_MOUNT_FREQ (1ULL * 60ULL * NANOSEC)
#define MAX_MOUNT_FREQ (5ULL * 60ULL * NANOSEC)
#define DEFAULT_CANARY_TIMEOUT (30ULL * NANOSEC)
#define MIN_CANARY_TIMEOUT (15ULL * NANOSEC)
#define MAX_CANARY_TIMEOUT (5ULL * 60ULL * NANOSEC)
#define DEFAULT_RETRY_WAIT (20ULL * NANOSEC)
#define DEFAULT_STAT_THRESHOLD_BYTES (50ULL * 1024 * 1024)
#define MIN_STAT_THRESHOLD_BYTES (1ULL * 1024 * 1024)
#define MAX_STAT_THRESHOLD_BYTES (10ULL * 1024 * 1024 * 1024)
#define MIN_RETRY_WAIT DEFAULT_RETRY_WAIT
#define MAX_RETRY_WAIT (5ULL * 60ULL * NANOSEC)
#define DEFAULT_FID_LOAD_COUNT 10000
#define MIN_FID_LOAD_COUNT 1
#define MAX_FID_LOAD_COUNT 100000
#define DEFAULT_MT_FILE_SIZE (256ULL * 1024 * 1024)
#define MIN_MT_FILE_SIZE (128ULL * 1024 * 1024)
#define MAX_MT_FILE_SIZE (UINT64_MAX)
#define DEFAULT_MT_FILE_ENTRIES 2
#define MIN_MT_FILE_ENTRIES 1
#define MAX_MT_FILE_ENTRIES MAX_NWORKERS
#ifndef ASSERT
#define ASSERT(x) assert((x));
#endif
typedef struct shadow_handle shadow_handle_t;
typedef enum {
ESHADOW_NONE, /* no error */
ESHADOW_NOMEM, /* out of memory */
ESHADOW_NOMOUNT, /* no such mountpoint */
ESHADOW_NOSHADOW, /* not a shadow mountpoint */
ESHADOW_CORRUPT, /* internal data inconsistency */
ESHADOW_ZFS_NOENT, /* failed to open ZFS dataset */
ESHADOW_ZFS_IO, /* I/O error */
ESHADOW_ZFS_IMPL, /* internal ZFS error */
ESHADOW_MNT_CLEAR, /* failed to clear mount option */
ESHADOW_MIGRATE_BUSY, /* migration currently busy */
ESHADOW_LOADING, /* loading pending logs is in progress */
ESHADOW_MIGRATE_DONE, /* finished migrating all data */
ESHADOW_MIGRATE_INTR, /* a file migration was interrupted */
ESHADOW_STANDBY, /* filesystem is in standby mode */
ESHADOW_TIMEOUT, /* source slow to respond to stat() */
ESHADOW_NOSVC, /* migration daemon not responding */
ESHADOW_PSTAT, /* persistent stat error */
ESHADOW_UNKNOWN /* unknown error */
} shadow_errno_t;
typedef struct {
uint64_t ss_processed; /* plain file contents transferred */
uint64_t ss_estimated; /* estimated remaining contents */
time_t ss_start; /* start of migration */
uint32_t ss_errors; /* number of unique errors seen */
} shadow_status_t;
typedef struct shadow_progress {
uint64_t sp_processed; /* total file data processed */
uint64_t sp_dir_seen; /* number of directories seen */
uint64_t sp_interior; /* number of interior done */
uint64_t sp_leaf; /* number of leaves done */
uint64_t sp_leaf_depth; /* total depth of all leaves */
uint64_t sp_dir_queue; /* number of dirs in queue */
uint64_t sp_dir_depth; /* depth of all dirs in queue */
time_t sp_start; /* start time */
uint64_t sp_srcsize; /* total shadow source size */
} shadow_progress_t;
extern shadow_handle_t *shadow_open(const char *);
extern const char *shadow_dataset(shadow_handle_t *);
extern void shadow_close(shadow_handle_t *);
extern void shadow_drain(shadow_handle_t *);
extern int shadow_cancel(shadow_handle_t *);
extern int shadow_specified_cancel(char *, char *, char *, char *);
extern int shadow_set_errno(shadow_errno_t);
extern shadow_errno_t shadow_errno(void);
extern const char *shadow_errmsg(void);
extern nvlist_t *shadow_get_errors(shadow_handle_t *, size_t);
extern void shadow_free_errors(nvlist_t **, size_t);
extern int shadow_pending_loads(shadow_handle_t *);
extern int shadow_failed_pending_loads(shadow_handle_t *);
extern int shadow_migrate_one(shadow_handle_t *);
extern boolean_t shadow_migrate_only_errors(shadow_handle_t *);
extern int shadow_migrate_finalize(shadow_handle_t *);
extern void shadow_get_status(shadow_handle_t *, shadow_status_t *);
extern int shadow_get_saved_stats(const char *, shadow_progress_t *);
extern int shadow_update_saved_stats(shadow_handle_t *);
#ifdef __cplusplus
}
#endif
#endif /* _LIBSHADOWFS_IMPL_H */