mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 05:00:47 +00:00
Process read requests without raft
This commit is contained in:
parent
241d3ec8c2
commit
7af28e758a
@ -326,6 +326,12 @@ void ZooKeeperMultiRequest::readImpl(ReadBuffer & in)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ZooKeeperMultiRequest::isReadRequest() const
|
||||||
|
{
|
||||||
|
/// Possibly we can do better
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void ZooKeeperMultiResponse::readImpl(ReadBuffer & in)
|
void ZooKeeperMultiResponse::readImpl(ReadBuffer & in)
|
||||||
{
|
{
|
||||||
for (auto & response : responses)
|
for (auto & response : responses)
|
||||||
|
@ -60,6 +60,7 @@ struct ZooKeeperRequest : virtual Request
|
|||||||
static std::shared_ptr<ZooKeeperRequest> read(ReadBuffer & in);
|
static std::shared_ptr<ZooKeeperRequest> read(ReadBuffer & in);
|
||||||
|
|
||||||
virtual ZooKeeperResponsePtr makeResponse() const = 0;
|
virtual ZooKeeperResponsePtr makeResponse() const = 0;
|
||||||
|
virtual bool isReadRequest() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
using ZooKeeperRequestPtr = std::shared_ptr<ZooKeeperRequest>;
|
using ZooKeeperRequestPtr = std::shared_ptr<ZooKeeperRequest>;
|
||||||
@ -71,6 +72,7 @@ struct ZooKeeperHeartbeatRequest final : ZooKeeperRequest
|
|||||||
void writeImpl(WriteBuffer &) const override {}
|
void writeImpl(WriteBuffer &) const override {}
|
||||||
void readImpl(ReadBuffer &) override {}
|
void readImpl(ReadBuffer &) override {}
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperHeartbeatResponse final : ZooKeeperResponse
|
struct ZooKeeperHeartbeatResponse final : ZooKeeperResponse
|
||||||
@ -104,6 +106,7 @@ struct ZooKeeperAuthRequest final : ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperAuthResponse final : ZooKeeperResponse
|
struct ZooKeeperAuthResponse final : ZooKeeperResponse
|
||||||
@ -122,6 +125,7 @@ struct ZooKeeperCloseRequest final : ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer &) override {}
|
void readImpl(ReadBuffer &) override {}
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperCloseResponse final : ZooKeeperResponse
|
struct ZooKeeperCloseResponse final : ZooKeeperResponse
|
||||||
@ -146,6 +150,7 @@ struct ZooKeeperCreateRequest final : public CreateRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperCreateResponse final : CreateResponse, ZooKeeperResponse
|
struct ZooKeeperCreateResponse final : CreateResponse, ZooKeeperResponse
|
||||||
@ -167,6 +172,7 @@ struct ZooKeeperRemoveRequest final : RemoveRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperRemoveResponse final : RemoveResponse, ZooKeeperResponse
|
struct ZooKeeperRemoveResponse final : RemoveResponse, ZooKeeperResponse
|
||||||
@ -183,6 +189,7 @@ struct ZooKeeperExistsRequest final : ExistsRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return !has_watch; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperExistsResponse final : ExistsResponse, ZooKeeperResponse
|
struct ZooKeeperExistsResponse final : ExistsResponse, ZooKeeperResponse
|
||||||
@ -199,6 +206,7 @@ struct ZooKeeperGetRequest final : GetRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return !has_watch; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperGetResponse final : GetResponse, ZooKeeperResponse
|
struct ZooKeeperGetResponse final : GetResponse, ZooKeeperResponse
|
||||||
@ -217,6 +225,7 @@ struct ZooKeeperSetRequest final : SetRequest, ZooKeeperRequest
|
|||||||
void writeImpl(WriteBuffer & out) const override;
|
void writeImpl(WriteBuffer & out) const override;
|
||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return false; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperSetResponse final : SetResponse, ZooKeeperResponse
|
struct ZooKeeperSetResponse final : SetResponse, ZooKeeperResponse
|
||||||
@ -232,6 +241,7 @@ struct ZooKeeperListRequest : ListRequest, ZooKeeperRequest
|
|||||||
void writeImpl(WriteBuffer & out) const override;
|
void writeImpl(WriteBuffer & out) const override;
|
||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return !has_watch; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperSimpleListRequest final : ZooKeeperListRequest
|
struct ZooKeeperSimpleListRequest final : ZooKeeperListRequest
|
||||||
@ -261,6 +271,7 @@ struct ZooKeeperCheckRequest final : CheckRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override { return !has_watch; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperCheckResponse final : CheckResponse, ZooKeeperResponse
|
struct ZooKeeperCheckResponse final : CheckResponse, ZooKeeperResponse
|
||||||
@ -290,6 +301,7 @@ struct ZooKeeperMultiRequest final : MultiRequest, ZooKeeperRequest
|
|||||||
void readImpl(ReadBuffer & in) override;
|
void readImpl(ReadBuffer & in) override;
|
||||||
|
|
||||||
ZooKeeperResponsePtr makeResponse() const override;
|
ZooKeeperResponsePtr makeResponse() const override;
|
||||||
|
bool isReadRequest() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZooKeeperMultiResponse final : MultiResponse, ZooKeeperResponse
|
struct ZooKeeperMultiResponse final : MultiResponse, ZooKeeperResponse
|
||||||
|
@ -146,34 +146,41 @@ TestKeeperStorage::ResponsesForSessions NuKeeperServer::readZooKeeperResponses(n
|
|||||||
|
|
||||||
TestKeeperStorage::ResponsesForSessions NuKeeperServer::putRequests(const TestKeeperStorage::RequestsForSessions & requests)
|
TestKeeperStorage::ResponsesForSessions NuKeeperServer::putRequests(const TestKeeperStorage::RequestsForSessions & requests)
|
||||||
{
|
{
|
||||||
std::vector<nuraft::ptr<nuraft::buffer>> entries;
|
if (requests.size() == 1 && requests[0].request->isReadRequest())
|
||||||
for (const auto & [session_id, request] : requests)
|
|
||||||
{
|
{
|
||||||
ops_mapping[session_id][request->xid] = request->makeResponse();
|
return state_machine->processReadRequest(requests[0]);
|
||||||
entries.push_back(getZooKeeperLogEntry(session_id, request));
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
auto result = raft_instance->append_entries(entries);
|
|
||||||
if (!result->get_accepted())
|
|
||||||
throw Exception(ErrorCodes::RAFT_ERROR, "Cannot send requests to RAFT, mostly because we are not leader, code {}, message: '{}'", result->get_result_code(), result->get_result_str());
|
|
||||||
|
|
||||||
if (result->get_result_code() == nuraft::cmd_result_code::TIMEOUT)
|
|
||||||
{
|
{
|
||||||
TestKeeperStorage::ResponsesForSessions responses;
|
std::vector<nuraft::ptr<nuraft::buffer>> entries;
|
||||||
for (const auto & [session_id, request] : requests)
|
for (const auto & [session_id, request] : requests)
|
||||||
{
|
{
|
||||||
auto response = request->makeResponse();
|
ops_mapping[session_id][request->xid] = request->makeResponse();
|
||||||
response->xid = request->xid;
|
entries.push_back(getZooKeeperLogEntry(session_id, request));
|
||||||
response->zxid = 0; /// FIXME what we can do with it?
|
|
||||||
response->error = Coordination::Error::ZOPERATIONTIMEOUT;
|
|
||||||
responses.push_back(DB::TestKeeperStorage::ResponseForSession{session_id, response});
|
|
||||||
}
|
}
|
||||||
return responses;
|
|
||||||
}
|
|
||||||
else if (result->get_result_code() != nuraft::cmd_result_code::OK)
|
|
||||||
throw Exception(ErrorCodes::RAFT_ERROR, "Requests result failed with code {} and message: '{}'", result->get_result_code(), result->get_result_str());
|
|
||||||
|
|
||||||
return readZooKeeperResponses(result->get());
|
auto result = raft_instance->append_entries(entries);
|
||||||
|
if (!result->get_accepted())
|
||||||
|
throw Exception(ErrorCodes::RAFT_ERROR, "Cannot send requests to RAFT, mostly because we are not leader, code {}, message: '{}'", result->get_result_code(), result->get_result_str());
|
||||||
|
|
||||||
|
if (result->get_result_code() == nuraft::cmd_result_code::TIMEOUT)
|
||||||
|
{
|
||||||
|
TestKeeperStorage::ResponsesForSessions responses;
|
||||||
|
for (const auto & [session_id, request] : requests)
|
||||||
|
{
|
||||||
|
auto response = request->makeResponse();
|
||||||
|
response->xid = request->xid;
|
||||||
|
response->zxid = 0; /// FIXME what we can do with it?
|
||||||
|
response->error = Coordination::Error::ZOPERATIONTIMEOUT;
|
||||||
|
responses.push_back(DB::TestKeeperStorage::ResponseForSession{session_id, response});
|
||||||
|
}
|
||||||
|
return responses;
|
||||||
|
}
|
||||||
|
else if (result->get_result_code() != nuraft::cmd_result_code::OK)
|
||||||
|
throw Exception(ErrorCodes::RAFT_ERROR, "Requests result failed with code {} and message: '{}'", result->get_result_code(), result->get_result_str());
|
||||||
|
|
||||||
|
return readZooKeeperResponses(result->get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -223,4 +223,10 @@ int NuKeeperStateMachine::read_logical_snp_obj(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestKeeperStorage::ResponsesForSessions NuKeeperStateMachine::processReadRequest(const TestKeeperStorage::RequestForSession & request_for_session)
|
||||||
|
{
|
||||||
|
std::lock_guard lock(storage_lock);
|
||||||
|
return storage.processRequest(request_for_session.request, request_for_session.session_id);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
return storage;
|
return storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestKeeperStorage::ResponsesForSessions processReadRequest(const TestKeeperStorage::RequestForSession & requests);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct StorageSnapshot
|
struct StorageSnapshot
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user