xtreemfs/cpp/include/libxtreemfs/options.h
2020-09-22 02:25:22 +02:00

327 lines
12 KiB
C++

/*
* Copyright (c) 2010-2011 by Patrick Schaefer, Zuse Institute Berlin
* 2011-2012 by Michael Berlin, Zuse Institute Berlin
*
* Licensed under the BSD License, see LICENSE file for details.
*
*/
#ifndef CPP_INCLUDE_LIBXTREEMFS_OPTIONS_H_
#define CPP_INCLUDE_LIBXTREEMFS_OPTIONS_H_
#include <stdint.h>
#include <boost/function.hpp>
#include <boost/program_options.hpp>
#include <iostream>
#include <string>
#include <vector>
#include "libxtreemfs/typedefs.h"
#include "libxtreemfs/user_mapping.h"
namespace xtreemfs {
namespace rpc {
class SSLOptions;
} // namespace rpc
enum XtreemFSServiceType {
kDIR, kMRC
};
class Options {
public:
/** Query function which returns 1 when the request was interrupted.
*
* @note the boost::function typedef could be replaced with
* typedef int (*query_function)(void);
* which would also works without changes, but would not support
* functor objects
*/
typedef boost::function0<int> CheckIfInterruptedQueryFunction;
/** Sets the default values. */
Options();
virtual ~Options() {}
/** Generates boost::program_options description texts. */
void GenerateProgramOptionsDescriptions();
/** Set options parsed from command line.
*
* However, it does not set dir_volume_url and does not call
* ParseVolumeAndDir().
*
* @throws InvalidCommandLineParametersException
* @throws InvalidURLException */
std::vector<std::string> ParseCommandLine(int argc, char** argv);
/** Extract volume name and dir service address from dir_volume_url. */
void ParseURL(XtreemFSServiceType service_type);
/** Outputs usage of the command line parameters of all options. */
virtual std::string ShowCommandLineHelp();
/** Outputs usage of the command line parameters of volume creation
* relevant options. */
std::string ShowCommandLineHelpVolumeCreationAndDeletion();
/** Outputs usage of the command line parameters of volume deletion/listing
* relevant options. */
std::string ShowCommandLineHelpVolumeListing();
/** Returns the version string and prepends "component". */
std::string ShowVersion(const std::string& component);
/** Returns true if required SSL options are set. */
bool SSLEnabled() const;
/** Creates a new SSLOptions object based on the value of the members:
* - ssl_pem_key_path
* - ssl_pem_cert_path
* - ssl_pem_key_pass
* - ssl_pem_trusted_certs_path
* - ssl_pkcs12_path
* - ssl_pkcs12_pass
* - grid_ssl || protocol
* - verify_certificates
* - ignore_verify_errors
* - ssl_method
*
* @remark Ownership is transferred to caller. May be NULL.
*/
xtreemfs::rpc::SSLOptions* GenerateSSLOptions() const;
// Version information.
std::string version_string;
// XtreemFS URL Options.
/** URL to the Volume.
*
* Format:[pbrpc://]service-hostname[:port](,[pbrpc://]service-hostname2[:port])*[/volume_name]. // NOLINT
*
* Depending on the type of operation the service-hostname has to point to the
* DIR (to open/"mount" a volume) or the MRC (create/delete/list volumes).
* Depending on this type, the default port differs (DIR: 32638; MRC: 32636).
*/
std::string xtreemfs_url;
/** Usually extracted from xtreemfs_url (Form: ip-address:port).
*
* Depending on the application, it may contain the addresses of DIR replicas
* (e.g., mount.xtreemfs) or MRC replicas (e.g., mkfs.xtreemfs). */
ServiceAddresses service_addresses;
/** Usually extracted from xtreemfs_url. */
std::string volume_name;
/** Usually extracted from xtreemfs_url. */
std::string protocol;
/** Mount point on local system (set by ParseCommandLine()). */
std::string mount_point;
// General options.
/** Log level as string (EMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG). */
std::string log_level_string;
/** If not empty, the output will be logged to a file. */
std::string log_file_path;
/** True, if "-h" was specified. */
bool show_help;
/** True, if argc == 1 was at ParseCommandLine(). */
bool empty_arguments_list;
/** True, if -V/--version was specified and the version will be shown only .*/
bool show_version;
// Optimizations.
/** Maximum number of entries of the StatCache */
uint64_t metadata_cache_size;
/** Time to live for MetadataCache entries. */
uint64_t metadata_cache_ttl_s;
/** Enable asynchronous writes */
bool enable_async_writes;
/** Maximum number of pending async write requests per file. */
int async_writes_max_requests;
/** Maximum write request size per async write. Should be equal to the lowest
* upper bound in the system (e.g. an object size, or the FUSE limit). */
int async_writes_max_request_size_kb;
/** Number of retrieved entries per readdir request. */
int readdir_chunk_size;
/** True, if atime requests are enabled in Fuse/not ignored by the library. */
bool enable_atime;
/** Cached objects per file. A value <= 0 disables the object cache. */
int object_cache_size;
// Error Handling options.
/** How often shall a failed operation get retried? */
int max_tries;
/** How often shall a failed read operation get retried? */
int max_read_tries;
/** How often shall a failed write operation get retried? */
int max_write_tries;
/** How often shall a view be tried to renewed? */
int max_view_renewals;
/** How long to wait after a failed request at least? */
int retry_delay_s;
/** Maximum time until a connection attempt will be aborted. */
int32_t connect_timeout_s;
/** Maximum time until a request will be aborted and the response returned. */
int32_t request_timeout_s;
/** The RPC Client closes connections after "linger_timeout_s" time of
* inactivity. */
int32_t linger_timeout_s;
#ifdef HAS_OPENSSL
// SSL options.
std::string ssl_pem_cert_path;
std::string ssl_pem_key_path;
std::string ssl_pem_key_pass;
std::string ssl_pem_trusted_certs_path;
std::string ssl_pkcs12_path;
std::string ssl_pkcs12_pass;
/** True, if the XtreemFS Grid-SSL Mode (only SSL handshake, no encryption of
* data itself) shall be used. */
bool grid_ssl;
/** True if certificates shall be verified. */
bool ssl_verify_certificates;
/** List of openssl verify error codes to ignore during verification and
* accept anyway. Only used when ssl_verify_certificates = true. */
std::vector<int> ssl_ignore_verify_errors;
/** SSL version that this client should accept. */
std::string ssl_method_string;
#endif // HAS_OPENSSL
// Grid Support options.
/** True if the Globus user mapping shall be used. */
bool grid_auth_mode_globus;
/** True if the Unicore user mapping shall be used. */
bool grid_auth_mode_unicore;
/** Location of the gridmap file. */
std::string grid_gridmap_location;
/** Default Location of the Globus gridmap file. */
std::string grid_gridmap_location_default_globus;
/** Default Location of the Unicore gridmap file. */
std::string grid_gridmap_location_default_unicore;
/** Periodic interval after which the gridmap file will be reloaded. */
int grid_gridmap_reload_interval_m;
// Vivaldi Options
/** Enables the vivaldi coordinate calculation for the client. */
bool vivaldi_enable;
/** Enables sending the coordinates to the DIR after each recalculation. This
* is only needed to add the clients to the vivaldi visualization at the cost
* of some additional traffic between client and DIR.") */
bool vivaldi_enable_dir_updates;
/** The file where the vivaldi coordinates should be saved after each
* recalculation. */
std::string vivaldi_filename;
/** The interval between coordinate recalculations. Also see
* vivaldi_recalculation_epsilon_s. */
int vivaldi_recalculation_interval_s;
/** The recalculation interval will be randomly chosen from
* vivaldi_recalculation_inverval_s +/- vivaldi_recalculation_epsilon_s */
int vivaldi_recalculation_epsilon_s;
/** Number of coordinate recalculations before updating the list of OSDs. */
int vivaldi_max_iterations_before_updating;
/** Maximal number of retries when requesting coordinates from another
* vivaldi node. */
int vivaldi_max_request_retries;
// Advanced XtreemFS options.
/** Interval for periodic file size updates in seconds. */
int periodic_file_size_updates_interval_s;
/** Interval for periodic xcap renewal in seconds. */
int periodic_xcap_renewal_interval_s;
/** Skewness of the Zipf distribution used for vivaldi OSD selection */
double vivaldi_zipf_generator_skew;
/** May contain all previous options in key=value pair lists. */
std::vector<std::string> alternative_options_list;
// Internal options, not available from the command line interface.
/** If not NULL, called to find out if request was interrupted. */
CheckIfInterruptedQueryFunction was_interrupted_function;
// NOTE: Deprecated options are no longer needed as members
// Additional User mapping.
/** Type of the UserMapping used to translate between local/global names. */
UserMapping::UserMappingType additional_user_mapping_type;
private:
/** Reads password from stdin and stores it in 'password'. */
void ReadPasswordFromStdin(const std::string& msg, std::string* password);
/** This functor template can be used as argument for the notifier() method
* of boost::options. It is specifically used to create a warning whenever
* a deprecated option is used, but is not limited to that purpose.
* The CreateMsgOptionHandler function template can be used to instantiate it
* without explicit template type specification. Instead the type inferred
* from the value given by the corresponding member variable.
*/
template<typename T>
class MsgOptionHandler {
public:
typedef void result_type;
MsgOptionHandler(std::string msg)
: msg_(msg) { }
void operator()(const T& value) {
std::cerr << "Warning: Deprecated option used: " << msg_ << std::endl;
}
private:
const std::string msg_;
};
/** See MsgOptionHandler */
template<typename T>
MsgOptionHandler<T> CreateMsgOptionHandler(const T&, std::string msg) {
return MsgOptionHandler<T>(msg);
}
// Sums of options.
/** Contains all boost program options, needed for parsing. */
boost::program_options::options_description all_descriptions_;
/** Contains descriptions of all visible options (no advanced and
* deprecated options). Used by ShowCommandLineHelp().*/
boost::program_options::options_description visible_descriptions_;
/** Set to true if GenerateProgramOptionsDescriptions() was executed. */
bool all_descriptions_initialized_;
// Options itself.
/** Description of general options (Logging, help). */
boost::program_options::options_description general_;
/** Description of options which improve performance. */
boost::program_options::options_description optimizations_;
/** Description of timeout options etc. */
boost::program_options::options_description error_handling_;
#ifdef HAS_OPENSSL
/** Description of SSL related options. */
boost::program_options::options_description ssl_options_;
#endif // HAS_OPENSSL
/** Description of options of the Grid support. */
boost::program_options::options_description grid_options_;
/** Description of the Vivaldi options */
boost::program_options::options_description vivaldi_options_;
// Hidden options.
/** Description of options of the Grid support. */
boost::program_options::options_description xtreemfs_advanced_options_;
/** Deprecated options which are kept to ensure backward compatibility. */
boost::program_options::options_description deprecated_options_;
/** Specify all previous options in key=value pair lists. */
boost::program_options::options_description alternative_options_;
};
} // namespace xtreemfs
#endif // CPP_INCLUDE_LIBXTREEMFS_OPTIONS_H_