blob: ca18df9192a4939839a149a60de3e2ac89699706 [file] [log] [blame]
/*
* The MIT License (MIT)
*
* Copyright (c) 2015 Microsoft Corporation
*
* -=- Robust Distributed System Nucleus (rDSN) -=-
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 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 OR COPYRIGHT HOLDERS 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.
*/
/// Attention: There are some types which are defined in dsn_runtime being used in this file,
/// so this file is coupled with dsn_runtime. If you want to add some variables/types here or
/// include this file, please make sure whether you want to couple with dsn_runtime or not.
#pragma once
#include <algorithm>
#include <list>
#include <map>
#include <string>
#include <vector>
#include "runtime/task/task_spec.h"
#include "utils/config_api.h"
#include "utils/config_helper.h"
#include "utils/customizable_id.h"
#include "utils/threadpool_code.h"
#include "utils/threadpool_spec.h"
namespace dsn {
//
// channel and header format are specified per task-code
// port is specified per RPC call
//
struct network_client_config
{
std::string factory_name;
int message_buffer_block_size;
network_client_config();
};
typedef std::map<rpc_channel, network_client_config> network_client_configs;
struct network_server_config
{
// [ key
int port;
rpc_channel channel;
// ]
std::string factory_name;
int message_buffer_block_size;
network_server_config();
network_server_config(int p, rpc_channel c);
network_server_config(const network_server_config &r);
bool operator<(const network_server_config &r) const;
};
// <port,channel> => config
typedef std::map<network_server_config, network_server_config> network_server_configs;
// Terms used in rDSN:
// - app_id
// - app_name/role_name
// - role_index
// - app_full_name
// - app_type
struct service_app_spec
{
int id; // global id for all roles, assigned by rDSN automatically
int index; // local index for the current role (1,2,3,...), also named as "role_index"
std::string data_dir; // data dir for the app. it is auto-set as
// ${service_spec.data_dir}/${service_app_spec.name}.
std::string config_section; // [apps.${role_name}]
std::string role_name; // role name of [apps.${role_name}], also named as "app_name"
// combined by role_name and role_index, also named as "app_full_name"
// e.g., if role_name = meta and role_index = 1, then app_full_name = meta1
// specially, if role count is 1, then app_full_name equals to role_name
// it is usually used for printing log
std::string full_name;
std::string type; // registered type name, alse named as "app_type"
std::string arguments;
std::vector<int> ports;
std::list<dsn::threadpool_code> pools;
int delay_seconds;
bool run;
int count; // index = 1,2,...,count
int ports_gap; // when count > 1
network_client_configs network_client_confs;
network_server_configs network_server_confs;
service_app_spec() {}
/*service_app_spec(const service_app_spec& r);*/
bool init(const char *section,
const char *role_name_,
service_app_spec *default_value,
network_client_configs *default_client_nets = nullptr,
network_server_configs *default_server_nets = nullptr);
};
CONFIG_BEGIN(service_app_spec)
CONFIG_FLD_STRING(type, "", "app type name, as given when registering by dsn_register_app")
CONFIG_FLD_STRING(arguments, "", "arguments for the app instances")
CONFIG_FLD_INT_LIST(ports, "RPC server listening ports needed for this app")
CONFIG_FLD_ID_LIST(threadpool_code, pools, "thread pools need to be started")
CONFIG_FLD(int, uint64, delay_seconds, 0, "delay seconds for when the apps should be started")
CONFIG_FLD(int,
uint64,
count,
1,
"count of app instances for this type (ports are automatically "
"calculated accordingly to avoid confliction)")
CONFIG_FLD(bool, bool, run, true, "whether to run the app instances or not")
CONFIG_END
struct service_spec
{
std::string tool; // the main tool (only 1 is allowed for a time)
std::list<std::string> toollets; // toollets enabled compatible to the main tool
std::string data_dir; // to store all data/log/coredump etc.
//
// we allow multiple apps in the same process in rDSN, and each app (service_app_spec)
// has its own rpc/thread/disk engines etc..
// when a rDSN call is made in a thread not belonging to any rDSN app,
// developers need to call dsn_mimic_app to designated which app this call and subsequent
// calls belong to.
// this is kinds of tedious sometimes, we therefore introduce enable_default_app_mimic
// option here, which automatically starts an internal app which does nothing but serves
// those external calls only. This will release the developers from writing dsn_mimic_app
// when they write certain codes, esp. client side code.
//
bool enable_default_app_mimic;
std::string timer_factory_name;
std::string env_factory_name;
std::string lock_factory_name;
std::string lock_nr_factory_name;
std::string rwlock_nr_factory_name;
std::string semaphore_factory_name;
std::string logging_factory_name;
network_client_configs network_default_client_cfs; // default network configed by tools
network_server_configs network_default_server_cfs; // default network configed by tools
std::vector<threadpool_spec> threadpool_specs;
std::vector<service_app_spec> app_specs;
// auto-set
std::string dir_log;
service_spec() {}
bool init();
bool init_app_specs();
};
CONFIG_BEGIN(service_spec)
CONFIG_FLD_STRING(tool, "", "use what tool to run this process, e.g., native or simulator")
CONFIG_FLD_STRING_LIST(toollets, "use what toollets, e.g., tracer, profiler, fault_injector")
CONFIG_FLD_STRING(data_dir, "./data", "where to put the all the data/log/coredump, etc..")
CONFIG_FLD(
bool,
bool,
enable_default_app_mimic,
false,
"whether to start a default service app for serving the rDSN calls made in\n"
"; non-rDSN threads, so that developers do not need to write dsn_mimic_app call before them\n"
"; in this case, a [apps.mimic] section must be defined in config files");
CONFIG_FLD_STRING(timer_factory_name, "", "timer service provider")
CONFIG_FLD_STRING(env_factory_name, "", "environment provider")
CONFIG_FLD_STRING(lock_factory_name, "", "recursive exclusive lock provider")
CONFIG_FLD_STRING(lock_nr_factory_name, "", "non-recurisve exclusive lock provider")
CONFIG_FLD_STRING(rwlock_nr_factory_name, "", "non-recurisve rwlock provider")
CONFIG_FLD_STRING(semaphore_factory_name, "", "semaphore provider")
CONFIG_FLD_STRING(logging_factory_name, "", "logging provider")
CONFIG_END
} // namespace dsn