void meta_service::on_update_configuration(dsn_message_t req) { if (!_started) { configuration_update_response response; response.err = ERR_SERVICE_NOT_ACTIVE; reply(req, response); return; } if (!_failure_detector->is_primary()) { dsn_rpc_forward(req, _failure_detector->get_primary().c_addr()); return; } if (_state->freezed()) { configuration_update_request request; configuration_update_response response; ::unmarshall(req, request); response.err = ERR_STATE_FREEZED; _state->query_configuration_by_gpid(request.config.gpid, response.config); reply(req, response); return; } void* ptr; size_t sz; dsn_msg_read_next(req, &ptr, &sz); dsn_msg_read_commit(req, 0); // commit 0 so we can read again uint64_t offset; int len = (int)sz + sizeof(int32_t); char* buffer = new char[len]; *(int32_t*)buffer = (int)sz; memcpy(buffer + sizeof(int32_t), ptr, sz); auto tmp = std::shared_ptr<char>(buffer); blob bb2(tmp, 0, len); auto request = std::shared_ptr<configuration_update_request>(new configuration_update_request()); ::unmarshall(req, *request); { zauto_lock l(_log_lock); offset = _offset; _offset += len; file::write(_log, buffer, len, offset, LPC_CM_LOG_UPDATE, this, std::bind(&meta_service::on_log_completed, this, std::placeholders::_1, std::placeholders::_2, bb2, request, dsn_msg_create_response(req))); } }
bool meta_service::check_primary(dsn_message_t req) { if (!_failure_detector->is_primary()) { auto primary = _failure_detector->get_primary(); dinfo("primary address: %s", primary.to_string()); if (!primary.is_invalid()) { dsn_rpc_forward(req, _failure_detector->get_primary().c_addr()); return false; } } return true; }
void meta_service::on_query_configuration_by_index(dsn_message_t msg) { if (!_started) { configuration_query_by_index_response response; response.err = ERR_SERVICE_NOT_ACTIVE; reply(msg, response); return; } if (!_failure_detector->is_primary()) { dsn_rpc_forward(msg, _failure_detector->get_primary().c_addr()); return; } configuration_query_by_index_response response; configuration_query_by_index_request request; ::unmarshall(msg, request); _state->query_configuration_by_index(request, response); reply(msg, response); }
void meta_service::on_update_configuration(dsn_message_t req) { if (!_started) { configuration_update_response response; response.err = ERR_SERVICE_NOT_ACTIVE; reply(req, response); return; } if (!_failure_detector->is_primary()) { dsn_rpc_forward(req, _failure_detector->get_primary().c_addr()); return; } std::shared_ptr<configuration_update_request> request(new configuration_update_request); ::unmarshall(req, *request); if (_state->freezed()) { configuration_update_response response; response.err = ERR_STATE_FREEZED; _state->query_configuration_by_gpid(request->config.gpid, response.config); reply(req, response); return; } global_partition_id gpid = request->config.gpid; _state->update_configuration(request, req, [this, gpid](){ if (_started) { tasking::enqueue(LPC_LBM_RUN, this, std::bind(&meta_service::on_config_changed, this, gpid)); } }); }