error_code replication_app_base::write_internal(mutation_ptr& mu) { dassert (mu->data.header.decree == last_committed_decree() + 1, ""); dassert(mu->client_requests.size() == mu->data.updates.size() && mu->client_requests.size() > 0, "data inconsistency in mutation"); int count = static_cast<int>(mu->client_requests.size()); _batch_state = (count == 1 ? BS_NOT_BATCH : BS_BATCH); for (int i = 0; i < count; i++) { if (_batch_state == BS_BATCH && i + 1 == count) { _batch_state = BS_BATCH_LAST; } auto& r = mu->client_requests[i]; if (r.code != RPC_REPLICATION_WRITE_EMPTY) { dinfo("%s: mutation %s dispatch rpc call: %s", _replica->name(), mu->name(), dsn_task_code_to_string(r.code)); binary_reader reader(mu->data.updates[i]); dsn_message_t resp = (r.req ? dsn_msg_create_response(r.req) : nullptr); uint64_t now = dsn_now_ns(); dispatch_rpc_call(r.code, reader, resp); now = dsn_now_ns() - now; _app_commit_latency.set(now); } else { // empty mutation write } if (_physical_error != 0) { derror("%s: physical error %d occurs in replication local app %s", _replica->name(), _physical_error, data_dir().c_str()); return ERR_LOCAL_APP_FAILURE; } } ++_last_committed_decree; _replica->update_commit_statistics(count); _app_commit_throughput.add((uint64_t)count); _app_commit_decree.increment(); return ERR_OK; }
int replication_app_base::write_internal(mutation_ptr& mu, bool ack_client) { dassert (mu->data.header.decree == last_committed_decree() + 1, ""); int err = 0; auto& msg = mu->client_request; dispatch_rpc_call( mu->rpc_code, msg, ack_client ); ++_last_committed_decree; return err; }
error_code replication_app_base::write_internal(mutation_ptr& mu) { dassert (mu->data.header.decree == last_committed_decree() + 1, ""); if (mu->rpc_code != RPC_REPLICATION_WRITE_EMPTY) { binary_reader reader(mu->data.updates[0]); dsn_message_t resp = (mu->client_msg() ? dsn_msg_create_response(mu->client_msg()) : nullptr); dispatch_rpc_call(mu->rpc_code, reader, resp); } else { on_empty_write(); } if (_physical_error != 0) { derror("physical error %d occurs in replication local app %s", _physical_error, data_dir().c_str()); } return _physical_error == 0 ? ERR_OK : ERR_LOCAL_APP_FAILURE; }