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 */