From ef755e466cc191b0ba76fe27b630c27e9d267aeb Mon Sep 17 00:00:00 2001 From: jbajic Date: Mon, 14 Nov 2022 14:15:29 +0100 Subject: [PATCH 01/30] Add ShardError --- src/storage/v3/result.hpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 86fdb10d0..ecec4ad1e 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -11,6 +11,7 @@ #pragma once +#include #include #include "utils/result.hpp" @@ -19,16 +20,35 @@ namespace memgraph::storage::v3 { static_assert(std::is_same_v); -enum class Error : uint8_t { +enum class ErrorCode { SERIALIZATION_ERROR, NONEXISTENT_OBJECT, DELETED_OBJECT, VERTEX_HAS_EDGES, PROPERTIES_DISABLED, - VERTEX_ALREADY_INSERTED + VERTEX_ALREADY_INSERTED, + // Schema Violations + SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, + SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, + SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, + SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, }; +struct ShardError { + ShardError(ErrorCode code, std::string message, std::string source) + : code{code}, message{std::move(message)}, source{std::move(source)} {} + + ErrorCode code; + // TODO Maybe add category + std::string message; + std::string source; +}; + +#define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, fmt::format("{}:{}", __FILE__, __LINE__)) + template -using Result = utils::BasicResult; +using Result = utils::BasicResult; } // namespace memgraph::storage::v3 From 618237cc962b06be11e65a1e9d1d27684a83a2e6 Mon Sep 17 00:00:00 2001 From: jbajic Date: Mon, 14 Nov 2022 14:25:20 +0100 Subject: [PATCH 02/30] Adapt schema validator --- src/storage/v3/name_id_mapper.hpp | 5 ++ src/storage/v3/schema_validator.cpp | 72 ++++++++++++++--------------- src/storage/v3/schema_validator.hpp | 45 +++++------------- src/storage/v3/shard.cpp | 3 +- 4 files changed, 52 insertions(+), 73 deletions(-) diff --git a/src/storage/v3/name_id_mapper.hpp b/src/storage/v3/name_id_mapper.hpp index f241bca54..70b5c5ded 100644 --- a/src/storage/v3/name_id_mapper.hpp +++ b/src/storage/v3/name_id_mapper.hpp @@ -17,6 +17,7 @@ #include #include +#include "storage/v3/id_types.hpp" #include "utils/logging.hpp" #include "utils/skip_list.hpp" @@ -47,6 +48,10 @@ class NameIdMapper final { return kUnmappedId; } + const std::string &IdToName(const LabelId label_id) const { return IdToName(label_id.AsInt()); } + + const std::string &IdToName(const PropertyId property_id) const { return IdToName(property_id.AsInt()); } + const std::string &IdToName(const uint64_t id) const { auto it = id_to_name_.find(id); MG_ASSERT(it != id_to_name_.end(), "Id not know in mapper!"); diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 748eda28d..48fd95eba 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -16,67 +16,60 @@ #include #include "common/types.hpp" +#include "storage/v3/name_id_mapper.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/schemas.hpp" namespace memgraph::storage::v3 { -bool operator==(const SchemaViolation &lhs, const SchemaViolation &rhs) { - return lhs.status == rhs.status && lhs.label == rhs.label && - lhs.violated_schema_property == rhs.violated_schema_property && - lhs.violated_property_value == rhs.violated_property_value; -} +SchemaValidator::SchemaValidator(Schemas &schemas, const NameIdMapper &name_id_mapper) + : schemas_{&schemas}, name_id_mapper_{&name_id_mapper} {} -SchemaViolation::SchemaViolation(ValidationStatus status, LabelId label) : status{status}, label{label} {} - -SchemaViolation::SchemaViolation(ValidationStatus status, LabelId label, SchemaProperty violated_schema_property) - : status{status}, label{label}, violated_schema_property{violated_schema_property} {} - -SchemaViolation::SchemaViolation(ValidationStatus status, LabelId label, SchemaProperty violated_schema_property, - PropertyValue violated_property_value) - : status{status}, - label{label}, - violated_schema_property{violated_schema_property}, - violated_property_value{violated_property_value} {} - -SchemaValidator::SchemaValidator(Schemas &schemas) : schemas_{schemas} {} - -std::optional SchemaValidator::ValidateVertexCreate( +std::optional SchemaValidator::ValidateVertexCreate( LabelId primary_label, const std::vector &labels, const std::vector &primary_properties) const { // Schema on primary label - const auto *schema = schemas_.GetSchema(primary_label); + const auto *schema = schemas_->GetSchema(primary_label); if (schema == nullptr) { - return SchemaViolation(SchemaViolation::ValidationStatus::NO_SCHEMA_DEFINED_FOR_LABEL, primary_label); + return SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, + fmt::format("Schema not defined for label :{}", name_id_mapper_->IdToName(primary_label))); } // Is there another primary label among secondary labels for (const auto &secondary_label : labels) { - if (schemas_.GetSchema(secondary_label)) { - return SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, secondary_label); + if (schemas_->GetSchema(secondary_label)) { + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, + fmt::format("Cannot add label :{}, since it is defined as a primary label", + name_id_mapper_->IdToName(secondary_label))); } } // Quick size check if (schema->second.size() != primary_properties.size()) { - return SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PRIMARY_PROPERTIES_UNDEFINED, primary_label); + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, + fmt::format("Not all primary properties have been specified for :{} vertex", + name_id_mapper_->IdToName(primary_label))); } // Check only properties defined by schema for (size_t i{0}; i < schema->second.size(); ++i) { // Check schema property type if (auto property_schema_type = PropertyTypeToSchemaType(primary_properties[i]); property_schema_type && *property_schema_type != schema->second[i].type) { - return SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PROPERTY_WRONG_TYPE, primary_label, - schema->second[i], primary_properties[i]); + return SHARD_ERROR( + ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + fmt::format("Property {} is of wrong type, expected {}, actual {}", + name_id_mapper_->IdToName(schema->second[i].property_id), + SchemaTypeToString(schema->second[i].type), SchemaTypeToString(*property_schema_type))); } } return std::nullopt; } -std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId primary_label, - const PropertyId property_id) const { +std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId primary_label, + const PropertyId property_id) const { // Verify existence of schema on primary label - const auto *schema = schemas_.GetSchema(primary_label); + const auto *schema = schemas_->GetSchema(primary_label); MG_ASSERT(schema, "Cannot validate against non existing schema!"); // Verify that updating property is not part of schema @@ -84,16 +77,19 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const Lab schema->second, [property_id](const auto &schema_property) { return property_id == schema_property.property_id; }); schema_property != schema->second.end()) { - return SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_KEY, primary_label, - *schema_property); + return SHARD_ERROR( + ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + fmt::format("Cannot update primary property {} of schema on label :{}", + name_id_mapper_->IdToName(schema_property->property_id), name_id_mapper_->IdToName(primary_label))); } return std::nullopt; } -std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { - const auto *schema = schemas_.GetSchema(label); +std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { + const auto *schema = schemas_->GetSchema(label); if (schema) { - return SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_LABEL, label); + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, + fmt::format("Cannot add/remove primary label :{}", name_id_mapper_->IdToName(label))); } return std::nullopt; } @@ -103,15 +99,15 @@ const Schemas::Schema *SchemaValidator::GetSchema(LabelId label) const { return VertexValidator::VertexValidator(const SchemaValidator &schema_validator, const LabelId primary_label) : schema_validator{&schema_validator}, primary_label_{primary_label} {} -std::optional VertexValidator::ValidatePropertyUpdate(PropertyId property_id) const { +std::optional VertexValidator::ValidatePropertyUpdate(PropertyId property_id) const { return schema_validator->ValidatePropertyUpdate(primary_label_, property_id); }; -std::optional VertexValidator::ValidateAddLabel(LabelId label) const { +std::optional VertexValidator::ValidateAddLabel(LabelId label) const { return schema_validator->ValidateLabelUpdate(label); } -std::optional VertexValidator::ValidateRemoveLabel(LabelId label) const { +std::optional VertexValidator::ValidateRemoveLabel(LabelId label) const { return schema_validator->ValidateLabelUpdate(label); } diff --git a/src/storage/v3/schema_validator.hpp b/src/storage/v3/schema_validator.hpp index ce813fde2..329d4a582 100644 --- a/src/storage/v3/schema_validator.hpp +++ b/src/storage/v3/schema_validator.hpp @@ -14,65 +14,42 @@ #include #include +#include "storage/v2/result.hpp" #include "storage/v3/id_types.hpp" +#include "storage/v3/name_id_mapper.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/result.hpp" #include "storage/v3/schemas.hpp" namespace memgraph::storage::v3 { -struct SchemaViolation { - enum class ValidationStatus : uint8_t { - NO_SCHEMA_DEFINED_FOR_LABEL, - VERTEX_PROPERTY_WRONG_TYPE, - VERTEX_UPDATE_PRIMARY_KEY, - VERTEX_UPDATE_PRIMARY_LABEL, - VERTEX_SECONDARY_LABEL_IS_PRIMARY, - VERTEX_PRIMARY_PROPERTIES_UNDEFINED, - }; - - SchemaViolation(ValidationStatus status, LabelId label); - - SchemaViolation(ValidationStatus status, LabelId label, SchemaProperty violated_schema_property); - - SchemaViolation(ValidationStatus status, LabelId label, SchemaProperty violated_schema_property, - PropertyValue violated_property_value); - - friend bool operator==(const SchemaViolation &lhs, const SchemaViolation &rhs); - - ValidationStatus status; - LabelId label; - std::optional violated_schema_property; - std::optional violated_property_value; -}; - class SchemaValidator { public: - explicit SchemaValidator(Schemas &schemas); + explicit SchemaValidator(Schemas &schemas, const NameIdMapper &name_id_mapper); - [[nodiscard]] std::optional ValidateVertexCreate( + [[nodiscard]] std::optional ValidateVertexCreate( LabelId primary_label, const std::vector &labels, const std::vector &primary_properties) const; - [[nodiscard]] std::optional ValidatePropertyUpdate(LabelId primary_label, - PropertyId property_id) const; + [[nodiscard]] std::optional ValidatePropertyUpdate(LabelId primary_label, PropertyId property_id) const; - [[nodiscard]] std::optional ValidateLabelUpdate(LabelId label) const; + [[nodiscard]] std::optional ValidateLabelUpdate(LabelId label) const; const Schemas::Schema *GetSchema(LabelId label) const; private: - Schemas &schemas_; + Schemas *schemas_; + const NameIdMapper *name_id_mapper_; }; struct VertexValidator { explicit VertexValidator(const SchemaValidator &schema_validator, LabelId primary_label); - [[nodiscard]] std::optional ValidatePropertyUpdate(PropertyId property_id) const; + [[nodiscard]] std::optional ValidatePropertyUpdate(PropertyId property_id) const; - [[nodiscard]] std::optional ValidateAddLabel(LabelId label) const; + [[nodiscard]] std::optional ValidateAddLabel(LabelId label) const; - [[nodiscard]] std::optional ValidateRemoveLabel(LabelId label) const; + [[nodiscard]] std::optional ValidateRemoveLabel(LabelId label) const; const SchemaValidator *schema_validator; diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index 0e596172d..e4d993ffa 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -31,6 +31,7 @@ #include "storage/v3/indices.hpp" #include "storage/v3/key_store.hpp" #include "storage/v3/mvcc.hpp" +#include "storage/v3/name_id_mapper.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/schema_validator.hpp" #include "storage/v3/shard_operation_result.hpp" @@ -327,7 +328,7 @@ Shard::Shard(const LabelId primary_label, const PrimaryKey min_primary_key, : primary_label_{primary_label}, min_primary_key_{min_primary_key}, max_primary_key_{max_primary_key}, - schema_validator_{schemas_}, + schema_validator_{schemas_, name_id_mapper_}, vertex_validator_{schema_validator_, primary_label}, indices_{config.items, vertex_validator_}, isolation_level_{config.transaction.isolation_level}, From 07032887a4c915623d27d8e07658ac1fbdfc7b29 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 18:24:28 +0100 Subject: [PATCH 03/30] Adapt mg-expr --- src/expr/interpret/eval.hpp | 65 ++++++++++++++------------------ src/query/v2/bindings/eval.hpp | 11 ++++-- src/storage/v3/bindings/eval.hpp | 3 +- 3 files changed, 37 insertions(+), 42 deletions(-) diff --git a/src/expr/interpret/eval.hpp b/src/expr/interpret/eval.hpp index 70127c023..d105eeefb 100644 --- a/src/expr/interpret/eval.hpp +++ b/src/expr/interpret/eval.hpp @@ -32,7 +32,7 @@ struct StorageTag {}; struct QueryEngineTag {}; template + typename PropertyValue, typename ConvFunctor, typename TError, typename Tag = StorageTag> class ExpressionEvaluator : public ExpressionVisitor { public: ExpressionEvaluator(Frame *frame, const SymbolTable &symbol_table, const EvaluationContext &ctx, @@ -100,6 +100,27 @@ class ExpressionEvaluator : public ExpressionVisitor { #undef BINARY_OPERATOR_VISITOR #undef UNARY_OPERATOR_VISITOR + void HandleShardError(TError &shard_error, const std::string_view accessed_object) { + switch (shard_error) { + case TError::DELETED_OBJECT: + throw ExpressionRuntimeException("Trying to access {} on a deleted object.", accessed_object); + case TError::NONEXISTENT_OBJECT: + throw ExpressionRuntimeException("Trying to access {} from a node object doesn't exist.", accessed_object); + case TError::SERIALIZATION_ERROR: + case TError::VERTEX_HAS_EDGES: + case TError::PROPERTIES_DISABLED: + case TError::VERTEX_ALREADY_INSERTED: + throw ExpressionRuntimeException("Unexpected error when accessing {}.", accessed_object); + case TError::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + case TError::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + case TError::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + case TError::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + case TError::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + case TError::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + throw ExpressionRuntimeException("Unexpected schema violation when accessing {}.", accessed_object); + } + } + TypedValue Visit(AndOperator &op) override { auto value1 = op.expression1_->Accept(*this); if (value1.IsBool() && !value1.ValueBool()) { @@ -385,7 +406,7 @@ class ExpressionEvaluator : public ExpressionVisitor { typename TReturnType = std::enable_if_t, bool>> TReturnType HasLabelImpl(const VertexAccessor &vertex, const LabelIx &label, StorageTag /*tag*/) { auto has_label = vertex.HasLabel(view_, GetLabel(label)); - if (has_label.HasError() && has_label.GetError() == Error::NONEXISTENT_OBJECT) { + if (has_label.HasError() && has_label.GetError().code == TError::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE // work. The old storage had the following logic when returning an // `OLD` view: `return old ? old : new`. That means that if the @@ -396,17 +417,7 @@ class ExpressionEvaluator : public ExpressionVisitor { has_label = vertex.HasLabel(StorageView::NEW, GetLabel(label)); } if (has_label.HasError()) { - switch (has_label.GetError()) { - case Error::DELETED_OBJECT: - throw ExpressionRuntimeException("Trying to access labels on a deleted node."); - case Error::NONEXISTENT_OBJECT: - throw ExpressionRuntimeException("Trying to access labels from a node that doesn't exist."); - case Error::SERIALIZATION_ERROR: - case Error::VERTEX_HAS_EDGES: - case Error::PROPERTIES_DISABLED: - case Error::VERTEX_ALREADY_INSERTED: - throw ExpressionRuntimeException("Unexpected error when accessing labels."); - } + HandleShardError(has_label.GetError().code, "labels"); } return *has_label; } @@ -734,7 +745,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, PropertyIx prop) { auto maybe_prop = record_accessor.GetProperty(view_, ctx_->properties[prop.ix]); - if (maybe_prop.HasError() && maybe_prop.GetError() == Error::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError().code == TError::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't @@ -744,17 +755,7 @@ class ExpressionEvaluator : public ExpressionVisitor { maybe_prop = record_accessor.GetProperty(StorageView::NEW, ctx_->properties[prop.ix]); } if (maybe_prop.HasError()) { - switch (maybe_prop.GetError()) { - case Error::DELETED_OBJECT: - throw ExpressionRuntimeException("Trying to get a property from a deleted object."); - case Error::NONEXISTENT_OBJECT: - throw ExpressionRuntimeException("Trying to get a property from an object that doesn't exist."); - case Error::SERIALIZATION_ERROR: - case Error::VERTEX_HAS_EDGES: - case Error::PROPERTIES_DISABLED: - case Error::VERTEX_ALREADY_INSERTED: - throw ExpressionRuntimeException("Unexpected error when getting a property."); - } + HandleShardError(maybe_prop.GetError().code, "property"); } return conv_(*maybe_prop, ctx_->memory); } @@ -763,7 +764,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, const std::string_view name) { auto maybe_prop = record_accessor.GetProperty(view_, dba_->NameToProperty(name)); - if (maybe_prop.HasError() && maybe_prop.GetError() == Error::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError().code == TError::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't @@ -773,17 +774,7 @@ class ExpressionEvaluator : public ExpressionVisitor { maybe_prop = record_accessor.GetProperty(view_, dba_->NameToProperty(name)); } if (maybe_prop.HasError()) { - switch (maybe_prop.GetError()) { - case Error::DELETED_OBJECT: - throw ExpressionRuntimeException("Trying to get a property from a deleted object."); - case Error::NONEXISTENT_OBJECT: - throw ExpressionRuntimeException("Trying to get a property from an object that doesn't exist."); - case Error::SERIALIZATION_ERROR: - case Error::VERTEX_HAS_EDGES: - case Error::PROPERTIES_DISABLED: - case Error::VERTEX_ALREADY_INSERTED: - throw ExpressionRuntimeException("Unexpected error when getting a property."); - } + HandleShardError(maybe_prop.GetError().code, "property"); } return conv_(*maybe_prop, ctx_->memory); } diff --git a/src/query/v2/bindings/eval.hpp b/src/query/v2/bindings/eval.hpp index 52455bdb2..78aca436f 100644 --- a/src/query/v2/bindings/eval.hpp +++ b/src/query/v2/bindings/eval.hpp @@ -21,11 +21,12 @@ #include "query/v2/requests.hpp" #include "storage/v3/conversions.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/view.hpp" namespace memgraph::msgs { class ShardRequestManagerInterface; -} // namespace memgraph::msgs +} // namespace memgraph::msgs namespace memgraph::query::v2 { @@ -42,8 +43,10 @@ class Callable { }; } // namespace detail -using ExpressionEvaluator = memgraph::expr::ExpressionEvaluator< - TypedValue, memgraph::query::v2::EvaluationContext, memgraph::msgs::ShardRequestManagerInterface, storage::v3::View, - storage::v3::LabelId, msgs::Value, detail::Callable, memgraph::storage::v3::Error, memgraph::expr::QueryEngineTag>; +using ExpressionEvaluator = + memgraph::expr::ExpressionEvaluator; } // namespace memgraph::query::v2 diff --git a/src/storage/v3/bindings/eval.hpp b/src/storage/v3/bindings/eval.hpp index 7f93bb79c..063705806 100644 --- a/src/storage/v3/bindings/eval.hpp +++ b/src/storage/v3/bindings/eval.hpp @@ -21,6 +21,7 @@ #include "storage/v3/id_types.hpp" #include "storage/v3/property_store.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/view.hpp" #include "utils/memory.hpp" @@ -87,6 +88,6 @@ struct EvaluationContext { using ExpressionEvaluator = memgraph::expr::ExpressionEvaluator; + memgraph::storage::v3::ErrorCode>; } // namespace memgraph::storage::v3 From 3d66bbd988c9c11e3cab8e5b65fa0d62bcec63ba Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 18:24:40 +0100 Subject: [PATCH 04/30] Remove shard_operation_result --- src/storage/v3/shard_operation_result.hpp | 26 ----------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/storage/v3/shard_operation_result.hpp diff --git a/src/storage/v3/shard_operation_result.hpp b/src/storage/v3/shard_operation_result.hpp deleted file mode 100644 index 8de800b83..000000000 --- a/src/storage/v3/shard_operation_result.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 Memgraph Ltd. -// -// Use of this software is governed by the Business Source License -// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source -// License, and you may not use this file except in compliance with the Business Source License. -// -// As of the Change Date specified in that file, in accordance with -// the Business Source License, use of this software will be governed -// by the Apache License, Version 2.0, included in the file -// licenses/APL.txt. - -#pragma once - -#include - -#include "storage/v3/result.hpp" -#include "storage/v3/schema_validator.hpp" - -namespace memgraph::storage::v3 { - -using ResultErrorType = std::variant; - -template -using ShardOperationResult = utils::BasicResult; - -} // namespace memgraph::storage::v3 From 9c05910e68b2f3dd8bb7fb5f8f5bbb386b566658 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 18:25:12 +0100 Subject: [PATCH 05/30] Adapt storage to new erro handling --- src/storage/v3/bindings/db_accessor.hpp | 10 +-- src/storage/v3/edge_accessor.cpp | 31 +++---- src/storage/v3/edge_accessor.hpp | 10 +-- src/storage/v3/result.hpp | 4 +- src/storage/v3/schema_validator.cpp | 2 +- src/storage/v3/shard.cpp | 42 ++++----- src/storage/v3/shard.hpp | 11 ++- src/storage/v3/shard_rsm.cpp | 98 +++++++------------- src/storage/v3/vertex_accessor.cpp | 113 ++++++++++++------------ src/storage/v3/vertex_accessor.hpp | 48 +++++----- 10 files changed, 170 insertions(+), 199 deletions(-) diff --git a/src/storage/v3/bindings/db_accessor.hpp b/src/storage/v3/bindings/db_accessor.hpp index 186a1b5c5..1a5e846fa 100644 --- a/src/storage/v3/bindings/db_accessor.hpp +++ b/src/storage/v3/bindings/db_accessor.hpp @@ -78,8 +78,8 @@ class DbAccessor final { return VerticesIterable(accessor_->Vertices(label, property, lower, upper, view)); } - storage::v3::Result InsertEdge(VertexAccessor *from, VertexAccessor *to, - const storage::v3::EdgeTypeId &edge_type) { + storage::v3::ShardResult InsertEdge(VertexAccessor *from, VertexAccessor *to, + const storage::v3::EdgeTypeId &edge_type) { static constexpr auto kDummyGid = storage::v3::Gid::FromUint(0); auto maybe_edge = accessor_->CreateEdge(from->Id(storage::v3::View::NEW).GetValue(), to->Id(storage::v3::View::NEW).GetValue(), edge_type, kDummyGid); @@ -87,7 +87,7 @@ class DbAccessor final { return EdgeAccessor(*maybe_edge); } - storage::v3::Result> RemoveEdge(EdgeAccessor *edge) { + storage::v3::ShardResult> RemoveEdge(EdgeAccessor *edge) { auto res = accessor_->DeleteEdge(edge->FromVertex(), edge->ToVertex(), edge->Gid()); if (res.HasError()) { return res.GetError(); @@ -101,7 +101,7 @@ class DbAccessor final { return std::make_optional(*value); } - storage::v3::Result>>> DetachRemoveVertex( + storage::v3::ShardResult>>> DetachRemoveVertex( VertexAccessor *vertex_accessor) { using ReturnType = std::pair>; @@ -125,7 +125,7 @@ class DbAccessor final { return std::make_optional(vertex, std::move(deleted_edges)); } - storage::v3::Result> RemoveVertex(VertexAccessor *vertex_accessor) { + storage::v3::ShardResult> RemoveVertex(VertexAccessor *vertex_accessor) { auto res = accessor_->DeleteVertex(vertex_accessor); if (res.HasError()) { return res.GetError(); diff --git a/src/storage/v3/edge_accessor.cpp b/src/storage/v3/edge_accessor.cpp index ed4abd1fe..95dd6875a 100644 --- a/src/storage/v3/edge_accessor.cpp +++ b/src/storage/v3/edge_accessor.cpp @@ -15,6 +15,7 @@ #include "storage/v3/mvcc.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/schema_validator.hpp" #include "storage/v3/vertex_accessor.hpp" #include "utils/memory_tracker.hpp" @@ -54,13 +55,13 @@ const VertexId &EdgeAccessor::FromVertex() const { return from_vertex_; } const VertexId &EdgeAccessor::ToVertex() const { return to_vertex_; } -Result EdgeAccessor::SetProperty(PropertyId property, const PropertyValue &value) { +ShardResult EdgeAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!config_.properties_on_edges) return Error::PROPERTIES_DISABLED; + if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return Error::DELETED_OBJECT; + if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto current_value = edge_.ptr->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -75,12 +76,12 @@ Result EdgeAccessor::SetProperty(PropertyId property, const Prope return std::move(current_value); } -Result> EdgeAccessor::ClearProperties() { - if (!config_.properties_on_edges) return Error::PROPERTIES_DISABLED; +ShardResult> EdgeAccessor::ClearProperties() { + if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return Error::DELETED_OBJECT; + if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto properties = edge_.ptr->properties.Properties(); for (const auto &property : properties) { @@ -92,11 +93,11 @@ Result> EdgeAccessor::ClearProperties() { return std::move(properties); } -Result EdgeAccessor::GetProperty(View view, PropertyId property) const { +ShardResult EdgeAccessor::GetProperty(View view, PropertyId property) const { return GetProperty(property, view); } -Result EdgeAccessor::GetProperty(PropertyId property, View view) const { +ShardResult EdgeAccessor::GetProperty(PropertyId property, View view) const { if (!config_.properties_on_edges) return PropertyValue(); auto exists = true; auto deleted = edge_.ptr->deleted; @@ -128,12 +129,12 @@ Result EdgeAccessor::GetProperty(PropertyId property, View view) break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(value); } -Result> EdgeAccessor::Properties(View view) const { +ShardResult> EdgeAccessor::Properties(View view) const { if (!config_.properties_on_edges) return std::map{}; auto exists = true; auto deleted = edge_.ptr->deleted; @@ -174,8 +175,8 @@ Result> EdgeAccessor::Properties(View view) break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(properties); } diff --git a/src/storage/v3/edge_accessor.hpp b/src/storage/v3/edge_accessor.hpp index 546a09200..105d28fa4 100644 --- a/src/storage/v3/edge_accessor.hpp +++ b/src/storage/v3/edge_accessor.hpp @@ -56,19 +56,19 @@ class EdgeAccessor final { /// Set a property value and return the old value. /// @throw std::bad_alloc - Result SetProperty(PropertyId property, const PropertyValue &value); + ShardResult SetProperty(PropertyId property, const PropertyValue &value); /// Remove all properties and return old values for each removed property. /// @throw std::bad_alloc - Result> ClearProperties(); + ShardResult> ClearProperties(); /// @throw std::bad_alloc - Result GetProperty(PropertyId property, View view) const; + ShardResult GetProperty(PropertyId property, View view) const; - Result GetProperty(View view, PropertyId property) const; + ShardResult GetProperty(View view, PropertyId property) const; /// @throw std::bad_alloc - Result> Properties(View view) const; + ShardResult> Properties(View view) const; Gid Gid() const noexcept { if (config_.properties_on_edges) { diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index ecec4ad1e..b13677f5d 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -40,6 +40,8 @@ struct ShardError { ShardError(ErrorCode code, std::string message, std::string source) : code{code}, message{std::move(message)}, source{std::move(source)} {} + ShardError(ErrorCode code, std::string source) : code{code}, source{std::move(source)} {} + ErrorCode code; // TODO Maybe add category std::string message; @@ -49,6 +51,6 @@ struct ShardError { #define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, fmt::format("{}:{}", __FILE__, __LINE__)) template -using Result = utils::BasicResult; +using ShardResult = utils::BasicResult; } // namespace memgraph::storage::v3 diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 48fd95eba..64df35a7e 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -94,7 +94,7 @@ std::optional SchemaValidator::ValidateLabelUpdate(const LabelId lab return std::nullopt; } -const Schemas::Schema *SchemaValidator::GetSchema(LabelId label) const { return schemas_.GetSchema(label); } +const Schemas::Schema *SchemaValidator::GetSchema(LabelId label) const { return schemas_->GetSchema(label); } VertexValidator::VertexValidator(const SchemaValidator &schema_validator, const LabelId primary_label) : schema_validator{&schema_validator}, primary_label_{primary_label} {} diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index e4d993ffa..0fafe4bf6 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -33,8 +33,8 @@ #include "storage/v3/mvcc.hpp" #include "storage/v3/name_id_mapper.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/schema_validator.hpp" -#include "storage/v3/shard_operation_result.hpp" #include "storage/v3/transaction.hpp" #include "storage/v3/vertex.hpp" #include "storage/v3/vertex_accessor.hpp" @@ -345,7 +345,7 @@ Shard::~Shard() {} Shard::Accessor::Accessor(Shard &shard, Transaction &transaction) : shard_(&shard), transaction_(&transaction), config_(shard_->config_.items) {} -ShardOperationResult Shard::Accessor::CreateVertexAndValidate( +ShardResult Shard::Accessor::CreateVertexAndValidate( const std::vector &labels, const std::vector &primary_properties, const std::vector> &properties) { OOMExceptionEnabler oom_exception; @@ -364,7 +364,7 @@ ShardOperationResult Shard::Accessor::CreateVertexAndValidate( VertexAccessor vertex_acc{&it->vertex, transaction_, &shard_->indices_, config_, shard_->vertex_validator_}; if (!inserted) { - return {Error::VERTEX_ALREADY_INSERTED}; + return SHARD_ERROR(ErrorCode::VERTEX_ALREADY_INSERTED); } MG_ASSERT(it != acc.end(), "Invalid Vertex accessor!"); @@ -395,19 +395,19 @@ std::optional Shard::Accessor::FindVertex(std::vectorvertex, transaction_, &shard_->indices_, config_, shard_->vertex_validator_, view); } -Result> Shard::Accessor::DeleteVertex(VertexAccessor *vertex) { +ShardResult> Shard::Accessor::DeleteVertex(VertexAccessor *vertex) { MG_ASSERT(vertex->transaction_ == transaction_, "VertexAccessor must be from the same transaction as the storage " "accessor when deleting a vertex!"); auto *vertex_ptr = vertex->vertex_; - if (!PrepareForWrite(transaction_, vertex_ptr)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) { return std::optional{}; } - if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) return Error::VERTEX_HAS_EDGES; + if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) return SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES); CreateAndLinkDelta(transaction_, vertex_ptr, Delta::RecreateObjectTag()); vertex_ptr->deleted = true; @@ -416,7 +416,7 @@ Result> Shard::Accessor::DeleteVertex(VertexAccess shard_->vertex_validator_, true); } -Result>>> Shard::Accessor::DetachDeleteVertex( +ShardResult>>> Shard::Accessor::DetachDeleteVertex( VertexAccessor *vertex) { using ReturnType = std::pair>; @@ -429,7 +429,7 @@ Result>>> Shar std::vector out_edges; { - if (!PrepareForWrite(transaction_, vertex_ptr)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) return std::optional{}; @@ -444,7 +444,7 @@ Result>>> Shar EdgeAccessor e(edge, edge_type, from_vertex, vertex_id, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError() == Error::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError().code == ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } @@ -457,7 +457,7 @@ Result>>> Shar EdgeAccessor e(edge, edge_type, vertex_id, to_vertex, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError() == Error::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError().code == ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } @@ -470,7 +470,7 @@ Result>>> Shar // vertex. Some other transaction could have modified the vertex in the // meantime if we didn't have any edges to delete. - if (!PrepareForWrite(transaction_, vertex_ptr)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); MG_ASSERT(!vertex_ptr->deleted, "Invalid database state!"); @@ -482,8 +482,8 @@ Result>>> Shar std::move(deleted_edges)); } -Result Shard::Accessor::CreateEdge(VertexId from_vertex_id, VertexId to_vertex_id, - const EdgeTypeId edge_type, const Gid gid) { +ShardResult Shard::Accessor::CreateEdge(VertexId from_vertex_id, VertexId to_vertex_id, + const EdgeTypeId edge_type, const Gid gid) { OOMExceptionEnabler oom_exception; Vertex *from_vertex{nullptr}; Vertex *to_vertex{nullptr}; @@ -507,12 +507,12 @@ Result Shard::Accessor::CreateEdge(VertexId from_vertex_id, Vertex } if (from_is_local) { - if (!PrepareForWrite(transaction_, from_vertex)) return Error::SERIALIZATION_ERROR; - if (from_vertex->deleted) return Error::DELETED_OBJECT; + if (!PrepareForWrite(transaction_, from_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (from_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } if (to_is_local && to_vertex != from_vertex) { - if (!PrepareForWrite(transaction_, to_vertex)) return Error::SERIALIZATION_ERROR; - if (to_vertex->deleted) return Error::DELETED_OBJECT; + if (!PrepareForWrite(transaction_, to_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (to_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } EdgeRef edge(gid); @@ -541,8 +541,8 @@ Result Shard::Accessor::CreateEdge(VertexId from_vertex_id, Vertex &shard_->indices_, config_); } -Result> Shard::Accessor::DeleteEdge(VertexId from_vertex_id, VertexId to_vertex_id, - const Gid edge_id) { +ShardResult> Shard::Accessor::DeleteEdge(VertexId from_vertex_id, VertexId to_vertex_id, + const Gid edge_id) { Vertex *from_vertex{nullptr}; Vertex *to_vertex{nullptr}; @@ -567,13 +567,13 @@ Result> Shard::Accessor::DeleteEdge(VertexId from_ve if (from_is_local) { if (!PrepareForWrite(transaction_, from_vertex)) { - return Error::SERIALIZATION_ERROR; + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!from_vertex->deleted, "Invalid database state!"); } if (to_is_local && to_vertex != from_vertex) { if (!PrepareForWrite(transaction_, to_vertex)) { - return Error::SERIALIZATION_ERROR; + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!to_vertex->deleted, "Invalid database state!"); } diff --git a/src/storage/v3/shard.hpp b/src/storage/v3/shard.hpp index 778c92abd..5c025ae57 100644 --- a/src/storage/v3/shard.hpp +++ b/src/storage/v3/shard.hpp @@ -38,7 +38,6 @@ #include "storage/v3/result.hpp" #include "storage/v3/schema_validator.hpp" #include "storage/v3/schemas.hpp" -#include "storage/v3/shard_operation_result.hpp" #include "storage/v3/transaction.hpp" #include "storage/v3/vertex.hpp" #include "storage/v3/vertex_accessor.hpp" @@ -207,7 +206,7 @@ class Shard final { public: /// @throw std::bad_alloc - ShardOperationResult CreateVertexAndValidate( + ShardResult CreateVertexAndValidate( const std::vector &labels, const std::vector &primary_properties, const std::vector> &properties); @@ -262,19 +261,19 @@ class Shard final { /// @return Accessor to the deleted vertex if a deletion took place, std::nullopt otherwise /// @throw std::bad_alloc - Result> DeleteVertex(VertexAccessor *vertex); + ShardResult> DeleteVertex(VertexAccessor *vertex); /// @return Accessor to the deleted vertex and deleted edges if a deletion took place, std::nullopt otherwise /// @throw std::bad_alloc - Result>>> DetachDeleteVertex( + ShardResult>>> DetachDeleteVertex( VertexAccessor *vertex); /// @throw std::bad_alloc - Result CreateEdge(VertexId from_vertex_id, VertexId to_vertex_id, EdgeTypeId edge_type, Gid gid); + ShardResult CreateEdge(VertexId from_vertex_id, VertexId to_vertex_id, EdgeTypeId edge_type, Gid gid); /// Accessor to the deleted edge if a deletion took place, std::nullopt otherwise /// @throw std::bad_alloc - Result> DeleteEdge(VertexId from_vertex_id, VertexId to_vertex_id, Gid edge_id); + ShardResult> DeleteEdge(VertexId from_vertex_id, VertexId to_vertex_id, Gid edge_id); LabelId NameToLabel(std::string_view name) const; diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index f288e5e27..f3d879ef4 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -34,6 +34,7 @@ #include "storage/v3/key_store.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/request_helper.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/schemas.hpp" #include "storage/v3/shard.hpp" #include "storage/v3/shard_rsm.hpp" @@ -468,6 +469,37 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { return edge_filler; } +void LogResultError(const ShardError &error, const std::string_view action = "") { + switch (error.code) { + case ErrorCode::DELETED_OBJECT: + spdlog::debug("{} failed with error: DELETED_OBJECT, at {}", action, error.source); + break; + case ErrorCode::NONEXISTENT_OBJECT: + spdlog::debug("{} failed with error: NONEXISTENT_OBJECT, at {}", action, error.source); + break; + case ErrorCode::SERIALIZATION_ERROR: + spdlog::debug("{} failed with error: SERIALIZATION_ERROR, at {}", action, error.source); + break; + case ErrorCode::PROPERTIES_DISABLED: + spdlog::debug("{} failed with error: PROPERTIES_DISABLED, at {}", action, error.source); + break; + case ErrorCode::VERTEX_HAS_EDGES: + spdlog::debug("{} failed with error: VERTEX_HAS_EDGES, at {}", action, error.source); + break; + case ErrorCode::VERTEX_ALREADY_INSERTED: + spdlog::debug("{} failed with error: VERTEX_ALREADY_INSERTED, at {}", action, error.source); + break; + case ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + case ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + case ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + case ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + spdlog::debug("Schema violation: {} at {}", error.message, error.source); + break; + } +} + }; // namespace msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); @@ -494,38 +526,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { if (result_schema.HasError()) { auto &error = result_schema.GetError(); - - std::visit( - [](T &&error) { - using ErrorType = std::remove_cvref_t; - if constexpr (std::is_same_v) { - spdlog::debug("Creating vertex failed with error: SchemaViolation"); - } else if constexpr (std::is_same_v) { - switch (error) { - case Error::DELETED_OBJECT: - spdlog::debug("Creating vertex failed with error: DELETED_OBJECT"); - break; - case Error::NONEXISTENT_OBJECT: - spdlog::debug("Creating vertex failed with error: NONEXISTENT_OBJECT"); - break; - case Error::SERIALIZATION_ERROR: - spdlog::debug("Creating vertex failed with error: SERIALIZATION_ERROR"); - break; - case Error::PROPERTIES_DISABLED: - spdlog::debug("Creating vertex failed with error: PROPERTIES_DISABLED"); - break; - case Error::VERTEX_HAS_EDGES: - spdlog::debug("Creating vertex failed with error: VERTEX_HAS_EDGES"); - break; - case Error::VERTEX_ALREADY_INSERTED: - spdlog::debug("Creating vertex failed with error: VERTEX_ALREADY_INSERTED"); - break; - } - } else { - static_assert(kAlwaysFalse, "Missing type from variant visitor"); - } - }, - error); + spdlog::debug("Creating vertex failed with error: VERTEX_ALREADY_INSERTED"); action_successful = false; break; @@ -558,38 +559,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { vertex_to_update->SetPropertyAndValidate(update_prop.first, ToPropertyValue(std::move(update_prop.second))); if (result_schema.HasError()) { auto &error = result_schema.GetError(); - - std::visit( - [](T &&error) { - using ErrorType = std::remove_cvref_t; - if constexpr (std::is_same_v) { - spdlog::debug("Updating vertex failed with error: SchemaViolation"); - } else if constexpr (std::is_same_v) { - switch (error) { - case Error::DELETED_OBJECT: - spdlog::debug("Updating vertex failed with error: DELETED_OBJECT"); - break; - case Error::NONEXISTENT_OBJECT: - spdlog::debug("Updating vertex failed with error: NONEXISTENT_OBJECT"); - break; - case Error::SERIALIZATION_ERROR: - spdlog::debug("Updating vertex failed with error: SERIALIZATION_ERROR"); - break; - case Error::PROPERTIES_DISABLED: - spdlog::debug("Updating vertex failed with error: PROPERTIES_DISABLED"); - break; - case Error::VERTEX_HAS_EDGES: - spdlog::debug("Updating vertex failed with error: VERTEX_HAS_EDGES"); - break; - case Error::VERTEX_ALREADY_INSERTED: - spdlog::debug("Updating vertex failed with error: VERTEX_ALREADY_INSERTED"); - break; - } - } else { - static_assert(kAlwaysFalse, "Missing type from variant visitor"); - } - }, - error); + LogResultError(error); action_successful = false; diff --git a/src/storage/v3/vertex_accessor.cpp b/src/storage/v3/vertex_accessor.cpp index 543caa88a..6949c08cc 100644 --- a/src/storage/v3/vertex_accessor.cpp +++ b/src/storage/v3/vertex_accessor.cpp @@ -21,8 +21,8 @@ #include "storage/v3/key_store.hpp" #include "storage/v3/mvcc.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "storage/v3/shard.hpp" -#include "storage/v3/shard_operation_result.hpp" #include "storage/v3/vertex.hpp" #include "utils/logging.hpp" #include "utils/memory_tracker.hpp" @@ -80,12 +80,12 @@ bool VertexAccessor::IsVisible(View view) const { return exists && (for_deleted_ || !deleted); } -Result VertexAccessor::AddLabel(LabelId label) { +ShardResult VertexAccessor::AddLabel(LabelId label) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return Error::DELETED_OBJECT; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -98,15 +98,15 @@ Result VertexAccessor::AddLabel(LabelId label) { return true; } -ShardOperationResult VertexAccessor::AddLabelAndValidate(LabelId label) { +ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { if (const auto maybe_violation_error = vertex_validator_->ValidateAddLabel(label); maybe_violation_error) { return {*maybe_violation_error}; } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return {Error::SERIALIZATION_ERROR}; + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return {Error::DELETED_OBJECT}; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -119,10 +119,10 @@ ShardOperationResult VertexAccessor::AddLabelAndValidate(LabelId label) { return true; } -Result VertexAccessor::RemoveLabel(LabelId label) { - if (!PrepareForWrite(transaction_, vertex_)) return Error::SERIALIZATION_ERROR; +ShardResult VertexAccessor::RemoveLabel(LabelId label) { + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return Error::DELETED_OBJECT; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -134,14 +134,14 @@ Result VertexAccessor::RemoveLabel(LabelId label) { return true; } -ShardOperationResult VertexAccessor::RemoveLabelAndValidate(LabelId label) { +ShardResult VertexAccessor::RemoveLabelAndValidate(LabelId label) { if (const auto maybe_violation_error = vertex_validator_->ValidateRemoveLabel(label); maybe_violation_error) { return {*maybe_violation_error}; } - if (!PrepareForWrite(transaction_, vertex_)) return {Error::SERIALIZATION_ERROR}; + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return {Error::DELETED_OBJECT}; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -153,9 +153,9 @@ ShardOperationResult VertexAccessor::RemoveLabelAndValidate(LabelId label) return true; } -Result VertexAccessor::HasLabel(View view, LabelId label) const { return HasLabel(label, view); } +ShardResult VertexAccessor::HasLabel(View view, LabelId label) const { return HasLabel(label, view); } -Result VertexAccessor::HasLabel(LabelId label, View view) const { +ShardResult VertexAccessor::HasLabel(LabelId label, View view) const { bool exists = true; bool deleted = false; bool has_label = false; @@ -197,12 +197,12 @@ Result VertexAccessor::HasLabel(LabelId label, View view) const { break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return has_label; } -Result VertexAccessor::PrimaryLabel(const View view) const { +ShardResult VertexAccessor::PrimaryLabel(const View view) const { if (const auto result = CheckVertexExistence(view); result.HasError()) { return result.GetError(); } @@ -210,21 +210,21 @@ Result VertexAccessor::PrimaryLabel(const View view) const { return vertex_validator_->primary_label_; } -Result VertexAccessor::PrimaryKey(const View view) const { +ShardResult VertexAccessor::PrimaryKey(const View view) const { if (const auto result = CheckVertexExistence(view); result.HasError()) { return result.GetError(); } return vertex_->keys.Keys(); } -Result VertexAccessor::Id(View view) const { +ShardResult VertexAccessor::Id(View view) const { if (const auto result = CheckVertexExistence(view); result.HasError()) { return result.GetError(); } return VertexId{vertex_validator_->primary_label_, vertex_->keys.Keys()}; }; -Result> VertexAccessor::Labels(View view) const { +ShardResult> VertexAccessor::Labels(View view) const { bool exists = true; bool deleted = false; std::vector labels; @@ -267,17 +267,17 @@ Result> VertexAccessor::Labels(View view) const { break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(labels); } -Result VertexAccessor::SetProperty(PropertyId property, const PropertyValue &value) { +ShardResult VertexAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return Error::SERIALIZATION_ERROR; + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return Error::DELETED_OBJECT; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto current_value = vertex_->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -294,7 +294,7 @@ Result VertexAccessor::SetProperty(PropertyId property, const Pro return std::move(current_value); } -Result VertexAccessor::CheckVertexExistence(View view) const { +ShardResult VertexAccessor::CheckVertexExistence(View view) const { bool exists = true; bool deleted = false; Delta *delta = nullptr; @@ -323,27 +323,26 @@ Result VertexAccessor::CheckVertexExistence(View view) const { } }); if (!exists) { - return Error::NONEXISTENT_OBJECT; + return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); } if (!for_deleted_ && deleted) { - return Error::DELETED_OBJECT; + return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } return {}; } -ShardOperationResult VertexAccessor::SetPropertyAndValidate(PropertyId property, - const PropertyValue &value) { +ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId property, const PropertyValue &value) { if (auto maybe_violation_error = vertex_validator_->ValidatePropertyUpdate(property); maybe_violation_error) { return {*maybe_violation_error}; } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; if (!PrepareForWrite(transaction_, vertex_)) { - return {Error::SERIALIZATION_ERROR}; + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } if (vertex_->deleted) { - return {Error::DELETED_OBJECT}; + return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } auto current_value = vertex_->properties.GetProperty(property); @@ -361,10 +360,10 @@ ShardOperationResult VertexAccessor::SetPropertyAndValidate(Prope return std::move(current_value); } -Result> VertexAccessor::ClearProperties() { - if (!PrepareForWrite(transaction_, vertex_)) return Error::SERIALIZATION_ERROR; +ShardResult> VertexAccessor::ClearProperties() { + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return Error::DELETED_OBJECT; + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto properties = vertex_->properties.Properties(); for (const auto &property : properties) { @@ -377,7 +376,7 @@ Result> VertexAccessor::ClearProperties() { return std::move(properties); } -Result VertexAccessor::GetProperty(View view, PropertyId property) const { +ShardResult VertexAccessor::GetProperty(View view, PropertyId property) const { return GetProperty(property, view).GetValue(); } @@ -407,7 +406,7 @@ PropertyValue VertexAccessor::GetPropertyValue(PropertyId property, View view) c return value; } -Result VertexAccessor::GetProperty(PropertyId property, View view) const { +ShardResult VertexAccessor::GetProperty(PropertyId property, View view) const { bool exists = true; bool deleted = false; PropertyValue value; @@ -442,12 +441,12 @@ Result VertexAccessor::GetProperty(PropertyId property, View view break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(value); } -Result> VertexAccessor::Properties(View view) const { +ShardResult> VertexAccessor::Properties(View view) const { bool exists = true; bool deleted = false; std::map properties; @@ -492,13 +491,13 @@ Result> VertexAccessor::Properties(View view break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(properties); } -Result> VertexAccessor::InEdges(View view, const std::vector &edge_types, - const VertexId *destination_id) const { +ShardResult> VertexAccessor::InEdges(View view, const std::vector &edge_types, + const VertexId *destination_id) const { bool exists = true; bool deleted = false; std::vector in_edges; @@ -564,8 +563,8 @@ Result> VertexAccessor::InEdges(View view, const std:: break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); std::vector ret; if (in_edges.empty()) { return ret; @@ -579,8 +578,8 @@ Result> VertexAccessor::InEdges(View view, const std:: return ret; } -Result> VertexAccessor::OutEdges(View view, const std::vector &edge_types, - const VertexId *destination_id) const { +ShardResult> VertexAccessor::OutEdges(View view, const std::vector &edge_types, + const VertexId *destination_id) const { bool exists = true; bool deleted = false; std::vector out_edges; @@ -644,8 +643,8 @@ Result> VertexAccessor::OutEdges(View view, const std: break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); std::vector ret; if (out_edges.empty()) { return ret; @@ -659,7 +658,7 @@ Result> VertexAccessor::OutEdges(View view, const std: return ret; } -Result VertexAccessor::InDegree(View view) const { +ShardResult VertexAccessor::InDegree(View view) const { bool exists = true; bool deleted = false; size_t degree = 0; @@ -691,12 +690,12 @@ Result VertexAccessor::InDegree(View view) const { break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return degree; } -Result VertexAccessor::OutDegree(View view) const { +ShardResult VertexAccessor::OutDegree(View view) const { bool exists = true; bool deleted = false; size_t degree = 0; @@ -728,8 +727,8 @@ Result VertexAccessor::OutDegree(View view) const { break; } }); - if (!exists) return Error::NONEXISTENT_OBJECT; - if (!for_deleted_ && deleted) return Error::DELETED_OBJECT; + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return degree; } diff --git a/src/storage/v3/vertex_accessor.hpp b/src/storage/v3/vertex_accessor.hpp index 682a04e39..20ee9955b 100644 --- a/src/storage/v3/vertex_accessor.hpp +++ b/src/storage/v3/vertex_accessor.hpp @@ -17,7 +17,7 @@ #include "storage/v3/id_types.hpp" #include "storage/v3/key_store.hpp" #include "storage/v3/result.hpp" -#include "storage/v3/shard_operation_result.hpp" +#include "storage/v3/schema_validator.hpp" #include "storage/v3/transaction.hpp" #include "storage/v3/vertex.hpp" #include "storage/v3/vertex_id.hpp" @@ -55,61 +55,61 @@ class VertexAccessor final { /// `false` is returned if the label already existed, or SchemaViolation /// if adding the label has violated one of the schema constraints. /// @throw std::bad_alloc - ShardOperationResult AddLabelAndValidate(LabelId label); + ShardResult AddLabelAndValidate(LabelId label); /// Remove a label and return `true` if deletion took place. /// `false` is returned if the vertex did not have a label already. or SchemaViolation /// if adding the label has violated one of the schema constraints. /// @throw std::bad_alloc - ShardOperationResult RemoveLabelAndValidate(LabelId label); + ShardResult RemoveLabelAndValidate(LabelId label); - Result HasLabel(View view, LabelId label) const; + ShardResult HasLabel(View view, LabelId label) const; - Result HasLabel(LabelId label, View view) const; + ShardResult HasLabel(LabelId label, View view) const; /// @throw std::bad_alloc /// @throw std::length_error if the resulting vector exceeds /// std::vector::max_size(). - Result> Labels(View view) const; + ShardResult> Labels(View view) const; - Result PrimaryLabel(View view) const; + ShardResult PrimaryLabel(View view) const; - Result PrimaryKey(View view) const; + ShardResult PrimaryKey(View view) const; - Result Id(View view) const; + ShardResult Id(View view) const; /// Set a property value and return the old value or error. /// @throw std::bad_alloc - ShardOperationResult SetPropertyAndValidate(PropertyId property, const PropertyValue &value); + ShardResult SetPropertyAndValidate(PropertyId property, const PropertyValue &value); /// Remove all properties and return the values of the removed properties. /// @throw std::bad_alloc - Result> ClearProperties(); + ShardResult> ClearProperties(); /// @throw std::bad_alloc - Result GetProperty(PropertyId property, View view) const; + ShardResult GetProperty(PropertyId property, View view) const; // TODO Remove this - Result GetProperty(View view, PropertyId property) const; + ShardResult GetProperty(View view, PropertyId property) const; /// @throw std::bad_alloc - Result> Properties(View view) const; + ShardResult> Properties(View view) const; /// @throw std::bad_alloc /// @throw std::length_error if the resulting vector exceeds /// std::vector::max_size(). - Result> InEdges(View view, const std::vector &edge_types = {}, - const VertexId *destination_id = nullptr) const; + ShardResult> InEdges(View view, const std::vector &edge_types = {}, + const VertexId *destination_id = nullptr) const; /// @throw std::bad_alloc /// @throw std::length_error if the resulting vector exceeds /// std::vector::max_size(). - Result> OutEdges(View view, const std::vector &edge_types = {}, - const VertexId *destination_id = nullptr) const; + ShardResult> OutEdges(View view, const std::vector &edge_types = {}, + const VertexId *destination_id = nullptr) const; - Result InDegree(View view) const; + ShardResult InDegree(View view) const; - Result OutDegree(View view) const; + ShardResult OutDegree(View view) const; const SchemaValidator *GetSchemaValidator() const; @@ -122,20 +122,20 @@ class VertexAccessor final { /// Add a label and return `true` if insertion took place. /// `false` is returned if the label already existed. /// @throw std::bad_alloc - Result AddLabel(LabelId label); + ShardResult AddLabel(LabelId label); /// Remove a label and return `true` if deletion took place. /// `false` is returned if the vertex did not have a label already. /// @throw std::bad_alloc - Result RemoveLabel(LabelId label); + ShardResult RemoveLabel(LabelId label); /// Set a property value and return the old value. /// @throw std::bad_alloc - Result SetProperty(PropertyId property, const PropertyValue &value); + ShardResult SetProperty(PropertyId property, const PropertyValue &value); PropertyValue GetPropertyValue(PropertyId property, View view) const; - Result CheckVertexExistence(View view) const; + ShardResult CheckVertexExistence(View view) const; Vertex *vertex_; Transaction *transaction_; From 5656a24c9638e1715cc31820774b10b1b01f9982 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 18:25:25 +0100 Subject: [PATCH 06/30] Remove unused exception --- src/query/v2/exceptions.hpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/query/v2/exceptions.hpp b/src/query/v2/exceptions.hpp index 959672eae..e0802a6cc 100644 --- a/src/query/v2/exceptions.hpp +++ b/src/query/v2/exceptions.hpp @@ -224,12 +224,4 @@ class VersionInfoInMulticommandTxException : public QueryException { : QueryException("Version info query not allowed in multicommand transactions.") {} }; -/** - * An exception for an illegal operation that violates schema - */ -class SchemaViolationException : public QueryRuntimeException { - public: - using QueryRuntimeException::QueryRuntimeException; -}; - } // namespace memgraph::query::v2 From 3f97a1349347be6da00dd1ecbb3eb59954f9367b Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 18:30:25 +0100 Subject: [PATCH 07/30] Revert TError to Error --- src/expr/interpret/eval.hpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/expr/interpret/eval.hpp b/src/expr/interpret/eval.hpp index d105eeefb..04676dd7b 100644 --- a/src/expr/interpret/eval.hpp +++ b/src/expr/interpret/eval.hpp @@ -32,7 +32,7 @@ struct StorageTag {}; struct QueryEngineTag {}; template + typename PropertyValue, typename ConvFunctor, typename Error, typename Tag = StorageTag> class ExpressionEvaluator : public ExpressionVisitor { public: ExpressionEvaluator(Frame *frame, const SymbolTable &symbol_table, const EvaluationContext &ctx, @@ -100,23 +100,23 @@ class ExpressionEvaluator : public ExpressionVisitor { #undef BINARY_OPERATOR_VISITOR #undef UNARY_OPERATOR_VISITOR - void HandleShardError(TError &shard_error, const std::string_view accessed_object) { + void HandleShardError(Error &shard_error, const std::string_view accessed_object) { switch (shard_error) { - case TError::DELETED_OBJECT: + case Error::DELETED_OBJECT: throw ExpressionRuntimeException("Trying to access {} on a deleted object.", accessed_object); - case TError::NONEXISTENT_OBJECT: + case Error::NONEXISTENT_OBJECT: throw ExpressionRuntimeException("Trying to access {} from a node object doesn't exist.", accessed_object); - case TError::SERIALIZATION_ERROR: - case TError::VERTEX_HAS_EDGES: - case TError::PROPERTIES_DISABLED: - case TError::VERTEX_ALREADY_INSERTED: + case Error::SERIALIZATION_ERROR: + case Error::VERTEX_HAS_EDGES: + case Error::PROPERTIES_DISABLED: + case Error::VERTEX_ALREADY_INSERTED: throw ExpressionRuntimeException("Unexpected error when accessing {}.", accessed_object); - case TError::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case TError::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case TError::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case TError::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case TError::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case TError::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + case Error::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + case Error::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + case Error::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + case Error::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + case Error::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + case Error::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: throw ExpressionRuntimeException("Unexpected schema violation when accessing {}.", accessed_object); } } @@ -406,7 +406,7 @@ class ExpressionEvaluator : public ExpressionVisitor { typename TReturnType = std::enable_if_t, bool>> TReturnType HasLabelImpl(const VertexAccessor &vertex, const LabelIx &label, StorageTag /*tag*/) { auto has_label = vertex.HasLabel(view_, GetLabel(label)); - if (has_label.HasError() && has_label.GetError().code == TError::NONEXISTENT_OBJECT) { + if (has_label.HasError() && has_label.GetError().code == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE // work. The old storage had the following logic when returning an // `OLD` view: `return old ? old : new`. That means that if the @@ -745,7 +745,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, PropertyIx prop) { auto maybe_prop = record_accessor.GetProperty(view_, ctx_->properties[prop.ix]); - if (maybe_prop.HasError() && maybe_prop.GetError().code == TError::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError().code == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't @@ -764,7 +764,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, const std::string_view name) { auto maybe_prop = record_accessor.GetProperty(view_, dba_->NameToProperty(name)); - if (maybe_prop.HasError() && maybe_prop.GetError().code == TError::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError().code == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't From 1c94c59a2413952997e9bfc7e18ed35bde5dbea2 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 19:05:20 +0100 Subject: [PATCH 08/30] Fix tests --- src/query/v2/db_accessor.hpp | 1 - src/storage/v3/result.hpp | 2 + tests/unit/storage_v3.cpp | 114 +++++++++------------ tests/unit/storage_v3_edge.cpp | 13 ++- tests/unit/storage_v3_schema.cpp | 36 +++---- tests/unit/storage_v3_vertex_accessors.cpp | 24 ++--- 6 files changed, 77 insertions(+), 113 deletions(-) diff --git a/src/query/v2/db_accessor.hpp b/src/query/v2/db_accessor.hpp index b76da6131..11118a899 100644 --- a/src/query/v2/db_accessor.hpp +++ b/src/query/v2/db_accessor.hpp @@ -23,7 +23,6 @@ #include "storage/v3/key_store.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/result.hpp" -#include "storage/v3/shard_operation_result.hpp" /////////////////////////////////////////////////////////// // Our communication layer and query engine don't mix diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index b13677f5d..4ba64cf02 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -46,6 +46,8 @@ struct ShardError { // TODO Maybe add category std::string message; std::string source; + + inline friend bool operator==(const ShardError &lhs, const ShardError &rhs) { return lhs.code == rhs.code; } }; #define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, fmt::format("{}:{}", __FILE__, __LINE__)) diff --git a/tests/unit/storage_v3.cpp b/tests/unit/storage_v3.cpp index b107786e8..cd524cf41 100644 --- a/tests/unit/storage_v3.cpp +++ b/tests/unit/storage_v3.cpp @@ -579,7 +579,7 @@ TEST_P(StorageV3, VertexDeleteSerializationError) { EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); auto res = acc2.DeleteVertex(&*vertex); ASSERT_TRUE(res.HasError()); - ASSERT_EQ(res.GetError(), Error::SERIALIZATION_ERROR); + ASSERT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); EXPECT_EQ(CountVertices(acc2, View::OLD), 1U); EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); acc2.AdvanceCommand(); @@ -660,12 +660,11 @@ TEST_P(StorageV3, VertexDeleteSpecialCases) { } } -template -void AssertErrorInVariant(TResultHolder &holder, TError error_type) { - ASSERT_TRUE(holder.HasError()); - const auto error = holder.GetError(); - ASSERT_TRUE(std::holds_alternative(error)); - ASSERT_EQ(std::get(error), error_type); +template +void AssertShardErrorEqual(const ShardResult &lhs, const ShardError &rhs) { + ASSERT_TRUE(lhs.HasError()); + const auto error = lhs.GetError(); + ASSERT_EQ(error, rhs); } // NOLINTNEXTLINE(hicpp-special-member-functions) @@ -711,20 +710,20 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_FALSE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Labels(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -779,33 +778,33 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_TRUE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto labels = vertex->Labels(View::OLD).GetValue(); ASSERT_EQ(labels.size(), 1); ASSERT_EQ(labels[0], label5); } - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether label 5 exists - ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->Labels(View::OLD).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -855,14 +854,14 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether label 5 exists ASSERT_TRUE(vertex->GetProperty(property5, View::OLD)->IsNull()); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Properties(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to set the property5 { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -918,27 +917,27 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether property 5 exists ASSERT_EQ(vertex->GetProperty(property5, View::OLD)->ValueString(), "nandare"); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto properties = vertex->Properties(View::OLD).GetValue(); ASSERT_EQ(properties.size(), 1); ASSERT_EQ(properties[property5].ValueString(), "nandare"); } - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether property 5 exists - ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->Properties(View::OLD).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to set the property { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertErrorInVariant(ret, Error::DELETED_OBJECT); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -1371,7 +1370,7 @@ TEST_P(StorageV3, VertexLabelSerializationError) { { auto res = vertex->AddLabelAndValidate(label1); - AssertErrorInVariant(res, Error::SERIALIZATION_ERROR); + AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); } } @@ -1865,7 +1864,7 @@ TEST_P(StorageV3, VertexPropertySerializationError) { { auto res = vertex->SetPropertyAndValidate(property2, PropertyValue("nandare")); - AssertErrorInVariant(res, Error::SERIALIZATION_ERROR); + AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); } } @@ -2255,14 +2254,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{0}, {}); // Check state before (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); // Check state before (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 0); @@ -2282,14 +2281,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { .HasValue()); // Check state after (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), Error::NONEXISTENT_OBJECT); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); // Check state after (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 1); @@ -2657,42 +2656,31 @@ TEST_P(StorageV3, TestCreateVertexAndValidate) { ASSERT_TRUE(vertex2.HasError()); auto error = vertex2.GetError(); - auto error_ptr = std::get_if(&error); - ASSERT_TRUE(error_ptr); - ASSERT_TRUE(*error_ptr == storage::v3::Error::VERTEX_ALREADY_INSERTED); + ASSERT_TRUE(error.code == storage::v3::ErrorCode::VERTEX_ALREADY_INSERTED); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - ASSERT_TRUE(std::holds_alternative(vertex.GetError())); - EXPECT_EQ(std::get(vertex.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, primary_label)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - ASSERT_TRUE(std::holds_alternative(vertex.GetError())); - EXPECT_EQ(std::get(vertex.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, primary_label)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {}, {}); ASSERT_TRUE(vertex.HasError()); - ASSERT_TRUE(std::holds_alternative(vertex.GetError())); - EXPECT_EQ(std::get(vertex.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PRIMARY_PROPERTIES_UNDEFINED, primary_label)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {PropertyValue{"test"}}, {}); ASSERT_TRUE(vertex.HasError()); - ASSERT_TRUE(std::holds_alternative(vertex.GetError())); - EXPECT_EQ(std::get(vertex.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PROPERTY_WRONG_TYPE, primary_label, - {primary_property, common::SchemaType::INT}, PropertyValue("test"))); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } } } // namespace memgraph::storage::v3::tests diff --git a/tests/unit/storage_v3_edge.cpp b/tests/unit/storage_v3_edge.cpp index 21c4214ce..64f7f4e2e 100644 --- a/tests/unit/storage_v3_edge.cpp +++ b/tests/unit/storage_v3_edge.cpp @@ -18,7 +18,6 @@ #include "storage/v3/name_id_mapper.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/shard.hpp" -#include "storage/v3/shard_operation_result.hpp" namespace memgraph::storage::v3::tests { using testing::UnorderedElementsAre; @@ -39,7 +38,7 @@ class StorageEdgeTest : public ::testing::TestWithParam { return store.NameToEdgeType(edge_type_name); } - static ShardOperationResult CreateVertex(Shard::Accessor &acc, const PropertyValue &key) { + static ShardResult CreateVertex(Shard::Accessor &acc, const PropertyValue &key) { return acc.CreateVertexAndValidate({}, {key}, {}); } @@ -3243,7 +3242,7 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { { auto ret = acc.DeleteVertex(&vertex_from.value()); ASSERT_TRUE(ret.HasError()); - ASSERT_EQ(ret.GetError(), Error::VERTEX_HAS_EDGES); + ASSERT_EQ(ret.GetError(), SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES)); } // Detach delete vertex @@ -3256,8 +3255,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { // Check edges ASSERT_EQ(vertex_from->InEdges(View::OLD)->size(), 0); ASSERT_EQ(*vertex_from->InDegree(View::OLD), 0); - ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto ret = vertex_from->OutEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); @@ -3270,8 +3269,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { ASSERT_EQ(e.FromVertex(), from_id); ASSERT_EQ(e.ToVertex(), to_id); } - ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), Error::DELETED_OBJECT); - ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), Error::DELETED_OBJECT); + ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto ret = vertex_to->InEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index c36b92bc3..2189521ca 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -162,9 +162,8 @@ class SchemaValidatorTest : public testing::Test { PropertyId NameToProperty(const std::string &name) { return PropertyId::FromUint(id_mapper_.NameToId(name)); } - protected: Schemas schemas; - SchemaValidator schema_validator{schemas}; + SchemaValidator schema_validator{schemas, id_mapper_}; PropertyId prop_string{NameToProperty("prop1")}; PropertyId prop_int{NameToProperty("prop2")}; PropertyId prop_duration{NameToProperty("prop3")}; @@ -180,50 +179,43 @@ TEST_F(SchemaValidatorTest, TestSchemaValidateVertexCreate) { { const auto schema_violation = schema_validator.ValidateVertexCreate(NameToLabel("test"), {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::NO_SCHEMA_DEFINED_FOR_LABEL, NameToLabel("test"))); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PRIMARY_PROPERTIES_UNDEFINED, label2)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } // Validate wrong secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label1}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, label1)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label2}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, label2)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } // Validate wrong property type { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PROPERTY_WRONG_TYPE, label1, - schema_prop_string, PropertyValue(1))); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PROPERTY_WRONG_TYPE, label2, - schema_prop_duration, PropertyValue(1))); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto wrong_prop = PropertyValue(TemporalData(TemporalType::Date, 1234)); const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), wrong_prop}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_PROPERTY_WRONG_TYPE, label2, - schema_prop_duration, wrong_prop)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } // Passing validations EXPECT_EQ(schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue("test")}), std::nullopt); @@ -245,14 +237,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdate) { { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label1, prop_string); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_KEY, label1, - schema_prop_string)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label2, prop_duration); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_KEY, label2, - schema_prop_duration)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_int), std::nullopt); EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_duration), std::nullopt); @@ -264,14 +254,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdateLabel) { { const auto schema_violation = schema_validator.ValidateLabelUpdate(label1); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_LABEL, label1)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } { const auto schema_violation = schema_validator.ValidateLabelUpdate(label2); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_LABEL, label2)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } EXPECT_EQ(schema_validator.ValidateLabelUpdate(NameToLabel("test")), std::nullopt); } diff --git a/tests/unit/storage_v3_vertex_accessors.cpp b/tests/unit/storage_v3_vertex_accessors.cpp index 683f58a56..3ba8def82 100644 --- a/tests/unit/storage_v3_vertex_accessors.cpp +++ b/tests/unit/storage_v3_vertex_accessors.cpp @@ -76,7 +76,7 @@ TEST_F(StorageV3Accessor, TestPrimaryLabel) { ASSERT_TRUE(vertex.PrimaryLabel(View::OLD).HasError()); const auto error_primary_label = vertex.PrimaryLabel(View::OLD).GetError(); ASSERT_FALSE(vertex.PrimaryLabel(View::NEW).HasError()); - EXPECT_EQ(error_primary_label, Error::NONEXISTENT_OBJECT); + EXPECT_EQ(error_primary_label, SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); } { auto acc = storage.Access(GetNextHlc()); @@ -127,9 +127,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { const auto label1 = NameToLabelId("label"); auto vertex = acc.CreateVertexAndValidate({label1}, {PropertyValue{2}}, {}); ASSERT_TRUE(vertex.HasError()); - ASSERT_TRUE(std::holds_alternative(vertex.GetError())); - EXPECT_EQ(std::get(vertex.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_SECONDARY_LABEL_IS_PRIMARY, label1)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = storage.Access(GetNextHlc()); @@ -138,9 +136,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { ASSERT_TRUE(vertex.HasValue()); const auto schema_violation = vertex->AddLabelAndValidate(label1); ASSERT_TRUE(schema_violation.HasError()); - ASSERT_TRUE(std::holds_alternative(schema_violation.GetError())); - EXPECT_EQ(std::get(schema_violation.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_LABEL, label1)); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -184,9 +180,7 @@ TEST_F(StorageV3Accessor, TestRemoveLabels) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res1 = vertex.RemoveLabelAndValidate(primary_label); ASSERT_TRUE(res1.HasError()); - ASSERT_TRUE(std::holds_alternative(res1.GetError())); - EXPECT_EQ(std::get(res1.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_LABEL, primary_label)); + EXPECT_EQ(res1.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -205,20 +199,14 @@ TEST_F(StorageV3Accessor, TestSetKeysAndProperties) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{1}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue(1)); ASSERT_TRUE(res.HasError()); - ASSERT_TRUE(std::holds_alternative(res.GetError())); - EXPECT_EQ(std::get(res.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_KEY, primary_label, - SchemaProperty{primary_property, common::SchemaType::INT})); + EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { auto acc = storage.Access(GetNextHlc()); auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue()); ASSERT_TRUE(res.HasError()); - ASSERT_TRUE(std::holds_alternative(res.GetError())); - EXPECT_EQ(std::get(res.GetError()), - SchemaViolation(SchemaViolation::ValidationStatus::VERTEX_UPDATE_PRIMARY_KEY, primary_label, - SchemaProperty{primary_property, common::SchemaType::INT})); + EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } } From 8629ee5ebcfa87258b00de437b669000b077bac6 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 19:30:34 +0100 Subject: [PATCH 09/30] Fix query v2 --- src/query/v2/common.hpp | 25 ++------------- src/query/v2/db_accessor.hpp | 56 ++++++++++++++++------------------ src/query/v2/plan/operator.cpp | 24 ++++++++++----- 3 files changed, 44 insertions(+), 61 deletions(-) diff --git a/src/query/v2/common.hpp b/src/query/v2/common.hpp index 55c60ce10..774a90a37 100644 --- a/src/query/v2/common.hpp +++ b/src/query/v2/common.hpp @@ -28,7 +28,6 @@ #include "storage/v3/id_types.hpp" #include "storage/v3/property_value.hpp" #include "storage/v3/result.hpp" -#include "storage/v3/shard_operation_result.hpp" #include "storage/v3/view.hpp" #include "utils/exceptions.hpp" #include "utils/logging.hpp" @@ -85,7 +84,7 @@ inline void ExpectType(const Symbol &symbol, const TypedValue &value, TypedValue template concept AccessorWithSetProperty = requires(T accessor, const storage::v3::PropertyId key, const storage::v3::PropertyValue new_value) { - { accessor.SetProperty(key, new_value) } -> std::same_as>; + { accessor.SetProperty(key, new_value) } -> std::same_as>; }; template @@ -93,28 +92,8 @@ concept AccessorWithSetPropertyAndValidate = requires(T accessor, const storage: const storage::v3::PropertyValue new_value) { { accessor.SetPropertyAndValidate(key, new_value) - } -> std::same_as>; + } -> std::same_as>; }; -template -concept RecordAccessor = - AccessorWithSetProperty || AccessorWithSetPropertyAndValidate; - -inline void HandleErrorOnPropertyUpdate(const storage::v3::Error error) { - switch (error) { - case storage::v3::Error::SERIALIZATION_ERROR: - throw TransactionSerializationException(); - case storage::v3::Error::DELETED_OBJECT: - throw QueryRuntimeException("Trying to set properties on a deleted object."); - case storage::v3::Error::PROPERTIES_DISABLED: - throw QueryRuntimeException("Can't set property because properties on edges are disabled."); - case storage::v3::Error::VERTEX_HAS_EDGES: - case storage::v3::Error::NONEXISTENT_OBJECT: - case storage::v3::Error::VERTEX_ALREADY_INSERTED: - - throw QueryRuntimeException("Unexpected error when setting a property."); - } -} - int64_t QueryTimestamp(); } // namespace memgraph::query::v2 diff --git a/src/query/v2/db_accessor.hpp b/src/query/v2/db_accessor.hpp index 11118a899..dfa23376f 100644 --- a/src/query/v2/db_accessor.hpp +++ b/src/query/v2/db_accessor.hpp @@ -64,21 +64,21 @@ class EdgeAccessor final { auto Properties(storage::v3::View view) const { return impl_.Properties(view); } - storage::v3::Result GetProperty(storage::v3::View view, - storage::v3::PropertyId key) const { + storage::v3::ShardResult GetProperty(storage::v3::View view, + storage::v3::PropertyId key) const { return impl_.GetProperty(key, view); } - storage::v3::Result SetProperty(storage::v3::PropertyId key, - const storage::v3::PropertyValue &value) { + storage::v3::ShardResult SetProperty(storage::v3::PropertyId key, + const storage::v3::PropertyValue &value) { return impl_.SetProperty(key, value); } - storage::v3::Result RemoveProperty(storage::v3::PropertyId key) { + storage::v3::ShardResult RemoveProperty(storage::v3::PropertyId key) { return SetProperty(key, storage::v3::PropertyValue()); } - storage::v3::Result> ClearProperties() { + storage::v3::ShardResult> ClearProperties() { return impl_.ClearProperties(); } @@ -113,53 +113,49 @@ class VertexAccessor final { auto PrimaryKey(storage::v3::View view) const { return impl_.PrimaryKey(view); } - storage::v3::ShardOperationResult AddLabel(storage::v3::LabelId label) { + storage::v3::ShardResult AddLabel(storage::v3::LabelId label) { return impl_.AddLabelAndValidate(label); } + + storage::v3::ShardResult AddLabelAndValidate(storage::v3::LabelId label) { return impl_.AddLabelAndValidate(label); } - storage::v3::ShardOperationResult AddLabelAndValidate(storage::v3::LabelId label) { - return impl_.AddLabelAndValidate(label); - } + storage::v3::ShardResult RemoveLabel(storage::v3::LabelId label) { return impl_.RemoveLabelAndValidate(label); } - storage::v3::ShardOperationResult RemoveLabel(storage::v3::LabelId label) { + storage::v3::ShardResult RemoveLabelAndValidate(storage::v3::LabelId label) { return impl_.RemoveLabelAndValidate(label); } - storage::v3::ShardOperationResult RemoveLabelAndValidate(storage::v3::LabelId label) { - return impl_.RemoveLabelAndValidate(label); - } - - storage::v3::Result HasLabel(storage::v3::View view, storage::v3::LabelId label) const { + storage::v3::ShardResult HasLabel(storage::v3::View view, storage::v3::LabelId label) const { return impl_.HasLabel(label, view); } auto Properties(storage::v3::View view) const { return impl_.Properties(view); } - storage::v3::Result GetProperty(storage::v3::View view, - storage::v3::PropertyId key) const { + storage::v3::ShardResult GetProperty(storage::v3::View view, + storage::v3::PropertyId key) const { return impl_.GetProperty(key, view); } - storage::v3::ShardOperationResult SetProperty(storage::v3::PropertyId key, - const storage::v3::PropertyValue &value) { + storage::v3::ShardResult SetProperty(storage::v3::PropertyId key, + const storage::v3::PropertyValue &value) { return impl_.SetPropertyAndValidate(key, value); } - storage::v3::ShardOperationResult SetPropertyAndValidate( - storage::v3::PropertyId key, const storage::v3::PropertyValue &value) { + storage::v3::ShardResult SetPropertyAndValidate(storage::v3::PropertyId key, + const storage::v3::PropertyValue &value) { return impl_.SetPropertyAndValidate(key, value); } - storage::v3::ShardOperationResult RemovePropertyAndValidate(storage::v3::PropertyId key) { + storage::v3::ShardResult RemovePropertyAndValidate(storage::v3::PropertyId key) { return SetPropertyAndValidate(key, storage::v3::PropertyValue{}); } - storage::v3::Result> ClearProperties() { + storage::v3::ShardResult> ClearProperties() { return impl_.ClearProperties(); } auto InEdges(storage::v3::View view, const std::vector &edge_types) const - -> storage::v3::Result { + -> storage::v3::ShardResult { auto maybe_edges = impl_.InEdges(view, edge_types); if (maybe_edges.HasError()) return maybe_edges.GetError(); return iter::imap(MakeEdgeAccessor, std::move(*maybe_edges)); @@ -169,7 +165,7 @@ class VertexAccessor final { auto InEdges(storage::v3::View view, const std::vector &edge_types, const VertexAccessor &dest) const - -> storage::v3::Result { + -> storage::v3::ShardResult { const auto dest_id = dest.impl_.Id(view).GetValue(); auto maybe_edges = impl_.InEdges(view, edge_types, &dest_id); if (maybe_edges.HasError()) return maybe_edges.GetError(); @@ -177,7 +173,7 @@ class VertexAccessor final { } auto OutEdges(storage::v3::View view, const std::vector &edge_types) const - -> storage::v3::Result { + -> storage::v3::ShardResult { auto maybe_edges = impl_.OutEdges(view, edge_types); if (maybe_edges.HasError()) return maybe_edges.GetError(); return iter::imap(MakeEdgeAccessor, std::move(*maybe_edges)); @@ -187,16 +183,16 @@ class VertexAccessor final { auto OutEdges(storage::v3::View view, const std::vector &edge_types, const VertexAccessor &dest) const - -> storage::v3::Result { + -> storage::v3::ShardResult { const auto dest_id = dest.impl_.Id(view).GetValue(); auto maybe_edges = impl_.OutEdges(view, edge_types, &dest_id); if (maybe_edges.HasError()) return maybe_edges.GetError(); return iter::imap(MakeEdgeAccessor, std::move(*maybe_edges)); } - storage::v3::Result InDegree(storage::v3::View view) const { return impl_.InDegree(view); } + storage::v3::ShardResult InDegree(storage::v3::View view) const { return impl_.InDegree(view); } - storage::v3::Result OutDegree(storage::v3::View view) const { return impl_.OutDegree(view); } + storage::v3::ShardResult OutDegree(storage::v3::View view) const { return impl_.OutDegree(view); } // TODO(jbajic) Fix Remove Gid static int64_t CypherId() { return 1; } diff --git a/src/query/v2/plan/operator.cpp b/src/query/v2/plan/operator.cpp index 068ca9192..5e6e8bc9a 100644 --- a/src/query/v2/plan/operator.cpp +++ b/src/query/v2/plan/operator.cpp @@ -42,6 +42,7 @@ #include "query/v2/shard_request_manager.hpp" #include "storage/v3/conversions.hpp" #include "storage/v3/property_value.hpp" +#include "storage/v3/result.hpp" #include "utils/algorithm.hpp" #include "utils/csv_parsing.hpp" #include "utils/event_counter.hpp" @@ -566,17 +567,24 @@ UniqueCursorPtr ScanAllById::MakeCursor(utils::MemoryResource *mem) const { namespace { template -auto UnwrapEdgesResult(storage::v3::Result &&result) { +auto UnwrapEdgesResult(storage::v3::ShardResult &&result) { if (result.HasError()) { - switch (result.GetError()) { - case storage::v3::Error::DELETED_OBJECT: + switch (result.GetError().code) { + case storage::v3::ErrorCode::DELETED_OBJECT: throw QueryRuntimeException("Trying to get relationships of a deleted node."); - case storage::v3::Error::NONEXISTENT_OBJECT: + case storage::v3::ErrorCode::NONEXISTENT_OBJECT: throw query::v2::QueryRuntimeException("Trying to get relationships from a node that doesn't exist."); - case storage::v3::Error::VERTEX_HAS_EDGES: - case storage::v3::Error::SERIALIZATION_ERROR: - case storage::v3::Error::PROPERTIES_DISABLED: + case storage::v3::ErrorCode::VERTEX_HAS_EDGES: + case storage::v3::ErrorCode::SERIALIZATION_ERROR: + case storage::v3::ErrorCode::PROPERTIES_DISABLED: throw QueryRuntimeException("Unexpected error when accessing relationships."); + case storage::v3::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + case storage::v3::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + case storage::v3::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + case storage::v3::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + case storage::v3::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + case storage::v3::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + throw QueryRuntimeException("SchemaViolation occurred when accessing relationships."); } } return std::move(*result); @@ -843,7 +851,7 @@ concept AccessorWithProperties = requires(T value, storage::v3::PropertyId prope storage::v3::PropertyValue property_value) { { value.ClearProperties() - } -> std::same_as>>; + } -> std::same_as>>; {value.SetProperty(property_id, property_value)}; }; From 14ddd7254d5be185fae59038eb8c0466a69b93f4 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 15 Nov 2022 19:37:24 +0100 Subject: [PATCH 10/30] Fix communication and memgraph --- src/glue/v2/communication.cpp | 14 ++++++------ src/glue/v2/communication.hpp | 8 +++---- src/memgraph.cpp | 40 +++++++++++++++++++++++------------ 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index ebca8c23f..495ce1698 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -71,7 +71,7 @@ query::v2::TypedValue ToTypedValue(const Value &value) { } } -storage::v3::Result ToBoltVertex( +storage::v3::ShardResult ToBoltVertex( const query::v2::accessors::VertexAccessor &vertex, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View /*view*/) { auto id = communication::bolt::Id::FromUint(0); @@ -91,7 +91,7 @@ storage::v3::Result ToBoltVertex( return communication::bolt::Vertex{id, new_labels, new_properties}; } -storage::v3::Result ToBoltEdge( +storage::v3::ShardResult ToBoltEdge( const query::v2::accessors::EdgeAccessor &edge, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication @@ -108,16 +108,16 @@ storage::v3::Result ToBoltEdge( return communication::bolt::Edge{id, from, to, type, new_properties}; } -storage::v3::Result ToBoltPath( +storage::v3::ShardResult ToBoltPath( const query::v2::accessors::Path & /*edge*/, const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication - return {storage::v3::Error::DELETED_OBJECT}; + return {SHARD_ERROR(storage::v3::ErrorCode::DELETED_OBJECT)}; } -storage::v3::Result ToBoltValue(const query::v2::TypedValue &value, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view) { +storage::v3::ShardResult ToBoltValue(const query::v2::TypedValue &value, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view) { switch (value.type()) { case query::v2::TypedValue::Type::Null: return Value(); diff --git a/src/glue/v2/communication.hpp b/src/glue/v2/communication.hpp index ea9c6b4c9..debc26adf 100644 --- a/src/glue/v2/communication.hpp +++ b/src/glue/v2/communication.hpp @@ -35,7 +35,7 @@ namespace memgraph::glue::v2 { /// @param storage::v3::View for deciding which vertex attributes are visible. /// /// @throw std::bad_alloc -storage::v3::Result ToBoltVertex( +storage::v3::ShardResult ToBoltVertex( const storage::v3::VertexAccessor &vertex, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view); @@ -44,7 +44,7 @@ storage::v3::Result ToBoltVertex( /// @param storage::v3::View for deciding which edge attributes are visible. /// /// @throw std::bad_alloc -storage::v3::Result ToBoltEdge( +storage::v3::ShardResult ToBoltEdge( const storage::v3::EdgeAccessor &edge, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view); @@ -53,7 +53,7 @@ storage::v3::Result ToBoltEdge( /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -storage::v3::Result ToBoltPath( +storage::v3::ShardResult ToBoltPath( const query::v2::accessors::Path &path, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view); @@ -62,7 +62,7 @@ storage::v3::Result ToBoltPath( /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -storage::v3::Result ToBoltValue( +storage::v3::ShardResult ToBoltValue( const query::v2::TypedValue &value, const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view); diff --git a/src/memgraph.cpp b/src/memgraph.cpp index deaf9e568..f553d1821 100644 --- a/src/memgraph.cpp +++ b/src/memgraph.cpp @@ -483,13 +483,19 @@ class BoltSession final : public memgraph::communication::bolt::Session Date: Wed, 16 Nov 2022 08:58:06 +0100 Subject: [PATCH 11/30] Fix scheme test --- tests/unit/storage_v3_schema.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index 2189521ca..e5f651bf2 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -150,7 +150,15 @@ TEST_F(SchemaTest, TestSchemaDrop) { class SchemaValidatorTest : public testing::Test { private: - NameIdMapper id_mapper_{{{1, "label1"}, {2, "label2"}, {3, "prop1"}, {4, "prop2"}, {5, "prop3"}}}; + NameIdMapper id_mapper_{{{1, "label1"}, + {2, "label2"}, + {3, "prop1"}, + {4, "prop2"}, + {5, "prop3"}, + {6, "label4"}, + {7, "label5"}, + {8, "label6"}, + {9, "test"}}}; protected: void SetUp() override { From 7bdcd8f9f4bece3f74f416311fc0c63075dafa61 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 16 Nov 2022 14:48:06 +0100 Subject: [PATCH 12/30] Add shard_error in response --- src/expr/interpret/eval.hpp | 1 + src/memgraph.cpp | 2 + src/query/v2/requests.hpp | 16 ++++ src/storage/v3/result.hpp | 36 ++++++++ src/storage/v3/shard_rsm.cpp | 156 ++++++++++++++++------------------- 5 files changed, 124 insertions(+), 87 deletions(-) diff --git a/src/expr/interpret/eval.hpp b/src/expr/interpret/eval.hpp index 04676dd7b..85911678d 100644 --- a/src/expr/interpret/eval.hpp +++ b/src/expr/interpret/eval.hpp @@ -110,6 +110,7 @@ class ExpressionEvaluator : public ExpressionVisitor { case Error::VERTEX_HAS_EDGES: case Error::PROPERTIES_DISABLED: case Error::VERTEX_ALREADY_INSERTED: + case Error::OBJECT_NOT_FOUND: throw ExpressionRuntimeException("Unexpected error when accessing {}.", accessed_object); case Error::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: case Error::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: diff --git a/src/memgraph.cpp b/src/memgraph.cpp index f553d1821..b73a522de 100644 --- a/src/memgraph.cpp +++ b/src/memgraph.cpp @@ -496,6 +496,7 @@ class BoltSession final : public memgraph::communication::bolt::Session error; std::optional next_start_id; std::vector results; }; @@ -382,6 +389,7 @@ struct GetPropertiesRequest { struct GetPropertiesResponse { bool success; + std::optional error; }; enum class EdgeDirection : uint8_t { OUT = 1, IN = 2, BOTH = 3 }; @@ -447,6 +455,7 @@ struct ExpandOneResultRow { struct ExpandOneResponse { bool success; + std::optional error; std::vector result; }; @@ -481,6 +490,7 @@ struct CreateVerticesRequest { struct CreateVerticesResponse { bool success; + std::optional error; }; struct DeleteVerticesRequest { @@ -492,6 +502,7 @@ struct DeleteVerticesRequest { struct DeleteVerticesResponse { bool success; + std::optional error; }; struct UpdateVerticesRequest { @@ -501,6 +512,7 @@ struct UpdateVerticesRequest { struct UpdateVerticesResponse { bool success; + std::optional error; }; /* @@ -523,6 +535,7 @@ struct CreateExpandRequest { struct CreateExpandResponse { bool success; + std::optional error; }; struct DeleteEdgesRequest { @@ -532,6 +545,7 @@ struct DeleteEdgesRequest { struct DeleteEdgesResponse { bool success; + std::optional error; }; struct UpdateEdgesRequest { @@ -541,6 +555,7 @@ struct UpdateEdgesRequest { struct UpdateEdgesResponse { bool success; + std::optional error; }; struct CommitRequest { @@ -550,6 +565,7 @@ struct CommitRequest { struct CommitResponse { bool success; + std::optional error; }; using ReadRequests = std::variant; diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 4ba64cf02..f2eddc276 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -12,6 +12,7 @@ #pragma once #include +#include #include #include "utils/result.hpp" @@ -34,8 +35,43 @@ enum class ErrorCode { SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, + + // NEW Ones + OBJECT_NOT_FOUND, // Different from NONEXISTENT_OBJECT since ine the latter it + // could be found it could have a delta that specified deletion }; +constexpr std::string_view ErrorCodeToString(const ErrorCode code) { + switch (code) { + case ErrorCode::SERIALIZATION_ERROR: + return "SERIALIZATION_ERROR"; + case ErrorCode::NONEXISTENT_OBJECT: + return "NONEXISTENT_OBJECT"; + case ErrorCode::DELETED_OBJECT: + return "DELETED_OBJECT"; + case ErrorCode::VERTEX_HAS_EDGES: + return "VERTEX_HAS_EDGES"; + case ErrorCode::PROPERTIES_DISABLED: + return "PROPERTIES_DISABLED"; + case ErrorCode::VERTEX_ALREADY_INSERTED: + return "VERTEX_ALREADY_INSERTED"; + case ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + return "SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL"; + case ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + return "SCHEMA_VERTEX_PROPERTY_WRONG_TYPE"; + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + return "SCHEMA_VERTEX_UPDATE_PRIMARY_KEY"; + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + return "SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL"; + case ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + return "SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY"; + case ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + return "SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED"; + case ErrorCode::OBJECT_NOT_FOUND: + return "OBJECT_NOT_FOUND"; + } +} + struct ShardError { ShardError(ErrorCode code, std::string message, std::string source) : code{code}, message{std::move(message)}, source{std::move(source)} {} diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index f3d879ef4..6f6ada082 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -469,35 +469,11 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { return edge_filler; } -void LogResultError(const ShardError &error, const std::string_view action = "") { - switch (error.code) { - case ErrorCode::DELETED_OBJECT: - spdlog::debug("{} failed with error: DELETED_OBJECT, at {}", action, error.source); - break; - case ErrorCode::NONEXISTENT_OBJECT: - spdlog::debug("{} failed with error: NONEXISTENT_OBJECT, at {}", action, error.source); - break; - case ErrorCode::SERIALIZATION_ERROR: - spdlog::debug("{} failed with error: SERIALIZATION_ERROR, at {}", action, error.source); - break; - case ErrorCode::PROPERTIES_DISABLED: - spdlog::debug("{} failed with error: PROPERTIES_DISABLED, at {}", action, error.source); - break; - case ErrorCode::VERTEX_HAS_EDGES: - spdlog::debug("{} failed with error: VERTEX_HAS_EDGES, at {}", action, error.source); - break; - case ErrorCode::VERTEX_ALREADY_INSERTED: - spdlog::debug("{} failed with error: VERTEX_ALREADY_INSERTED, at {}", action, error.source); - break; - case ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: - spdlog::debug("Schema violation: {} at {}", error.message, error.source); - break; - } +auto CreateErrorResponse(const ShardError &shard_error, const auto transaction_id, const std::string_view action) { + msgs::ShardError message_shard_error{shard_error.code, shard_error.message}; + spdlog::debug("{} In transaction {} {} failed: {}: {}", shard_error.source, transaction_id, action, + ErrorCodeToString(shard_error.code), shard_error.message); + return message_shard_error; } }; // namespace @@ -505,6 +481,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; for (auto &new_vertex : req.new_vertices) { /// TODO(gvolfing) Consider other methods than converting. Change either @@ -525,21 +502,20 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { auto result_schema = acc.CreateVertexAndValidate(converted_label_ids, transformed_pk, converted_property_map); if (result_schema.HasError()) { - auto &error = result_schema.GetError(); - spdlog::debug("Creating vertex failed with error: VERTEX_ALREADY_INSERTED"); - + shard_error.emplace(CreateErrorResponse(result_schema.GetError(), req.transaction_id, "creating vertices")); action_successful = false; break; } } - return msgs::CreateVerticesResponse{.success = action_successful}; + return msgs::CreateVerticesResponse{action_successful, std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; for (auto &vertex : req.new_properties) { if (!action_successful) { @@ -549,7 +525,8 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto vertex_to_update = acc.FindVertex(ConvertPropertyVector(std::move(vertex.primary_key)), View::OLD); if (!vertex_to_update) { action_successful = false; - spdlog::debug("Vertex could not be found while trying to update its properties. Transaction id: {}", + shard_error.emplace(msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}); + spdlog::debug("In transaction {} vertex could not be found while trying to update its properties.", req.transaction_id.logical_id); continue; } @@ -558,68 +535,66 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto result_schema = vertex_to_update->SetPropertyAndValidate(update_prop.first, ToPropertyValue(std::move(update_prop.second))); if (result_schema.HasError()) { - auto &error = result_schema.GetError(); - LogResultError(error); - action_successful = false; - + shard_error.emplace(CreateErrorResponse(result_schema.GetError(), req.transaction_id, "updating vertices")); break; } } } - return msgs::UpdateVerticesResponse{.success = action_successful}; + return msgs::UpdateVerticesResponse{action_successful, std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { bool action_successful = true; + std::optional shard_error; auto acc = shard_->Access(req.transaction_id); for (auto &propval : req.primary_keys) { - if (!action_successful) { - break; - } - auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(propval)), View::OLD); if (!vertex_acc) { spdlog::debug("Error while trying to delete vertex. Vertex to delete does not exist. Transaction id: {}", req.transaction_id.logical_id); action_successful = false; - } else { - // TODO(gvolfing) - // Since we will not have different kinds of deletion types in one transaction, - // we dont have to enter the switch statement on every iteration. Optimize this. - switch (req.deletion_type) { - case msgs::DeleteVerticesRequest::DeletionType::DELETE: { - auto result = acc.DeleteVertex(&vertex_acc.value()); - if (result.HasError() || !(result.GetValue().has_value())) { - action_successful = false; - spdlog::debug("Error while trying to delete vertex. Transaction id: {}", req.transaction_id.logical_id); - } - - break; - } - case msgs::DeleteVerticesRequest::DeletionType::DETACH_DELETE: { - auto result = acc.DetachDeleteVertex(&vertex_acc.value()); - if (result.HasError() || !(result.GetValue().has_value())) { - action_successful = false; - spdlog::debug("Error while trying to detach and delete vertex. Transaction id: {}", - req.transaction_id.logical_id); - } - - break; + shard_error.emplace(msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}); + spdlog::debug("In transaction {} vertex could not be found while trying to delete it.", + req.transaction_id.logical_id); + break; + } + // TODO(gvolfing) + // Since we will not have different kinds of deletion types in one transaction, + // we dont have to enter the switch statement on every iteration. Optimize this. + switch (req.deletion_type) { + case msgs::DeleteVerticesRequest::DeletionType::DELETE: { + auto result = acc.DeleteVertex(&vertex_acc.value()); + if (result.HasError() || !(result.GetValue().has_value())) { + action_successful = false; + shard_error.emplace(CreateErrorResponse(result.GetError(), req.transaction_id, "deleting vertices")); } + break; } + case msgs::DeleteVerticesRequest::DeletionType::DETACH_DELETE: { + auto result = acc.DetachDeleteVertex(&vertex_acc.value()); + if (result.HasError() || !(result.GetValue().has_value())) { + action_successful = false; + shard_error.emplace(CreateErrorResponse(result.GetError(), req.transaction_id, "deleting vertices")); + } + break; + } + } + if (!action_successful) { + break; } } - return msgs::DeleteVerticesResponse{.success = action_successful}; + return msgs::DeleteVerticesResponse{action_successful, std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; for (auto &new_expand : req.new_expands) { const auto from_vertex_id = @@ -629,6 +604,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { VertexId{new_expand.dest_vertex.first.id, ConvertPropertyVector(std::move(new_expand.dest_vertex.second))}; if (!(shard_->IsVertexBelongToShard(from_vertex_id) || shard_->IsVertexBelongToShard(to_vertex_id))) { + // TODO Code for this action_successful = false; spdlog::debug("Error while trying to insert edge, none of the vertices belong to this shard. Transaction id: {}", req.transaction_id.logical_id); @@ -642,16 +618,17 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { for (const auto &[property, value] : new_expand.properties) { if (const auto maybe_error = edge.SetProperty(property, ToPropertyValue(value)); maybe_error.HasError()) { action_successful = false; - spdlog::debug("Setting edge property was not successful. Transaction id: {}", - req.transaction_id.logical_id); - break; - } - if (!action_successful) { + shard_error.emplace( + CreateErrorResponse(maybe_error.GetError(), req.transaction_id, "setting edge property")); break; } } + if (!action_successful) { + break; + } } } else { + // TODO Code for this action_successful = false; spdlog::debug("Creating edge was not successful. Transaction id: {}", req.transaction_id.logical_id); break; @@ -663,19 +640,19 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { auto set_result = edge_acc->SetProperty(edge_prop_key, ToPropertyValue(std::move(edge_prop_val))); if (set_result.HasError()) { action_successful = false; - spdlog::debug("Adding property to edge was not successful. Transaction id: {}", - req.transaction_id.logical_id); + shard_error.emplace(CreateErrorResponse(set_result.GetError(), req.transaction_id, "adding edge property")); break; } } } } - return msgs::CreateExpandResponse{.success = action_successful}; + return msgs::CreateExpandResponse{action_successful, std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteEdgesRequest &&req) { bool action_successful = true; + std::optional shard_error; auto acc = shard_->Access(req.transaction_id); for (auto &edge : req.edges) { @@ -687,13 +664,13 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteEdgesRequest &&req) { VertexId(edge.dst.first.id, ConvertPropertyVector(std::move(edge.dst.second))), Gid::FromUint(edge.id.gid)); if (edge_acc.HasError() || !edge_acc.HasValue()) { - spdlog::debug("Error while trying to delete edge. Transaction id: {}", req.transaction_id.logical_id); action_successful = false; + shard_error.emplace(CreateErrorResponse(edge_acc.GetError(), req.transaction_id, "delete edge")); continue; } } - return msgs::DeleteEdgesResponse{.success = action_successful}; + return msgs::DeleteEdgesResponse{action_successful, std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { @@ -701,6 +678,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; for (auto &edge : req.new_properties) { if (!action_successful) { @@ -709,19 +687,19 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(edge.src.second)), View::OLD); if (!vertex_acc) { + // TODO Code here action_successful = false; spdlog::debug("Encountered an error while trying to acquire VertexAccessor with transaction id: {}", req.transaction_id.logical_id); continue; } - // Since we are using the source vertex of the edge we are only intrested + // Since we are using the source vertex of the edge we are only interested // in the vertex's out-going edges auto edges_res = vertex_acc->OutEdges(View::OLD); if (edges_res.HasError()) { action_successful = false; - spdlog::debug("Encountered an error while trying to acquire EdgeAccessor with transaction id: {}", - req.transaction_id.logical_id); + shard_error.emplace(CreateErrorResponse(edges_res.GetError(), req.transaction_id, "update edge")); continue; } @@ -737,14 +715,15 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { // Check if the property was set if SetProperty does not do that itself. auto res = edge_accessor.SetProperty(key, ToPropertyValue(std::move(value))); if (res.HasError()) { - spdlog::debug("Encountered an error while trying to set the property of an Edge with transaction id: {}", - req.transaction_id.logical_id); + // TODO why not set action unsuccessful here? + shard_error.emplace(CreateErrorResponse(edges_res.GetError(), req.transaction_id, "update edge")); } } } } if (!edge_accessor_did_match) { + // TODO Code here action_successful = false; spdlog::debug("Could not find the Edge with the specified Gid. Transaction id: {}", req.transaction_id.logical_id); @@ -752,12 +731,13 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { } } - return msgs::UpdateEdgesResponse{.success = action_successful}; + return msgs::UpdateEdgesResponse{action_successful, std::move(shard_error)}; } msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; std::vector results; if (req.batch_limit) { @@ -795,6 +775,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { // Vertex is separated from the properties in the response. // Is it useful to return just a vertex without the properties? if (!found_props) { + // TODO code here action_successful = false; } @@ -843,8 +824,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { } } - msgs::ScanVerticesResponse resp{}; - resp.success = action_successful; + msgs::ScanVerticesResponse resp{.success = action_successful, .error = std::move(shard_error)}; if (action_successful) { resp.next_start_id = next_start_id; @@ -857,6 +837,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { auto acc = shard_->Access(req.transaction_id); bool action_successful = true; + std::optional shard_error; std::vector results; @@ -867,6 +848,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { // Get Vertex acc auto src_vertex_acc_opt = acc.FindVertex(ConvertPropertyVector((src_vertex.second)), View::NEW); if (!src_vertex_acc_opt) { + // TODO Code error action_successful = false; spdlog::debug("Encountered an error while trying to obtain VertexAccessor. Transaction id: {}", req.transaction_id.logical_id); @@ -885,6 +867,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { shard_->GetSchema(shard_->PrimaryLabel())); if (!result) { + // Code Error action_successful = false; break; } @@ -892,8 +875,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { results.emplace_back(result.value()); } - msgs::ExpandOneResponse resp{}; - resp.success = action_successful; + msgs::ExpandOneResponse resp{.success = action_successful, .error = std::move(shard_error)}; if (action_successful) { resp.result = std::move(results); } From 9261fabe603d38968bed47a650d506ed181d34f1 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 16 Nov 2022 17:41:43 +0100 Subject: [PATCH 13/30] Adapt for unfound object --- src/storage/v3/result.hpp | 3 +- src/storage/v3/shard_rsm.cpp | 116 +++++++++++++++++++---------------- 2 files changed, 65 insertions(+), 54 deletions(-) diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index f2eddc276..0c1289255 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -37,8 +37,7 @@ enum class ErrorCode { SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, // NEW Ones - OBJECT_NOT_FOUND, // Different from NONEXISTENT_OBJECT since ine the latter it - // could be found it could have a delta that specified deletion + OBJECT_NOT_FOUND, }; constexpr std::string_view ErrorCodeToString(const ErrorCode code) { diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 6f6ada082..dcdd23c70 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -69,7 +69,8 @@ using AllEdgePropertiesVector = std::vector; using EdgeAccessors = std::vector; -using EdgeFiller = std::function; +using EdgeFiller = + std::function(const EdgeAccessor &edge, bool is_in_edge, msgs::ExpandOneResultRow &result_row)>; using EdgeUniqunessFunction = std::function; struct VertexIdCmpr { @@ -183,13 +184,13 @@ std::vector EvaluateVertexExpressions(DbAccessor &dba, const VertexA struct LocalError {}; -std::optional> FillUpSourceVertexSecondaryLabels(const std::optional &v_acc, - const msgs::ExpandOneRequest &req) { +ShardResult> FillUpSourceVertexSecondaryLabels(const std::optional &v_acc, + const msgs::ExpandOneRequest &req) { auto secondary_labels = v_acc->Labels(View::NEW); if (secondary_labels.HasError()) { spdlog::debug("Encountered an error while trying to get the secondary labels of a vertex. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return secondary_labels.GetError(); } auto &sec_labels = secondary_labels.GetValue(); @@ -202,10 +203,10 @@ std::optional> FillUpSourceVertexSecondaryLabels(const return msgs_secondary_labels; } -std::optional> FillUpSourceVertexProperties(const std::optional &v_acc, - const msgs::ExpandOneRequest &req, - storage::v3::View view, - const Schemas::Schema *schema) { +ShardResult> FillUpSourceVertexProperties(const std::optional &v_acc, + const msgs::ExpandOneRequest &req, + storage::v3::View view, + const Schemas::Schema *schema) { std::map src_vertex_properties; if (!req.src_vertex_properties) { @@ -213,7 +214,7 @@ std::optional> FillUpSourceVertexProperties(const st if (props.HasError()) { spdlog::debug("Encountered an error while trying to access vertex properties. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return props.GetError(); } for (auto &[key, val] : props.GetValue()) { @@ -232,7 +233,7 @@ std::optional> FillUpSourceVertexProperties(const st if (prop_val.HasError()) { spdlog::debug("Encountered an error while trying to access vertex properties. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return prop_val.GetError(); } src_vertex_properties.insert(std::make_pair(prop, FromPropertyValueToValue(std::move(prop_val.GetValue())))); } @@ -241,7 +242,7 @@ std::optional> FillUpSourceVertexProperties(const st return src_vertex_properties; } -std::optional, 2>> FillUpConnectingEdges( +ShardResult, 2>> FillUpConnectingEdges( const std::optional &v_acc, const msgs::ExpandOneRequest &req, const EdgeUniqunessFunction &maybe_filter_based_on_edge_uniquness) { std::vector edge_types{}; @@ -258,7 +259,7 @@ std::optional, 2>> FillUpConnectingEdges( if (out_edges_result.HasError()) { spdlog::debug("Encountered an error while trying to get out-going EdgeAccessors. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return out_edges_result.GetError(); } out_edges = maybe_filter_based_on_edge_uniquness(std::move(out_edges_result.GetValue()), msgs::EdgeDirection::OUT); @@ -270,7 +271,7 @@ std::optional, 2>> FillUpConnectingEdges( spdlog::debug( "Encountered an error while trying to get in-going EdgeAccessors. Transaction id: {}"[req.transaction_id .logical_id]); - return std::nullopt; + return in_edges_result.GetError(); } in_edges = maybe_filter_based_on_edge_uniquness(std::move(in_edges_result.GetValue()), msgs::EdgeDirection::IN); break; @@ -280,14 +281,14 @@ std::optional, 2>> FillUpConnectingEdges( if (in_edges_result.HasError()) { spdlog::debug("Encountered an error while trying to get in-going EdgeAccessors. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return in_edges_result.GetError(); } in_edges = maybe_filter_based_on_edge_uniquness(std::move(in_edges_result.GetValue()), msgs::EdgeDirection::IN); auto out_edges_result = v_acc->OutEdges(View::NEW, edge_types); if (out_edges_result.HasError()) { spdlog::debug("Encountered an error while trying to get out-going EdgeAccessors. Transaction id: {}", req.transaction_id.logical_id); - return std::nullopt; + return out_edges_result.GetError(); } out_edges = maybe_filter_based_on_edge_uniquness(std::move(out_edges_result.GetValue()), msgs::EdgeDirection::OUT); @@ -306,20 +307,21 @@ using SpecificEdgeProperties = std::tuple; using AllEdgePropertiesVector = std::vector; -using EdgeFiller = std::function; +using EdgeFiller = + std::function(const EdgeAccessor &edge, bool is_in_edge, msgs::ExpandOneResultRow &result_row)>; template -bool FillEdges(const std::vector &edges, msgs::ExpandOneResultRow &row, const EdgeFiller &edge_filler) { +ShardResult FillEdges(const std::vector &edges, msgs::ExpandOneResultRow &row, + const EdgeFiller &edge_filler) { for (const auto &edge : edges) { - if (!edge_filler(edge, are_in_edges, row)) { - return false; + if (const auto res = edge_filler(edge, are_in_edges, row); res.HasError()) { + return res.GetError(); } } - - return true; + return {}; } -std::optional GetExpandOneResult( +ShardResult GetExpandOneResult( Shard::Accessor &acc, msgs::VertexId src_vertex, const msgs::ExpandOneRequest &req, const EdgeUniqunessFunction &maybe_filter_based_on_edge_uniquness, const EdgeFiller &edge_filler, const Schemas::Schema *schema) { @@ -328,37 +330,42 @@ std::optional GetExpandOneResult( auto v_acc = acc.FindVertex(primary_key, View::NEW); msgs::Vertex source_vertex = {.id = src_vertex}; - if (const auto maybe_secondary_labels = FillUpSourceVertexSecondaryLabels(v_acc, req); maybe_secondary_labels) { + const auto maybe_secondary_labels = FillUpSourceVertexSecondaryLabels(v_acc, req); + if (maybe_secondary_labels.HasError()) { source_vertex.labels = *maybe_secondary_labels; } else { - return std::nullopt; + return maybe_secondary_labels.GetError(); } - std::optional> src_vertex_properties; - src_vertex_properties = FillUpSourceVertexProperties(v_acc, req, storage::v3::View::NEW, schema); + auto src_vertex_properties = FillUpSourceVertexProperties(v_acc, req, storage::v3::View::NEW, schema); - if (!src_vertex_properties) { - return std::nullopt; + if (src_vertex_properties.HasError()) { + return src_vertex_properties.GetError(); } /// Fill up connecting edges auto fill_up_connecting_edges = FillUpConnectingEdges(v_acc, req, maybe_filter_based_on_edge_uniquness); - if (!fill_up_connecting_edges) { - return std::nullopt; + if (fill_up_connecting_edges.HasError()) { + return fill_up_connecting_edges.GetError(); } - auto [in_edges, out_edges] = fill_up_connecting_edges.value(); + auto [in_edges, out_edges] = fill_up_connecting_edges.GetValue(); msgs::ExpandOneResultRow result_row; result_row.src_vertex = std::move(source_vertex); result_row.src_vertex_properties = std::move(*src_vertex_properties); static constexpr bool kInEdges = true; static constexpr bool kOutEdges = false; - if (!in_edges.empty() && !FillEdges(in_edges, result_row, edge_filler)) { - return std::nullopt; + if (!in_edges.empty()) { + if (const auto fill_edges_res = FillEdges(in_edges, result_row, edge_filler); fill_edges_res.HasError()) { + return fill_edges_res.GetError(); + } } - if (!out_edges.empty() && !FillEdges(out_edges, result_row, edge_filler)) { - return std::nullopt; + if (!out_edges.empty()) { + if (const auto fill_edges_res = FillEdges(out_edges, result_row, edge_filler); + fill_edges_res.HasError()) { + return fill_edges_res.GetError(); + } } return result_row; @@ -417,12 +424,13 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { EdgeFiller edge_filler; if (!req.edge_properties) { - edge_filler = [transaction_id = req.transaction_id.logical_id](const EdgeAccessor &edge, const bool is_in_edge, - msgs::ExpandOneResultRow &result_row) -> bool { + edge_filler = [transaction_id = req.transaction_id.logical_id]( + const EdgeAccessor &edge, const bool is_in_edge, + msgs::ExpandOneResultRow &result_row) -> ShardResult { auto properties_results = edge.Properties(View::NEW); if (properties_results.HasError()) { spdlog::debug("Encountered an error while trying to get edge properties. Transaction id: {}", transaction_id); - return false; + return properties_results.GetError(); } std::map value_properties; @@ -437,12 +445,12 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { } else { result_row.out_edges_with_all_properties.push_back(std::move(edges)); } - return true; + return {}; }; } else { // TODO(gvolfing) - do we want to set the action_successful here? edge_filler = [&req](const EdgeAccessor &edge, const bool is_in_edge, - msgs::ExpandOneResultRow &result_row) -> bool { + msgs::ExpandOneResultRow &result_row) -> ShardResult { std::vector value_properties; value_properties.reserve(req.edge_properties.value().size()); for (const auto &edge_prop : req.edge_properties.value()) { @@ -450,7 +458,7 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { if (property_result.HasError()) { spdlog::debug("Encountered an error while trying to get edge properties. Transaction id: {}", req.transaction_id.logical_id); - return false; + return property_result.GetError(); } value_properties.emplace_back(FromPropertyValueToValue(std::move(property_result.GetValue()))); } @@ -462,7 +470,7 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { } else { result_row.out_edges_with_specific_properties.push_back(std::move(edges)); } - return true; + return {}; }; } @@ -604,8 +612,9 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { VertexId{new_expand.dest_vertex.first.id, ConvertPropertyVector(std::move(new_expand.dest_vertex.second))}; if (!(shard_->IsVertexBelongToShard(from_vertex_id) || shard_->IsVertexBelongToShard(to_vertex_id))) { - // TODO Code for this action_successful = false; + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, + "Error while trying to insert edge, none of the vertices belong to this shard"}; spdlog::debug("Error while trying to insert edge, none of the vertices belong to this shard. Transaction id: {}", req.transaction_id.logical_id); break; @@ -630,6 +639,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { } else { // TODO Code for this action_successful = false; + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}; spdlog::debug("Creating edge was not successful. Transaction id: {}", req.transaction_id.logical_id); break; } @@ -687,8 +697,8 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(edge.src.second)), View::OLD); if (!vertex_acc) { - // TODO Code here action_successful = false; + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found"}; spdlog::debug("Encountered an error while trying to acquire VertexAccessor with transaction id: {}", req.transaction_id.logical_id); continue; @@ -715,7 +725,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { // Check if the property was set if SetProperty does not do that itself. auto res = edge_accessor.SetProperty(key, ToPropertyValue(std::move(value))); if (res.HasError()) { - // TODO why not set action unsuccessful here? + // TODO(jbajic) why not set action unsuccessful here? shard_error.emplace(CreateErrorResponse(edges_res.GetError(), req.transaction_id, "update edge")); } } @@ -723,7 +733,8 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { } if (!edge_accessor_did_match) { - // TODO Code here + // TODO(jbajic) Do we need this + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Edge was not found"}; action_successful = false; spdlog::debug("Could not find the Edge with the specified Gid. Transaction id: {}", req.transaction_id.logical_id); @@ -775,7 +786,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { // Vertex is separated from the properties in the response. // Is it useful to return just a vertex without the properties? if (!found_props) { - // TODO code here + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Requested properties were not found!"}; action_successful = false; } @@ -848,7 +859,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { // Get Vertex acc auto src_vertex_acc_opt = acc.FindVertex(ConvertPropertyVector((src_vertex.second)), View::NEW); if (!src_vertex_acc_opt) { - // TODO Code error + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; action_successful = false; spdlog::debug("Encountered an error while trying to obtain VertexAccessor. Transaction id: {}", req.transaction_id.logical_id); @@ -863,16 +874,17 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { continue; } } - auto result = GetExpandOneResult(acc, src_vertex, req, maybe_filter_based_on_edge_uniquness, edge_filler, - shard_->GetSchema(shard_->PrimaryLabel())); + const auto result = GetExpandOneResult(acc, src_vertex, req, maybe_filter_based_on_edge_uniquness, edge_filler, + shard_->GetSchema(shard_->PrimaryLabel())); - if (!result) { + if (result.HasError()) { // Code Error + shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; action_successful = false; break; } - results.emplace_back(result.value()); + results.emplace_back(result.GetValue()); } msgs::ExpandOneResponse resp{.success = action_successful, .error = std::move(shard_error)}; From 15fc3c08347e9fb46f42c74beaa9161eb8fa6a05 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 16 Nov 2022 18:12:25 +0100 Subject: [PATCH 14/30] Fix error --- src/storage/v3/shard_rsm.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index dcdd23c70..1ea22fa8f 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -332,10 +332,9 @@ ShardResult GetExpandOneResult( msgs::Vertex source_vertex = {.id = src_vertex}; const auto maybe_secondary_labels = FillUpSourceVertexSecondaryLabels(v_acc, req); if (maybe_secondary_labels.HasError()) { - source_vertex.labels = *maybe_secondary_labels; - } else { return maybe_secondary_labels.GetError(); } + source_vertex.labels = *maybe_secondary_labels; auto src_vertex_properties = FillUpSourceVertexProperties(v_acc, req, storage::v3::View::NEW, schema); From e98ef634decaaccd2ea3ebf39c97eb5856f3b4ee Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 16 Nov 2022 21:03:36 +0100 Subject: [PATCH 15/30] Ignore warning --- src/storage/v3/result.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 0c1289255..158a1eab7 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -11,6 +11,7 @@ #pragma once +#include #include #include #include @@ -21,7 +22,7 @@ namespace memgraph::storage::v3 { static_assert(std::is_same_v); -enum class ErrorCode { +enum class ErrorCode : uint8_t { SERIALIZATION_ERROR, NONEXISTENT_OBJECT, DELETED_OBJECT, @@ -36,7 +37,6 @@ enum class ErrorCode { SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, - // NEW Ones OBJECT_NOT_FOUND, }; @@ -85,6 +85,7 @@ struct ShardError { inline friend bool operator==(const ShardError &lhs, const ShardError &rhs) { return lhs.code == rhs.code; } }; +// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) #define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, fmt::format("{}:{}", __FILE__, __LINE__)) template From ec4804b72a06c4aa1867fadc973a0eea4ab5f8b3 Mon Sep 17 00:00:00 2001 From: jbajic Date: Thu, 17 Nov 2022 11:03:03 +0100 Subject: [PATCH 16/30] Move ErrorCode to common --- src/common/errors.hpp | 68 ++++++++++++++++ src/glue/v2/communication.cpp | 4 +- src/memgraph.cpp | 53 ++++++------ src/query/v2/bindings/eval.hpp | 8 +- src/query/v2/plan/operator.cpp | 24 +++--- src/query/v2/requests.hpp | 2 +- src/storage/v3/bindings/eval.hpp | 2 +- src/storage/v3/edge_accessor.cpp | 20 ++--- src/storage/v3/result.hpp | 56 +------------ src/storage/v3/schema_validator.cpp | 12 +-- src/storage/v3/shard.cpp | 27 ++++--- src/storage/v3/shard_rsm.cpp | 18 ++--- src/storage/v3/vertex_accessor.cpp | 64 +++++++-------- tests/unit/storage_v3.cpp | 93 +++++++++++----------- tests/unit/storage_v3_edge.cpp | 10 +-- tests/unit/storage_v3_schema.cpp | 23 +++--- tests/unit/storage_v3_vertex_accessors.cpp | 13 +-- 17 files changed, 260 insertions(+), 237 deletions(-) create mode 100644 src/common/errors.hpp diff --git a/src/common/errors.hpp b/src/common/errors.hpp new file mode 100644 index 000000000..1a2e0ce85 --- /dev/null +++ b/src/common/errors.hpp @@ -0,0 +1,68 @@ +// Copyright 2022 Memgraph Ltd. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source +// License, and you may not use this file except in compliance with the Business Source License. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +#pragma once + +#include +#include + +namespace memgraph::common { + +enum class ErrorCode : uint8_t { + SERIALIZATION_ERROR, + NONEXISTENT_OBJECT, + DELETED_OBJECT, + VERTEX_HAS_EDGES, + PROPERTIES_DISABLED, + VERTEX_ALREADY_INSERTED, + // Schema Violations + SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, + SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, + SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, + SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, + + OBJECT_NOT_FOUND, +}; + +constexpr std::string_view ErrorCodeToString(const ErrorCode code) { + switch (code) { + case ErrorCode::SERIALIZATION_ERROR: + return "SERIALIZATION_ERROR"; + case ErrorCode::NONEXISTENT_OBJECT: + return "NONEXISTENT_OBJECT"; + case ErrorCode::DELETED_OBJECT: + return "DELETED_OBJECT"; + case ErrorCode::VERTEX_HAS_EDGES: + return "VERTEX_HAS_EDGES"; + case ErrorCode::PROPERTIES_DISABLED: + return "PROPERTIES_DISABLED"; + case ErrorCode::VERTEX_ALREADY_INSERTED: + return "VERTEX_ALREADY_INSERTED"; + case ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + return "SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL"; + case ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + return "SCHEMA_VERTEX_PROPERTY_WRONG_TYPE"; + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + return "SCHEMA_VERTEX_UPDATE_PRIMARY_KEY"; + case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + return "SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL"; + case ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + return "SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY"; + case ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + return "SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED"; + case ErrorCode::OBJECT_NOT_FOUND: + return "OBJECT_NOT_FOUND"; + } +} + +} // namespace memgraph::common diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index 495ce1698..0b185d19b 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -15,13 +15,13 @@ #include #include +#include "common/errors.hpp" #include "coordinator/shard_map.hpp" #include "query/v2/accessors.hpp" #include "query/v2/requests.hpp" #include "query/v2/shard_request_manager.hpp" #include "storage/v3/edge_accessor.hpp" #include "storage/v3/id_types.hpp" -#include "storage/v3/result.hpp" #include "storage/v3/shard.hpp" #include "storage/v3/vertex_accessor.hpp" #include "storage/v3/view.hpp" @@ -112,7 +112,7 @@ storage::v3::ShardResult ToBoltPath( const query::v2::accessors::Path & /*edge*/, const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication - return {SHARD_ERROR(storage::v3::ErrorCode::DELETED_OBJECT)}; + return {SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)}; } storage::v3::ShardResult ToBoltValue(const query::v2::TypedValue &value, diff --git a/src/memgraph.cpp b/src/memgraph.cpp index b73a522de..23582e9ea 100644 --- a/src/memgraph.cpp +++ b/src/memgraph.cpp @@ -33,6 +33,7 @@ #include #include +#include "common/errors.hpp" #include "communication/bolt/v1/constants.hpp" #include "communication/websocket/auth.hpp" #include "communication/websocket/server.hpp" @@ -484,19 +485,19 @@ class BoltSession final : public memgraph::communication::bolt::Session; +using ExpressionEvaluator = memgraph::expr::ExpressionEvaluator< + TypedValue, memgraph::query::v2::EvaluationContext, memgraph::msgs::ShardRequestManagerInterface, storage::v3::View, + storage::v3::LabelId, msgs::Value, detail::Callable, common::ErrorCode, memgraph::expr::QueryEngineTag>; } // namespace memgraph::query::v2 diff --git a/src/query/v2/plan/operator.cpp b/src/query/v2/plan/operator.cpp index 5e6e8bc9a..59e1c6d68 100644 --- a/src/query/v2/plan/operator.cpp +++ b/src/query/v2/plan/operator.cpp @@ -26,6 +26,7 @@ #include #include +#include "common/errors.hpp" #include "expr/ast/pretty_print_ast_to_original_expression.hpp" #include "expr/exceptions.hpp" #include "query/exceptions.hpp" @@ -42,7 +43,6 @@ #include "query/v2/shard_request_manager.hpp" #include "storage/v3/conversions.hpp" #include "storage/v3/property_value.hpp" -#include "storage/v3/result.hpp" #include "utils/algorithm.hpp" #include "utils/csv_parsing.hpp" #include "utils/event_counter.hpp" @@ -570,20 +570,20 @@ template auto UnwrapEdgesResult(storage::v3::ShardResult &&result) { if (result.HasError()) { switch (result.GetError().code) { - case storage::v3::ErrorCode::DELETED_OBJECT: + case common::ErrorCode::DELETED_OBJECT: throw QueryRuntimeException("Trying to get relationships of a deleted node."); - case storage::v3::ErrorCode::NONEXISTENT_OBJECT: + case common::ErrorCode::NONEXISTENT_OBJECT: throw query::v2::QueryRuntimeException("Trying to get relationships from a node that doesn't exist."); - case storage::v3::ErrorCode::VERTEX_HAS_EDGES: - case storage::v3::ErrorCode::SERIALIZATION_ERROR: - case storage::v3::ErrorCode::PROPERTIES_DISABLED: + case common::ErrorCode::VERTEX_HAS_EDGES: + case common::ErrorCode::SERIALIZATION_ERROR: + case common::ErrorCode::PROPERTIES_DISABLED: throw QueryRuntimeException("Unexpected error when accessing relationships."); - case storage::v3::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case storage::v3::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case storage::v3::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case storage::v3::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case storage::v3::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case storage::v3::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: + case common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: + case common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: + case common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: + case common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: + case common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: + case common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: throw QueryRuntimeException("SchemaViolation occurred when accessing relationships."); } } diff --git a/src/query/v2/requests.hpp b/src/query/v2/requests.hpp index ec2154a7d..62a4e93f8 100644 --- a/src/query/v2/requests.hpp +++ b/src/query/v2/requests.hpp @@ -319,7 +319,7 @@ struct Value { }; struct ShardError { - storage::v3::ErrorCode code; + common::ErrorCode code; std::string message; }; diff --git a/src/storage/v3/bindings/eval.hpp b/src/storage/v3/bindings/eval.hpp index 063705806..c3024e006 100644 --- a/src/storage/v3/bindings/eval.hpp +++ b/src/storage/v3/bindings/eval.hpp @@ -88,6 +88,6 @@ struct EvaluationContext { using ExpressionEvaluator = memgraph::expr::ExpressionEvaluator; + common::ErrorCode>; } // namespace memgraph::storage::v3 diff --git a/src/storage/v3/edge_accessor.cpp b/src/storage/v3/edge_accessor.cpp index 95dd6875a..4438e0acb 100644 --- a/src/storage/v3/edge_accessor.cpp +++ b/src/storage/v3/edge_accessor.cpp @@ -57,11 +57,11 @@ const VertexId &EdgeAccessor::ToVertex() const { return to_vertex_; } ShardResult EdgeAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); + if (!config_.properties_on_edges) return SHARD_ERROR(common::ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (edge_.ptr->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto current_value = edge_.ptr->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -77,11 +77,11 @@ ShardResult EdgeAccessor::SetProperty(PropertyId property, const } ShardResult> EdgeAccessor::ClearProperties() { - if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); + if (!config_.properties_on_edges) return SHARD_ERROR(common::ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (edge_.ptr->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto properties = edge_.ptr->properties.Properties(); for (const auto &property : properties) { @@ -129,8 +129,8 @@ ShardResult EdgeAccessor::GetProperty(PropertyId property, View v break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return std::move(value); } @@ -175,8 +175,8 @@ ShardResult> EdgeAccessor::Properties(View v break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return std::move(properties); } diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 158a1eab7..c9c0c8a4b 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -16,68 +16,20 @@ #include #include +#include "common/errors.hpp" #include "utils/result.hpp" namespace memgraph::storage::v3 { static_assert(std::is_same_v); -enum class ErrorCode : uint8_t { - SERIALIZATION_ERROR, - NONEXISTENT_OBJECT, - DELETED_OBJECT, - VERTEX_HAS_EDGES, - PROPERTIES_DISABLED, - VERTEX_ALREADY_INSERTED, - // Schema Violations - SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, - SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, - SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, - SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, - SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, - SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, - - OBJECT_NOT_FOUND, -}; - -constexpr std::string_view ErrorCodeToString(const ErrorCode code) { - switch (code) { - case ErrorCode::SERIALIZATION_ERROR: - return "SERIALIZATION_ERROR"; - case ErrorCode::NONEXISTENT_OBJECT: - return "NONEXISTENT_OBJECT"; - case ErrorCode::DELETED_OBJECT: - return "DELETED_OBJECT"; - case ErrorCode::VERTEX_HAS_EDGES: - return "VERTEX_HAS_EDGES"; - case ErrorCode::PROPERTIES_DISABLED: - return "PROPERTIES_DISABLED"; - case ErrorCode::VERTEX_ALREADY_INSERTED: - return "VERTEX_ALREADY_INSERTED"; - case ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - return "SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL"; - case ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - return "SCHEMA_VERTEX_PROPERTY_WRONG_TYPE"; - case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - return "SCHEMA_VERTEX_UPDATE_PRIMARY_KEY"; - case ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - return "SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL"; - case ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - return "SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY"; - case ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: - return "SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED"; - case ErrorCode::OBJECT_NOT_FOUND: - return "OBJECT_NOT_FOUND"; - } -} - struct ShardError { - ShardError(ErrorCode code, std::string message, std::string source) + ShardError(common::ErrorCode code, std::string message, std::string source) : code{code}, message{std::move(message)}, source{std::move(source)} {} - ShardError(ErrorCode code, std::string source) : code{code}, source{std::move(source)} {} + ShardError(common::ErrorCode code, std::string source) : code{code}, source{std::move(source)} {} - ErrorCode code; + common::ErrorCode code; // TODO Maybe add category std::string message; std::string source; diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 64df35a7e..97c068524 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -31,14 +31,14 @@ std::optional SchemaValidator::ValidateVertexCreate( // Schema on primary label const auto *schema = schemas_->GetSchema(primary_label); if (schema == nullptr) { - return SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, + return SHARD_ERROR(common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, fmt::format("Schema not defined for label :{}", name_id_mapper_->IdToName(primary_label))); } // Is there another primary label among secondary labels for (const auto &secondary_label : labels) { if (schemas_->GetSchema(secondary_label)) { - return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, + return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, fmt::format("Cannot add label :{}, since it is defined as a primary label", name_id_mapper_->IdToName(secondary_label))); } @@ -46,7 +46,7 @@ std::optional SchemaValidator::ValidateVertexCreate( // Quick size check if (schema->second.size() != primary_properties.size()) { - return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, + return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, fmt::format("Not all primary properties have been specified for :{} vertex", name_id_mapper_->IdToName(primary_label))); } @@ -56,7 +56,7 @@ std::optional SchemaValidator::ValidateVertexCreate( if (auto property_schema_type = PropertyTypeToSchemaType(primary_properties[i]); property_schema_type && *property_schema_type != schema->second[i].type) { return SHARD_ERROR( - ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, fmt::format("Property {} is of wrong type, expected {}, actual {}", name_id_mapper_->IdToName(schema->second[i].property_id), SchemaTypeToString(schema->second[i].type), SchemaTypeToString(*property_schema_type))); @@ -78,7 +78,7 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId [property_id](const auto &schema_property) { return property_id == schema_property.property_id; }); schema_property != schema->second.end()) { return SHARD_ERROR( - ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, fmt::format("Cannot update primary property {} of schema on label :{}", name_id_mapper_->IdToName(schema_property->property_id), name_id_mapper_->IdToName(primary_label))); } @@ -88,7 +88,7 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { const auto *schema = schemas_->GetSchema(label); if (schema) { - return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, + return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, fmt::format("Cannot add/remove primary label :{}", name_id_mapper_->IdToName(label))); } return std::nullopt; diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index 0fafe4bf6..bad7e8d0a 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -364,7 +364,7 @@ ShardResult Shard::Accessor::CreateVertexAndValidate( VertexAccessor vertex_acc{&it->vertex, transaction_, &shard_->indices_, config_, shard_->vertex_validator_}; if (!inserted) { - return SHARD_ERROR(ErrorCode::VERTEX_ALREADY_INSERTED); + return SHARD_ERROR(common::ErrorCode::VERTEX_ALREADY_INSERTED); } MG_ASSERT(it != acc.end(), "Invalid Vertex accessor!"); @@ -401,13 +401,14 @@ ShardResult> Shard::Accessor::DeleteVertex(VertexA "accessor when deleting a vertex!"); auto *vertex_ptr = vertex->vertex_; - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) { return std::optional{}; } - if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) return SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES); + if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) + return SHARD_ERROR(common::ErrorCode::VERTEX_HAS_EDGES); CreateAndLinkDelta(transaction_, vertex_ptr, Delta::RecreateObjectTag()); vertex_ptr->deleted = true; @@ -429,7 +430,7 @@ ShardResult>>> std::vector out_edges; { - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) return std::optional{}; @@ -444,7 +445,7 @@ ShardResult>>> EdgeAccessor e(edge, edge_type, from_vertex, vertex_id, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError().code == ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError().code == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } @@ -457,7 +458,7 @@ ShardResult>>> EdgeAccessor e(edge, edge_type, vertex_id, to_vertex, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError().code == ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError().code == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } @@ -470,7 +471,7 @@ ShardResult>>> // vertex. Some other transaction could have modified the vertex in the // meantime if we didn't have any edges to delete. - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); MG_ASSERT(!vertex_ptr->deleted, "Invalid database state!"); @@ -507,12 +508,12 @@ ShardResult Shard::Accessor::CreateEdge(VertexId from_vertex_id, V } if (from_is_local) { - if (!PrepareForWrite(transaction_, from_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (from_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!PrepareForWrite(transaction_, from_vertex)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (from_vertex->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); } if (to_is_local && to_vertex != from_vertex) { - if (!PrepareForWrite(transaction_, to_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (to_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!PrepareForWrite(transaction_, to_vertex)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (to_vertex->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); } EdgeRef edge(gid); @@ -567,13 +568,13 @@ ShardResult> Shard::Accessor::DeleteEdge(VertexId fr if (from_is_local) { if (!PrepareForWrite(transaction_, from_vertex)) { - return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!from_vertex->deleted, "Invalid database state!"); } if (to_is_local && to_vertex != from_vertex) { if (!PrepareForWrite(transaction_, to_vertex)) { - return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!to_vertex->deleted, "Invalid database state!"); } diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 1ea22fa8f..1ff8e04b7 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -532,7 +532,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto vertex_to_update = acc.FindVertex(ConvertPropertyVector(std::move(vertex.primary_key)), View::OLD); if (!vertex_to_update) { action_successful = false; - shard_error.emplace(msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}); + shard_error.emplace(msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}); spdlog::debug("In transaction {} vertex could not be found while trying to update its properties.", req.transaction_id.logical_id); continue; @@ -564,7 +564,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { spdlog::debug("Error while trying to delete vertex. Vertex to delete does not exist. Transaction id: {}", req.transaction_id.logical_id); action_successful = false; - shard_error.emplace(msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}); + shard_error.emplace(msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}); spdlog::debug("In transaction {} vertex could not be found while trying to delete it.", req.transaction_id.logical_id); break; @@ -612,7 +612,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { if (!(shard_->IsVertexBelongToShard(from_vertex_id) || shard_->IsVertexBelongToShard(to_vertex_id))) { action_successful = false; - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Error while trying to insert edge, none of the vertices belong to this shard"}; spdlog::debug("Error while trying to insert edge, none of the vertices belong to this shard. Transaction id: {}", req.transaction_id.logical_id); @@ -638,7 +638,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { } else { // TODO Code for this action_successful = false; - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}; spdlog::debug("Creating edge was not successful. Transaction id: {}", req.transaction_id.logical_id); break; } @@ -697,7 +697,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(edge.src.second)), View::OLD); if (!vertex_acc) { action_successful = false; - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found"}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found"}; spdlog::debug("Encountered an error while trying to acquire VertexAccessor with transaction id: {}", req.transaction_id.logical_id); continue; @@ -733,7 +733,7 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { if (!edge_accessor_did_match) { // TODO(jbajic) Do we need this - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Edge was not found"}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Edge was not found"}; action_successful = false; spdlog::debug("Could not find the Edge with the specified Gid. Transaction id: {}", req.transaction_id.logical_id); @@ -785,7 +785,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { // Vertex is separated from the properties in the response. // Is it useful to return just a vertex without the properties? if (!found_props) { - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Requested properties were not found!"}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Requested properties were not found!"}; action_successful = false; } @@ -858,7 +858,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { // Get Vertex acc auto src_vertex_acc_opt = acc.FindVertex(ConvertPropertyVector((src_vertex.second)), View::NEW); if (!src_vertex_acc_opt) { - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; action_successful = false; spdlog::debug("Encountered an error while trying to obtain VertexAccessor. Transaction id: {}", req.transaction_id.logical_id); @@ -878,7 +878,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { if (result.HasError()) { // Code Error - shard_error = msgs::ShardError{ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; + shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; action_successful = false; break; } diff --git a/src/storage/v3/vertex_accessor.cpp b/src/storage/v3/vertex_accessor.cpp index 6949c08cc..88f9aa965 100644 --- a/src/storage/v3/vertex_accessor.cpp +++ b/src/storage/v3/vertex_accessor.cpp @@ -83,9 +83,9 @@ bool VertexAccessor::IsVisible(View view) const { ShardResult VertexAccessor::AddLabel(LabelId label) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -104,9 +104,9 @@ ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -120,9 +120,9 @@ ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { } ShardResult VertexAccessor::RemoveLabel(LabelId label) { - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -139,9 +139,9 @@ ShardResult VertexAccessor::RemoveLabelAndValidate(LabelId label) { return {*maybe_violation_error}; } - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -197,8 +197,8 @@ ShardResult VertexAccessor::HasLabel(LabelId label, View view) const { break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return has_label; } @@ -267,17 +267,17 @@ ShardResult> VertexAccessor::Labels(View view) const { break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return std::move(labels); } ShardResult VertexAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto current_value = vertex_->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -323,10 +323,10 @@ ShardResult VertexAccessor::CheckVertexExistence(View view) const { } }); if (!exists) { - return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); } if (!for_deleted_ && deleted) { - return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); } return {}; } @@ -338,11 +338,11 @@ ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId pro utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; if (!PrepareForWrite(transaction_, vertex_)) { - return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); } if (vertex_->deleted) { - return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); } auto current_value = vertex_->properties.GetProperty(property); @@ -361,9 +361,9 @@ ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId pro } ShardResult> VertexAccessor::ClearProperties() { - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); auto properties = vertex_->properties.Properties(); for (const auto &property : properties) { @@ -441,8 +441,8 @@ ShardResult VertexAccessor::GetProperty(PropertyId property, View break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return std::move(value); } @@ -491,8 +491,8 @@ ShardResult> VertexAccessor::Properties(View break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return std::move(properties); } @@ -563,8 +563,8 @@ ShardResult> VertexAccessor::InEdges(View view, const break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); std::vector ret; if (in_edges.empty()) { return ret; @@ -643,8 +643,8 @@ ShardResult> VertexAccessor::OutEdges(View view, const break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); std::vector ret; if (out_edges.empty()) { return ret; @@ -690,8 +690,8 @@ ShardResult VertexAccessor::InDegree(View view) const { break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return degree; } @@ -727,8 +727,8 @@ ShardResult VertexAccessor::OutDegree(View view) const { break; } }); - if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); return degree; } diff --git a/tests/unit/storage_v3.cpp b/tests/unit/storage_v3.cpp index cd524cf41..a214ccac6 100644 --- a/tests/unit/storage_v3.cpp +++ b/tests/unit/storage_v3.cpp @@ -17,6 +17,7 @@ #include #include +#include "common/errors.hpp" #include "coordinator/hybrid_logical_clock.hpp" #include "io/time.hpp" #include "storage/v3/delta.hpp" @@ -579,7 +580,7 @@ TEST_P(StorageV3, VertexDeleteSerializationError) { EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); auto res = acc2.DeleteVertex(&*vertex); ASSERT_TRUE(res.HasError()); - ASSERT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); + ASSERT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); EXPECT_EQ(CountVertices(acc2, View::OLD), 1U); EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); acc2.AdvanceCommand(); @@ -710,20 +711,20 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_FALSE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Labels(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -778,33 +779,33 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_TRUE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); { auto labels = vertex->Labels(View::OLD).GetValue(); ASSERT_EQ(labels.size(), 1); ASSERT_EQ(labels[0], label5); } - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether label 5 exists - ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -854,14 +855,14 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether label 5 exists ASSERT_TRUE(vertex->GetProperty(property5, View::OLD)->IsNull()); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Properties(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Try to set the property5 { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -917,27 +918,27 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether property 5 exists ASSERT_EQ(vertex->GetProperty(property5, View::OLD)->ValueString(), "nandare"); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); { auto properties = vertex->Properties(View::OLD).GetValue(); ASSERT_EQ(properties.size(), 1); ASSERT_EQ(properties[property5].ValueString(), "nandare"); } - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether property 5 exists - ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); // Try to set the property { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -1370,7 +1371,7 @@ TEST_P(StorageV3, VertexLabelSerializationError) { { auto res = vertex->AddLabelAndValidate(label1); - AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); + AssertShardErrorEqual(res, SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); } } @@ -1864,7 +1865,7 @@ TEST_P(StorageV3, VertexPropertySerializationError) { { auto res = vertex->SetPropertyAndValidate(property2, PropertyValue("nandare")); - AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); + AssertShardErrorEqual(res, SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); } } @@ -2254,14 +2255,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{0}, {}); // Check state before (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); // Check state before (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 0); @@ -2281,14 +2282,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { .HasValue()); // Check state after (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); // Check state after (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 1); @@ -2656,31 +2657,31 @@ TEST_P(StorageV3, TestCreateVertexAndValidate) { ASSERT_TRUE(vertex2.HasError()); auto error = vertex2.GetError(); - ASSERT_TRUE(error.code == storage::v3::ErrorCode::VERTEX_ALREADY_INSERTED); + ASSERT_TRUE(error.code == common::ErrorCode::VERTEX_ALREADY_INSERTED); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {PropertyValue{"test"}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } } } // namespace memgraph::storage::v3::tests diff --git a/tests/unit/storage_v3_edge.cpp b/tests/unit/storage_v3_edge.cpp index 64f7f4e2e..47327ca3e 100644 --- a/tests/unit/storage_v3_edge.cpp +++ b/tests/unit/storage_v3_edge.cpp @@ -3242,7 +3242,7 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { { auto ret = acc.DeleteVertex(&vertex_from.value()); ASSERT_TRUE(ret.HasError()); - ASSERT_EQ(ret.GetError(), SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES)); + ASSERT_EQ(ret.GetError(), SHARD_ERROR(common::ErrorCode::VERTEX_HAS_EDGES)); } // Detach delete vertex @@ -3255,8 +3255,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { // Check edges ASSERT_EQ(vertex_from->InEdges(View::OLD)->size(), 0); ASSERT_EQ(*vertex_from->InDegree(View::OLD), 0); - ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); { auto ret = vertex_from->OutEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); @@ -3269,8 +3269,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { ASSERT_EQ(e.FromVertex(), from_id); ASSERT_EQ(e.ToVertex(), to_id); } - ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); { auto ret = vertex_to->InEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index e5f651bf2..4ce611c98 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -18,6 +18,7 @@ #include #include +#include "common/errors.hpp" #include "common/types.hpp" #include "storage/v3/id_types.hpp" #include "storage/v3/property_value.hpp" @@ -187,43 +188,43 @@ TEST_F(SchemaValidatorTest, TestSchemaValidateVertexCreate) { { const auto schema_violation = schema_validator.ValidateVertexCreate(NameToLabel("test"), {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } // Validate wrong secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label1}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label2}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } // Validate wrong property type { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto wrong_prop = PropertyValue(TemporalData(TemporalType::Date, 1234)); const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), wrong_prop}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } // Passing validations EXPECT_EQ(schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue("test")}), std::nullopt); @@ -245,12 +246,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdate) { { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label1, prop_string); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label2, prop_duration); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_int), std::nullopt); EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_duration), std::nullopt); @@ -262,12 +263,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdateLabel) { { const auto schema_violation = schema_validator.ValidateLabelUpdate(label1); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } { const auto schema_violation = schema_validator.ValidateLabelUpdate(label2); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } EXPECT_EQ(schema_validator.ValidateLabelUpdate(NameToLabel("test")), std::nullopt); } diff --git a/tests/unit/storage_v3_vertex_accessors.cpp b/tests/unit/storage_v3_vertex_accessors.cpp index 3ba8def82..dd515983a 100644 --- a/tests/unit/storage_v3_vertex_accessors.cpp +++ b/tests/unit/storage_v3_vertex_accessors.cpp @@ -16,6 +16,7 @@ #include #include +#include "common/errors.hpp" #include "common/types.hpp" #include "storage/v3/delta.hpp" #include "storage/v3/id_types.hpp" @@ -76,7 +77,7 @@ TEST_F(StorageV3Accessor, TestPrimaryLabel) { ASSERT_TRUE(vertex.PrimaryLabel(View::OLD).HasError()); const auto error_primary_label = vertex.PrimaryLabel(View::OLD).GetError(); ASSERT_FALSE(vertex.PrimaryLabel(View::NEW).HasError()); - EXPECT_EQ(error_primary_label, SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + EXPECT_EQ(error_primary_label, SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); } { auto acc = storage.Access(GetNextHlc()); @@ -127,7 +128,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { const auto label1 = NameToLabelId("label"); auto vertex = acc.CreateVertexAndValidate({label1}, {PropertyValue{2}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = storage.Access(GetNextHlc()); @@ -136,7 +137,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { ASSERT_TRUE(vertex.HasValue()); const auto schema_violation = vertex->AddLabelAndValidate(label1); ASSERT_TRUE(schema_violation.HasError()); - EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -180,7 +181,7 @@ TEST_F(StorageV3Accessor, TestRemoveLabels) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res1 = vertex.RemoveLabelAndValidate(primary_label); ASSERT_TRUE(res1.HasError()); - EXPECT_EQ(res1.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(res1.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -199,14 +200,14 @@ TEST_F(StorageV3Accessor, TestSetKeysAndProperties) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{1}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue(1)); ASSERT_TRUE(res.HasError()); - EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { auto acc = storage.Access(GetNextHlc()); auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue()); ASSERT_TRUE(res.HasError()); - EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } } From bffef1a653cd59e69b94c0a0d9a6c7079edec3d6 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 11:13:23 +0100 Subject: [PATCH 17/30] Use experimental source location --- src/expr/interpret/eval.hpp | 8 ++++---- src/storage/v3/result.hpp | 10 ++++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/expr/interpret/eval.hpp b/src/expr/interpret/eval.hpp index 85911678d..758ea3797 100644 --- a/src/expr/interpret/eval.hpp +++ b/src/expr/interpret/eval.hpp @@ -100,7 +100,7 @@ class ExpressionEvaluator : public ExpressionVisitor { #undef BINARY_OPERATOR_VISITOR #undef UNARY_OPERATOR_VISITOR - void HandleShardError(Error &shard_error, const std::string_view accessed_object) { + void HandleObjectAccessError(Error &shard_error, const std::string_view accessed_object) { switch (shard_error) { case Error::DELETED_OBJECT: throw ExpressionRuntimeException("Trying to access {} on a deleted object.", accessed_object); @@ -418,7 +418,7 @@ class ExpressionEvaluator : public ExpressionVisitor { has_label = vertex.HasLabel(StorageView::NEW, GetLabel(label)); } if (has_label.HasError()) { - HandleShardError(has_label.GetError().code, "labels"); + HandleObjectAccessError(has_label.GetError().code, "labels"); } return *has_label; } @@ -756,7 +756,7 @@ class ExpressionEvaluator : public ExpressionVisitor { maybe_prop = record_accessor.GetProperty(StorageView::NEW, ctx_->properties[prop.ix]); } if (maybe_prop.HasError()) { - HandleShardError(maybe_prop.GetError().code, "property"); + HandleObjectAccessError(maybe_prop.GetError().code, "property"); } return conv_(*maybe_prop, ctx_->memory); } @@ -775,7 +775,7 @@ class ExpressionEvaluator : public ExpressionVisitor { maybe_prop = record_accessor.GetProperty(view_, dba_->NameToProperty(name)); } if (maybe_prop.HasError()) { - HandleShardError(maybe_prop.GetError().code, "property"); + HandleObjectAccessError(maybe_prop.GetError().code, "property"); } return conv_(*maybe_prop, ctx_->memory); } diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index c9c0c8a4b..b86ede6b4 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -12,6 +12,7 @@ #pragma once #include +#include #include #include #include @@ -24,10 +25,11 @@ namespace memgraph::storage::v3 { static_assert(std::is_same_v); struct ShardError { - ShardError(common::ErrorCode code, std::string message, std::string source) - : code{code}, message{std::move(message)}, source{std::move(source)} {} + ShardError(common::ErrorCode code, std::string message, const std::experimental::source_location location) + : code{code}, message{std::move(message)}, source{fmt::format("{}:{}", location.file_name(), location.line())} {} - ShardError(common::ErrorCode code, std::string source) : code{code}, source{std::move(source)} {} + ShardError(common::ErrorCode code, const std::experimental::source_location location) + : code{code}, source{fmt::format("{}:{}", location.file_name(), location.line())} {} common::ErrorCode code; // TODO Maybe add category @@ -38,7 +40,7 @@ struct ShardError { }; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, fmt::format("{}:{}", __FILE__, __LINE__)) +#define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, std::experimental::source_location::current()) template using ShardResult = utils::BasicResult; From 37f5fb29ea30134d6ee9e65dca21c01e9afc23fe Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 13:15:32 +0100 Subject: [PATCH 18/30] Introduce BoltResult --- src/glue/v2/communication.cpp | 23 +++++++++++------------ src/glue/v2/communication.hpp | 28 ++++++++++++++++------------ src/query/v2/plan/operator.cpp | 28 ---------------------------- 3 files changed, 27 insertions(+), 52 deletions(-) diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index 0b185d19b..a977e0e29 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -71,9 +71,9 @@ query::v2::TypedValue ToTypedValue(const Value &value) { } } -storage::v3::ShardResult ToBoltVertex( - const query::v2::accessors::VertexAccessor &vertex, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View /*view*/) { +BoltResult ToBoltVertex(const query::v2::accessors::VertexAccessor &vertex, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View /*view*/) { auto id = communication::bolt::Id::FromUint(0); auto labels = vertex.Labels(); @@ -91,9 +91,9 @@ storage::v3::ShardResult ToBoltVertex( return communication::bolt::Vertex{id, new_labels, new_properties}; } -storage::v3::ShardResult ToBoltEdge( - const query::v2::accessors::EdgeAccessor &edge, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View /*view*/) { +BoltResult ToBoltEdge(const query::v2::accessors::EdgeAccessor &edge, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication auto id = communication::bolt::Id::FromUint(0); auto from = communication::bolt::Id::FromUint(0); @@ -108,16 +108,15 @@ storage::v3::ShardResult ToBoltEdge( return communication::bolt::Edge{id, from, to, type, new_properties}; } -storage::v3::ShardResult ToBoltPath( - const query::v2::accessors::Path & /*edge*/, const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, - storage::v3::View /*view*/) { +BoltResult ToBoltPath(const query::v2::accessors::Path & /*edge*/, + const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, + storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication return {SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)}; } -storage::v3::ShardResult ToBoltValue(const query::v2::TypedValue &value, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view) { +BoltResult ToBoltValue(const query::v2::TypedValue &value, + const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view) { switch (value.type()) { case query::v2::TypedValue::Type::Null: return Value(); diff --git a/src/glue/v2/communication.hpp b/src/glue/v2/communication.hpp index debc26adf..4ea05a61d 100644 --- a/src/glue/v2/communication.hpp +++ b/src/glue/v2/communication.hpp @@ -20,6 +20,7 @@ #include "storage/v3/result.hpp" #include "storage/v3/shard.hpp" #include "storage/v3/view.hpp" +#include "utils/result.hpp" namespace memgraph::storage::v3 { class EdgeAccessor; @@ -29,42 +30,45 @@ class VertexAccessor; namespace memgraph::glue::v2 { +template +using BoltResult = utils::BasicResult; + /// @param storage::v3::VertexAccessor for converting to /// communication::bolt::Vertex. /// @param msgs::ShardRequestManagerInterface *shard_request_manager getting label and property names. /// @param storage::v3::View for deciding which vertex attributes are visible. /// /// @throw std::bad_alloc -storage::v3::ShardResult ToBoltVertex( - const storage::v3::VertexAccessor &vertex, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +BoltResult ToBoltVertex(const storage::v3::VertexAccessor &vertex, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param storage::v3::EdgeAccessor for converting to communication::bolt::Edge. /// @param msgs::ShardRequestManagerInterface *shard_request_manager getting edge type and property names. /// @param storage::v3::View for deciding which edge attributes are visible. /// /// @throw std::bad_alloc -storage::v3::ShardResult ToBoltEdge( - const storage::v3::EdgeAccessor &edge, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +BoltResult ToBoltEdge(const storage::v3::EdgeAccessor &edge, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param query::v2::Path for converting to communication::bolt::Path. /// @param msgs::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge. /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -storage::v3::ShardResult ToBoltPath( - const query::v2::accessors::Path &path, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +BoltResult ToBoltPath(const query::v2::accessors::Path &path, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param query::v2::TypedValue for converting to communication::bolt::Value. /// @param msgs::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge. /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -storage::v3::ShardResult ToBoltValue( - const query::v2::TypedValue &value, const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +BoltResult ToBoltValue(const query::v2::TypedValue &value, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); query::v2::TypedValue ToTypedValue(const communication::bolt::Value &value); diff --git a/src/query/v2/plan/operator.cpp b/src/query/v2/plan/operator.cpp index 59e1c6d68..095061ebb 100644 --- a/src/query/v2/plan/operator.cpp +++ b/src/query/v2/plan/operator.cpp @@ -564,34 +564,6 @@ UniqueCursorPtr ScanAllById::MakeCursor(utils::MemoryResource *mem) const { std::move(vertices), "ScanAllById"); } -namespace { - -template -auto UnwrapEdgesResult(storage::v3::ShardResult &&result) { - if (result.HasError()) { - switch (result.GetError().code) { - case common::ErrorCode::DELETED_OBJECT: - throw QueryRuntimeException("Trying to get relationships of a deleted node."); - case common::ErrorCode::NONEXISTENT_OBJECT: - throw query::v2::QueryRuntimeException("Trying to get relationships from a node that doesn't exist."); - case common::ErrorCode::VERTEX_HAS_EDGES: - case common::ErrorCode::SERIALIZATION_ERROR: - case common::ErrorCode::PROPERTIES_DISABLED: - throw QueryRuntimeException("Unexpected error when accessing relationships."); - case common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: - throw QueryRuntimeException("SchemaViolation occurred when accessing relationships."); - } - } - return std::move(*result); -} - -} // namespace - Expand::Expand(const std::shared_ptr &input, Symbol input_symbol, Symbol node_symbol, Symbol edge_symbol, EdgeAtom::Direction direction, const std::vector &edge_types, bool existing_node, storage::v3::View view) From d080e260e63c5e50091659e6619083911ead9ae7 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 13:27:02 +0100 Subject: [PATCH 19/30] Remove redundant code --- src/expr/interpret/eval.hpp | 6 +++--- src/query/v2/common.hpp | 14 ------------- src/query/v2/plan/operator.cpp | 36 ---------------------------------- src/storage/v3/result.hpp | 2 ++ 4 files changed, 5 insertions(+), 53 deletions(-) diff --git a/src/expr/interpret/eval.hpp b/src/expr/interpret/eval.hpp index 758ea3797..a7d027ede 100644 --- a/src/expr/interpret/eval.hpp +++ b/src/expr/interpret/eval.hpp @@ -407,7 +407,7 @@ class ExpressionEvaluator : public ExpressionVisitor { typename TReturnType = std::enable_if_t, bool>> TReturnType HasLabelImpl(const VertexAccessor &vertex, const LabelIx &label, StorageTag /*tag*/) { auto has_label = vertex.HasLabel(view_, GetLabel(label)); - if (has_label.HasError() && has_label.GetError().code == Error::NONEXISTENT_OBJECT) { + if (has_label.HasError() && has_label.GetError() == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE // work. The old storage had the following logic when returning an // `OLD` view: `return old ? old : new`. That means that if the @@ -746,7 +746,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, PropertyIx prop) { auto maybe_prop = record_accessor.GetProperty(view_, ctx_->properties[prop.ix]); - if (maybe_prop.HasError() && maybe_prop.GetError().code == Error::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError() == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't @@ -765,7 +765,7 @@ class ExpressionEvaluator : public ExpressionVisitor { class TReturnType = std::enable_if_t, TypedValue>> TypedValue GetProperty(const TRecordAccessor &record_accessor, const std::string_view name) { auto maybe_prop = record_accessor.GetProperty(view_, dba_->NameToProperty(name)); - if (maybe_prop.HasError() && maybe_prop.GetError().code == Error::NONEXISTENT_OBJECT) { + if (maybe_prop.HasError() && maybe_prop.GetError() == Error::NONEXISTENT_OBJECT) { // This is a very nasty and temporary hack in order to make MERGE work. // The old storage had the following logic when returning an `OLD` view: // `return old ? old : new`. That means that if the `OLD` view didn't diff --git a/src/query/v2/common.hpp b/src/query/v2/common.hpp index 774a90a37..089f3a4f9 100644 --- a/src/query/v2/common.hpp +++ b/src/query/v2/common.hpp @@ -81,19 +81,5 @@ inline void ExpectType(const Symbol &symbol, const TypedValue &value, TypedValue throw QueryRuntimeException("Expected a {} for '{}', but got {}.", expected, symbol.name(), value.type()); } -template -concept AccessorWithSetProperty = requires(T accessor, const storage::v3::PropertyId key, - const storage::v3::PropertyValue new_value) { - { accessor.SetProperty(key, new_value) } -> std::same_as>; -}; - -template -concept AccessorWithSetPropertyAndValidate = requires(T accessor, const storage::v3::PropertyId key, - const storage::v3::PropertyValue new_value) { - { - accessor.SetPropertyAndValidate(key, new_value) - } -> std::same_as>; -}; - int64_t QueryTimestamp(); } // namespace memgraph::query::v2 diff --git a/src/query/v2/plan/operator.cpp b/src/query/v2/plan/operator.cpp index 095061ebb..d82d83034 100644 --- a/src/query/v2/plan/operator.cpp +++ b/src/query/v2/plan/operator.cpp @@ -816,45 +816,9 @@ std::vector SetProperties::ModifiedSymbols(const SymbolTable &table) con SetProperties::SetPropertiesCursor::SetPropertiesCursor(const SetProperties &self, utils::MemoryResource *mem) : self_(self), input_cursor_(self.input_->MakeCursor(mem)) {} -namespace { - -template -concept AccessorWithProperties = requires(T value, storage::v3::PropertyId property_id, - storage::v3::PropertyValue property_value) { - { - value.ClearProperties() - } -> std::same_as>>; - {value.SetProperty(property_id, property_value)}; -}; - -} // namespace - bool SetProperties::SetPropertiesCursor::Pull(Frame &frame, ExecutionContext &context) { SCOPED_PROFILE_OP("SetProperties"); return false; - // if (!input_cursor_->Pull(frame, context)) return false; - // - // TypedValue &lhs = frame[self_.input_symbol_]; - // - // // Set, just like Create needs to see the latest changes. - // ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.db_accessor, - // storage::v3::View::NEW); - // TypedValue rhs = self_.rhs_->Accept(evaluator); - // - // switch (lhs.type()) { - // case TypedValue::Type::Vertex: - // SetPropertiesOnRecord(&lhs.ValueVertex(), rhs, self_.op_, &context); - // break; - // case TypedValue::Type::Edge: - // SetPropertiesOnRecord(&lhs.ValueEdge(), rhs, self_.op_, &context); - // break; - // case TypedValue::Type::Null: - // // Skip setting properties on Null (can occur in optional match). - // break; - // default: - // throw QueryRuntimeException("Properties can only be set on edges and vertices."); - // } - // return true; } void SetProperties::SetPropertiesCursor::Shutdown() { input_cursor_->Shutdown(); } diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index b86ede6b4..2b5b316bb 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -37,6 +37,8 @@ struct ShardError { std::string source; inline friend bool operator==(const ShardError &lhs, const ShardError &rhs) { return lhs.code == rhs.code; } + + inline friend bool operator==(const ShardError &lhs, const common::ErrorCode rhs) { return lhs.code == rhs; } }; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) From 2a6dc7bb934f7de76a406d239e06f5aa5e2b3bf6 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 13:49:12 +0100 Subject: [PATCH 20/30] Remove success --- src/query/v2/requests.hpp | 10 ---- src/query/v2/shard_request_manager.hpp | 10 ++-- src/storage/v3/shard_rsm.cpp | 58 +++++-------------- tests/simulation/shard_rsm.cpp | 26 ++++----- tests/simulation/test_cluster.hpp | 2 +- tests/unit/high_density_shard_create_scan.cpp | 2 +- tests/unit/machine_manager.cpp | 2 +- 7 files changed, 37 insertions(+), 73 deletions(-) diff --git a/src/query/v2/requests.hpp b/src/query/v2/requests.hpp index 62a4e93f8..f61275377 100644 --- a/src/query/v2/requests.hpp +++ b/src/query/v2/requests.hpp @@ -367,7 +367,6 @@ struct ScanResultRow { }; struct ScanVerticesResponse { - bool success; std::optional error; std::optional next_start_id; std::vector results; @@ -388,7 +387,6 @@ struct GetPropertiesRequest { }; struct GetPropertiesResponse { - bool success; std::optional error; }; @@ -454,7 +452,6 @@ struct ExpandOneResultRow { }; struct ExpandOneResponse { - bool success; std::optional error; std::vector result; }; @@ -489,7 +486,6 @@ struct CreateVerticesRequest { }; struct CreateVerticesResponse { - bool success; std::optional error; }; @@ -501,7 +497,6 @@ struct DeleteVerticesRequest { }; struct DeleteVerticesResponse { - bool success; std::optional error; }; @@ -511,7 +506,6 @@ struct UpdateVerticesRequest { }; struct UpdateVerticesResponse { - bool success; std::optional error; }; @@ -534,7 +528,6 @@ struct CreateExpandRequest { }; struct CreateExpandResponse { - bool success; std::optional error; }; @@ -544,7 +537,6 @@ struct DeleteEdgesRequest { }; struct DeleteEdgesResponse { - bool success; std::optional error; }; @@ -554,7 +546,6 @@ struct UpdateEdgesRequest { }; struct UpdateEdgesResponse { - bool success; std::optional error; }; @@ -564,7 +555,6 @@ struct CommitRequest { }; struct CommitResponse { - bool success; std::optional error; }; diff --git a/src/query/v2/shard_request_manager.hpp b/src/query/v2/shard_request_manager.hpp index a73201046..20bae7b97 100644 --- a/src/query/v2/shard_request_manager.hpp +++ b/src/query/v2/shard_request_manager.hpp @@ -206,7 +206,7 @@ class ShardRequestManager : public ShardRequestManagerInterface { } WriteResponses write_response_variant = commit_response.GetValue(); auto &response = std::get(write_response_variant); - if (!response.success) { + if (response.error) { throw std::runtime_error("Commit request did not succeed"); } } @@ -311,7 +311,7 @@ class ShardRequestManager : public ShardRequestManagerInterface { WriteResponses response_variant = write_response_result.GetValue(); CreateExpandResponse mapped_response = std::get(response_variant); - if (!mapped_response.success) { + if (mapped_response.error) { throw std::runtime_error("CreateExpand request did not succeed"); } responses.push_back(mapped_response); @@ -601,7 +601,7 @@ class ShardRequestManager : public ShardRequestManagerInterface { WriteResponses response_variant = poll_result->GetValue(); auto response = std::get(response_variant); - if (!response.success) { + if (response.error) { throw std::runtime_error("CreateVertices request did not succeed"); } responses.push_back(response); @@ -637,7 +637,7 @@ class ShardRequestManager : public ShardRequestManagerInterface { // Currently a boolean flag for signaling the overall success of the // ExpandOne request does not exist. But it should, so here we assume // that it is already in place. - if (!response.success) { + if (response.error) { throw std::runtime_error("ExpandOne request did not succeed"); } @@ -680,7 +680,7 @@ class ShardRequestManager : public ShardRequestManagerInterface { ReadResponses read_response_variant = await_result->GetValue(); auto response = std::get(read_response_variant); - if (!response.success) { + if (response.error) { throw std::runtime_error("ScanAll request did not succeed"); } diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 1ff8e04b7..7a128a78f 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -487,7 +487,6 @@ auto CreateErrorResponse(const ShardError &shard_error, const auto transaction_i msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; for (auto &new_vertex : req.new_vertices) { @@ -510,28 +509,25 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateVerticesRequest &&req) { if (result_schema.HasError()) { shard_error.emplace(CreateErrorResponse(result_schema.GetError(), req.transaction_id, "creating vertices")); - action_successful = false; break; } } - return msgs::CreateVerticesResponse{action_successful, std::move(shard_error)}; + return msgs::CreateVerticesResponse{std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; for (auto &vertex : req.new_properties) { - if (!action_successful) { + if (shard_error) { break; } auto vertex_to_update = acc.FindVertex(ConvertPropertyVector(std::move(vertex.primary_key)), View::OLD); if (!vertex_to_update) { - action_successful = false; shard_error.emplace(msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}); spdlog::debug("In transaction {} vertex could not be found while trying to update its properties.", req.transaction_id.logical_id); @@ -542,18 +538,16 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateVerticesRequest &&req) { auto result_schema = vertex_to_update->SetPropertyAndValidate(update_prop.first, ToPropertyValue(std::move(update_prop.second))); if (result_schema.HasError()) { - action_successful = false; shard_error.emplace(CreateErrorResponse(result_schema.GetError(), req.transaction_id, "updating vertices")); break; } } } - return msgs::UpdateVerticesResponse{action_successful, std::move(shard_error)}; + return msgs::UpdateVerticesResponse{std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { - bool action_successful = true; std::optional shard_error; auto acc = shard_->Access(req.transaction_id); @@ -563,7 +557,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { if (!vertex_acc) { spdlog::debug("Error while trying to delete vertex. Vertex to delete does not exist. Transaction id: {}", req.transaction_id.logical_id); - action_successful = false; shard_error.emplace(msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}); spdlog::debug("In transaction {} vertex could not be found while trying to delete it.", req.transaction_id.logical_id); @@ -576,7 +569,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { case msgs::DeleteVerticesRequest::DeletionType::DELETE: { auto result = acc.DeleteVertex(&vertex_acc.value()); if (result.HasError() || !(result.GetValue().has_value())) { - action_successful = false; shard_error.emplace(CreateErrorResponse(result.GetError(), req.transaction_id, "deleting vertices")); } break; @@ -584,23 +576,21 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { case msgs::DeleteVerticesRequest::DeletionType::DETACH_DELETE: { auto result = acc.DetachDeleteVertex(&vertex_acc.value()); if (result.HasError() || !(result.GetValue().has_value())) { - action_successful = false; shard_error.emplace(CreateErrorResponse(result.GetError(), req.transaction_id, "deleting vertices")); } break; } } - if (!action_successful) { + if (shard_error) { break; } } - return msgs::DeleteVerticesResponse{action_successful, std::move(shard_error)}; + return msgs::DeleteVerticesResponse{std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; for (auto &new_expand : req.new_expands) { @@ -611,7 +601,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { VertexId{new_expand.dest_vertex.first.id, ConvertPropertyVector(std::move(new_expand.dest_vertex.second))}; if (!(shard_->IsVertexBelongToShard(from_vertex_id) || shard_->IsVertexBelongToShard(to_vertex_id))) { - action_successful = false; shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Error while trying to insert edge, none of the vertices belong to this shard"}; spdlog::debug("Error while trying to insert edge, none of the vertices belong to this shard. Transaction id: {}", @@ -625,19 +614,17 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { if (!new_expand.properties.empty()) { for (const auto &[property, value] : new_expand.properties) { if (const auto maybe_error = edge.SetProperty(property, ToPropertyValue(value)); maybe_error.HasError()) { - action_successful = false; shard_error.emplace( CreateErrorResponse(maybe_error.GetError(), req.transaction_id, "setting edge property")); break; } } - if (!action_successful) { + if (shard_error) { break; } } } else { // TODO Code for this - action_successful = false; shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}; spdlog::debug("Creating edge was not successful. Transaction id: {}", req.transaction_id.logical_id); break; @@ -648,7 +635,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { for (auto &[edge_prop_key, edge_prop_val] : new_expand.properties) { auto set_result = edge_acc->SetProperty(edge_prop_key, ToPropertyValue(std::move(edge_prop_val))); if (set_result.HasError()) { - action_successful = false; shard_error.emplace(CreateErrorResponse(set_result.GetError(), req.transaction_id, "adding edge property")); break; } @@ -656,16 +642,15 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CreateExpandRequest &&req) { } } - return msgs::CreateExpandResponse{action_successful, std::move(shard_error)}; + return msgs::CreateExpandResponse{std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteEdgesRequest &&req) { - bool action_successful = true; std::optional shard_error; auto acc = shard_->Access(req.transaction_id); for (auto &edge : req.edges) { - if (!action_successful) { + if (shard_error) { break; } @@ -673,30 +658,27 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteEdgesRequest &&req) { VertexId(edge.dst.first.id, ConvertPropertyVector(std::move(edge.dst.second))), Gid::FromUint(edge.id.gid)); if (edge_acc.HasError() || !edge_acc.HasValue()) { - action_successful = false; shard_error.emplace(CreateErrorResponse(edge_acc.GetError(), req.transaction_id, "delete edge")); continue; } } - return msgs::DeleteEdgesResponse{action_successful, std::move(shard_error)}; + return msgs::DeleteEdgesResponse{std::move(shard_error)}; } msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { // TODO(antaljanosbenjamin): handle when the vertex is the destination vertex auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; for (auto &edge : req.new_properties) { - if (!action_successful) { + if (shard_error) { break; } auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(edge.src.second)), View::OLD); if (!vertex_acc) { - action_successful = false; shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found"}; spdlog::debug("Encountered an error while trying to acquire VertexAccessor with transaction id: {}", req.transaction_id.logical_id); @@ -707,7 +689,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { // in the vertex's out-going edges auto edges_res = vertex_acc->OutEdges(View::OLD); if (edges_res.HasError()) { - action_successful = false; shard_error.emplace(CreateErrorResponse(edges_res.GetError(), req.transaction_id, "update edge")); continue; } @@ -734,19 +715,17 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::UpdateEdgesRequest &&req) { if (!edge_accessor_did_match) { // TODO(jbajic) Do we need this shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Edge was not found"}; - action_successful = false; spdlog::debug("Could not find the Edge with the specified Gid. Transaction id: {}", req.transaction_id.logical_id); continue; } } - return msgs::UpdateEdgesResponse{action_successful, std::move(shard_error)}; + return msgs::UpdateEdgesResponse{std::move(shard_error)}; } msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; std::vector results; @@ -786,7 +765,6 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { // Is it useful to return just a vertex without the properties? if (!found_props) { shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Requested properties were not found!"}; - action_successful = false; } results.emplace_back(msgs::ScanResultRow{.vertex = ConstructValueVertex(vertex, view).vertex_v, @@ -834,9 +812,8 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { } } - msgs::ScanVerticesResponse resp{.success = action_successful, .error = std::move(shard_error)}; - - if (action_successful) { + msgs::ScanVerticesResponse resp{.error = std::move(shard_error)}; + if (resp.error) { resp.next_start_id = next_start_id; resp.results = std::move(results); } @@ -846,7 +823,6 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { auto acc = shard_->Access(req.transaction_id); - bool action_successful = true; std::optional shard_error; std::vector results; @@ -859,7 +835,6 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { auto src_vertex_acc_opt = acc.FindVertex(ConvertPropertyVector((src_vertex.second)), View::NEW); if (!src_vertex_acc_opt) { shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; - action_successful = false; spdlog::debug("Encountered an error while trying to obtain VertexAccessor. Transaction id: {}", req.transaction_id.logical_id); break; @@ -879,15 +854,14 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { if (result.HasError()) { // Code Error shard_error = msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND, "Source vertex was not found."}; - action_successful = false; break; } results.emplace_back(result.GetValue()); } - msgs::ExpandOneResponse resp{.success = action_successful, .error = std::move(shard_error)}; - if (action_successful) { + msgs::ExpandOneResponse resp{.error = std::move(shard_error)}; + if (!resp.error) { resp.result = std::move(results); } @@ -896,7 +870,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ExpandOneRequest &&req) { msgs::WriteResponses ShardRsm::ApplyWrite(msgs::CommitRequest &&req) { shard_->Access(req.transaction_id).Commit(req.commit_timestamp); - return msgs::CommitResponse{true}; + return msgs::CommitResponse{}; }; // NOLINTNEXTLINE(readability-convert-member-functions-to-static) diff --git a/tests/simulation/shard_rsm.cpp b/tests/simulation/shard_rsm.cpp index 64d0a0861..b9511f024 100644 --- a/tests/simulation/shard_rsm.cpp +++ b/tests/simulation/shard_rsm.cpp @@ -137,7 +137,7 @@ void Commit(ShardClient &client, const coordinator::Hlc &transaction_timestamp) auto write_response_result = write_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success, "Commit expected to be successful, but it is failed"); + MG_ASSERT(!write_response.error.has_value(), "Commit expected to be successful, but it is failed"); break; } @@ -156,7 +156,7 @@ bool AttemptToCreateVertex(ShardClient &client, int64_t value) { create_req.transaction_id.logical_id = GetTransactionId(); auto write_res = client.SendWriteRequest(create_req); - MG_ASSERT(write_res.HasValue() && std::get(write_res.GetValue()).success, + MG_ASSERT(write_res.HasValue() && std::get(write_res.GetValue()).error, "Unexpected failure"); Commit(client, create_req.transaction_id); @@ -179,7 +179,7 @@ bool AttemptToDeleteVertex(ShardClient &client, int64_t value) { auto write_response = std::get(write_response_result); Commit(client, delete_req.transaction_id); - return write_response.success; + return !write_response.error.has_value(); } } @@ -207,7 +207,7 @@ bool AttemptToUpdateVertex(ShardClient &client, int64_t value) { auto write_response = std::get(write_response_result); Commit(client, update_req.transaction_id); - return write_response.success; + return !write_response.error.has_value(); } } @@ -244,7 +244,7 @@ bool AttemptToAddEdge(ShardClient &client, int64_t value_of_vertex_1, int64_t va Commit(client, create_req.transaction_id); - return write_response.success; + return !write_response.error.has_value(); } return true; } @@ -276,7 +276,7 @@ bool AttemptToAddEdgeWithProperties(ShardClient &client, int64_t value_of_vertex create_req.transaction_id.logical_id = GetTransactionId(); auto write_res = client.SendWriteRequest(create_req); - MG_ASSERT(write_res.HasValue() && std::get(write_res.GetValue()).success, + MG_ASSERT(write_res.HasValue() && !std::get(write_res.GetValue()).error.has_value(), "Unexpected failure"); Commit(client, create_req.transaction_id); @@ -316,7 +316,7 @@ bool AttemptToDeleteEdge(ShardClient &client, int64_t value_of_vertex_1, int64_t auto write_response = std::get(write_response_result); Commit(client, delete_req.transaction_id); - return write_response.success; + return !write_response.error.has_value(); } } @@ -356,7 +356,7 @@ bool AttemptToUpdateEdge(ShardClient &client, int64_t value_of_vertex_1, int64_t auto write_response = std::get(write_response_result); Commit(client, update_req.transaction_id); - return write_response.success; + return !write_response.error.has_value(); } } @@ -379,7 +379,7 @@ std::tuple> AttemptToScanAllWithoutBatchLi auto write_response_result = read_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success); + MG_ASSERT(write_response.error == std::nullopt); return {write_response.results.size(), write_response.next_start_id}; } @@ -405,7 +405,7 @@ std::tuple> AttemptToScanAllWithBatchLimit auto write_response_result = read_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success); + MG_ASSERT(!write_response.error.has_value()); return {write_response.results.size(), write_response.next_start_id}; } @@ -439,7 +439,7 @@ std::tuple> AttemptToScanAllWithExpression auto write_response_result = read_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success); + MG_ASSERT(!write_response.error.has_value()); MG_ASSERT(!write_response.results.empty(), "There are no results!"); MG_ASSERT(write_response.results[0].evaluated_vertex_expressions[0].int_v == 4); return {write_response.results.size(), write_response.next_start_id}; @@ -464,7 +464,7 @@ void AttemptToScanAllWithOrderByOnPrimaryProperty(ShardClient &client, msgs::Ver auto write_response_result = read_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success); + MG_ASSERT(!write_response.error.has_value()); MG_ASSERT(write_response.results.size() == 5, "Expecting 5 results!"); for (int64_t i{0}; i < 5; ++i) { const auto expected_primary_key = std::vector{msgs::Value(1023 - i)}; @@ -494,7 +494,7 @@ void AttemptToScanAllWithOrderByOnSecondaryProperty(ShardClient &client, msgs::V auto write_response_result = read_res.GetValue(); auto write_response = std::get(write_response_result); - MG_ASSERT(write_response.success); + MG_ASSERT(!write_response.error.has_value()); MG_ASSERT(write_response.results.size() == 5, "Expecting 5 results!"); for (int64_t i{0}; i < 5; ++i) { const auto expected_prop4 = std::vector{msgs::Value(1023 - i)}; diff --git a/tests/simulation/test_cluster.hpp b/tests/simulation/test_cluster.hpp index 6a32a391d..ce304d1cc 100644 --- a/tests/simulation/test_cluster.hpp +++ b/tests/simulation/test_cluster.hpp @@ -173,7 +173,7 @@ void ExecuteOp(msgs::ShardRequestManager &shard_request_mana auto result = shard_request_manager.Request(state, std::move(new_vertices)); RC_ASSERT(result.size() == 1); - RC_ASSERT(result[0].success); + RC_ASSERT(!result[0].error.has_value()); correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second)); } diff --git a/tests/unit/high_density_shard_create_scan.cpp b/tests/unit/high_density_shard_create_scan.cpp index 9c2d1cfd7..a0c0a0c28 100644 --- a/tests/unit/high_density_shard_create_scan.cpp +++ b/tests/unit/high_density_shard_create_scan.cpp @@ -187,7 +187,7 @@ void ExecuteOp(msgs::ShardRequestManager &shard_request_manager, auto result = shard_request_manager.Request(state, std::move(new_vertices)); MG_ASSERT(result.size() == 1); - MG_ASSERT(result[0].success); + MG_ASSERT(!result[0].error.has_value()); correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second)); } diff --git a/tests/unit/machine_manager.cpp b/tests/unit/machine_manager.cpp index 1d69da5c5..7b57d61ea 100644 --- a/tests/unit/machine_manager.cpp +++ b/tests/unit/machine_manager.cpp @@ -151,7 +151,7 @@ void TestCreateExpand(msgs::ShardRequestManagerInterface &shard_request_manager) auto responses = shard_request_manager.Request(state, std::move(new_expands)); MG_ASSERT(responses.size() == 1); - MG_ASSERT(responses[0].success); + MG_ASSERT(!responses[0].error.has_value()); } void TestExpandOne(msgs::ShardRequestManagerInterface &shard_request_manager) { From 5717dfb165f23537d8fec566897aa2e3902b8af2 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 14:05:04 +0100 Subject: [PATCH 21/30] Add ErrorCode to SHARD_ERROR macro --- src/glue/v2/communication.cpp | 2 +- src/storage/v3/edge_accessor.cpp | 20 ++--- src/storage/v3/result.hpp | 6 +- src/storage/v3/schema_validator.cpp | 8 +- src/storage/v3/shard.cpp | 23 +++--- src/storage/v3/vertex_accessor.cpp | 64 +++++++-------- tests/unit/storage_v3.cpp | 90 +++++++++++----------- tests/unit/storage_v3_edge.cpp | 10 +-- tests/unit/storage_v3_schema.cpp | 22 +++--- tests/unit/storage_v3_vertex_accessors.cpp | 12 +-- 10 files changed, 130 insertions(+), 127 deletions(-) diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index a977e0e29..bc8d2da09 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -112,7 +112,7 @@ BoltResult ToBoltPath(const query::v2::accessors::Pat const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication - return {SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)}; + return {SHARD_ERROR(ErrorCode::DELETED_OBJECT)}; } BoltResult ToBoltValue(const query::v2::TypedValue &value, diff --git a/src/storage/v3/edge_accessor.cpp b/src/storage/v3/edge_accessor.cpp index 4438e0acb..95dd6875a 100644 --- a/src/storage/v3/edge_accessor.cpp +++ b/src/storage/v3/edge_accessor.cpp @@ -57,11 +57,11 @@ const VertexId &EdgeAccessor::ToVertex() const { return to_vertex_; } ShardResult EdgeAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!config_.properties_on_edges) return SHARD_ERROR(common::ErrorCode::PROPERTIES_DISABLED); + if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto current_value = edge_.ptr->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -77,11 +77,11 @@ ShardResult EdgeAccessor::SetProperty(PropertyId property, const } ShardResult> EdgeAccessor::ClearProperties() { - if (!config_.properties_on_edges) return SHARD_ERROR(common::ErrorCode::PROPERTIES_DISABLED); + if (!config_.properties_on_edges) return SHARD_ERROR(ErrorCode::PROPERTIES_DISABLED); - if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, edge_.ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (edge_.ptr->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (edge_.ptr->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto properties = edge_.ptr->properties.Properties(); for (const auto &property : properties) { @@ -129,8 +129,8 @@ ShardResult EdgeAccessor::GetProperty(PropertyId property, View v break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(value); } @@ -175,8 +175,8 @@ ShardResult> EdgeAccessor::Properties(View v break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(properties); } diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 2b5b316bb..136ec0136 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -42,7 +42,11 @@ struct ShardError { }; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define SHARD_ERROR(...) memgraph::storage::v3::ShardError(__VA_ARGS__, std::experimental::source_location::current()) +#define SHARD_ERROR(...) \ + ({ \ + using ErrorCode = memgraph::common::ErrorCode; \ + memgraph::storage::v3::ShardError(__VA_ARGS__, std::experimental::source_location::current()); \ + }) template using ShardResult = utils::BasicResult; diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 97c068524..7854dc389 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -31,14 +31,14 @@ std::optional SchemaValidator::ValidateVertexCreate( // Schema on primary label const auto *schema = schemas_->GetSchema(primary_label); if (schema == nullptr) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, + return SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, fmt::format("Schema not defined for label :{}", name_id_mapper_->IdToName(primary_label))); } // Is there another primary label among secondary labels for (const auto &secondary_label : labels) { if (schemas_->GetSchema(secondary_label)) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, fmt::format("Cannot add label :{}, since it is defined as a primary label", name_id_mapper_->IdToName(secondary_label))); } @@ -46,7 +46,7 @@ std::optional SchemaValidator::ValidateVertexCreate( // Quick size check if (schema->second.size() != primary_properties.size()) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, fmt::format("Not all primary properties have been specified for :{} vertex", name_id_mapper_->IdToName(primary_label))); } @@ -88,7 +88,7 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { const auto *schema = schemas_->GetSchema(label); if (schema) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, fmt::format("Cannot add/remove primary label :{}", name_id_mapper_->IdToName(label))); } return std::nullopt; diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index bad7e8d0a..4f25916c6 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -364,7 +364,7 @@ ShardResult Shard::Accessor::CreateVertexAndValidate( VertexAccessor vertex_acc{&it->vertex, transaction_, &shard_->indices_, config_, shard_->vertex_validator_}; if (!inserted) { - return SHARD_ERROR(common::ErrorCode::VERTEX_ALREADY_INSERTED); + return SHARD_ERROR(ErrorCode::VERTEX_ALREADY_INSERTED); } MG_ASSERT(it != acc.end(), "Invalid Vertex accessor!"); @@ -401,14 +401,13 @@ ShardResult> Shard::Accessor::DeleteVertex(VertexA "accessor when deleting a vertex!"); auto *vertex_ptr = vertex->vertex_; - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) { return std::optional{}; } - if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) - return SHARD_ERROR(common::ErrorCode::VERTEX_HAS_EDGES); + if (!vertex_ptr->in_edges.empty() || !vertex_ptr->out_edges.empty()) return SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES); CreateAndLinkDelta(transaction_, vertex_ptr, Delta::RecreateObjectTag()); vertex_ptr->deleted = true; @@ -430,7 +429,7 @@ ShardResult>>> std::vector out_edges; { - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); if (vertex_ptr->deleted) return std::optional{}; @@ -471,7 +470,7 @@ ShardResult>>> // vertex. Some other transaction could have modified the vertex in the // meantime if we didn't have any edges to delete. - if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_ptr)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); MG_ASSERT(!vertex_ptr->deleted, "Invalid database state!"); @@ -508,12 +507,12 @@ ShardResult Shard::Accessor::CreateEdge(VertexId from_vertex_id, V } if (from_is_local) { - if (!PrepareForWrite(transaction_, from_vertex)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (from_vertex->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!PrepareForWrite(transaction_, from_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (from_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } if (to_is_local && to_vertex != from_vertex) { - if (!PrepareForWrite(transaction_, to_vertex)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); - if (to_vertex->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!PrepareForWrite(transaction_, to_vertex)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); + if (to_vertex->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } EdgeRef edge(gid); @@ -568,13 +567,13 @@ ShardResult> Shard::Accessor::DeleteEdge(VertexId fr if (from_is_local) { if (!PrepareForWrite(transaction_, from_vertex)) { - return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!from_vertex->deleted, "Invalid database state!"); } if (to_is_local && to_vertex != from_vertex) { if (!PrepareForWrite(transaction_, to_vertex)) { - return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } MG_ASSERT(!to_vertex->deleted, "Invalid database state!"); } diff --git a/src/storage/v3/vertex_accessor.cpp b/src/storage/v3/vertex_accessor.cpp index 88f9aa965..6949c08cc 100644 --- a/src/storage/v3/vertex_accessor.cpp +++ b/src/storage/v3/vertex_accessor.cpp @@ -83,9 +83,9 @@ bool VertexAccessor::IsVisible(View view) const { ShardResult VertexAccessor::AddLabel(LabelId label) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -104,9 +104,9 @@ ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); if (std::find(vertex_->labels.begin(), vertex_->labels.end(), label) != vertex_->labels.end()) return false; @@ -120,9 +120,9 @@ ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { } ShardResult VertexAccessor::RemoveLabel(LabelId label) { - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -139,9 +139,9 @@ ShardResult VertexAccessor::RemoveLabelAndValidate(LabelId label) { return {*maybe_violation_error}; } - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto it = std::find(vertex_->labels.begin(), vertex_->labels.end(), label); if (it == vertex_->labels.end()) return false; @@ -197,8 +197,8 @@ ShardResult VertexAccessor::HasLabel(LabelId label, View view) const { break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return has_label; } @@ -267,17 +267,17 @@ ShardResult> VertexAccessor::Labels(View view) const { break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(labels); } ShardResult VertexAccessor::SetProperty(PropertyId property, const PropertyValue &value) { utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto current_value = vertex_->properties.GetProperty(property); // We could skip setting the value if the previous one is the same to the new @@ -323,10 +323,10 @@ ShardResult VertexAccessor::CheckVertexExistence(View view) const { } }); if (!exists) { - return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); + return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); } if (!for_deleted_ && deleted) { - return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } return {}; } @@ -338,11 +338,11 @@ ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId pro utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; if (!PrepareForWrite(transaction_, vertex_)) { - return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); } if (vertex_->deleted) { - return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + return SHARD_ERROR(ErrorCode::DELETED_OBJECT); } auto current_value = vertex_->properties.GetProperty(property); @@ -361,9 +361,9 @@ ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId pro } ShardResult> VertexAccessor::ClearProperties() { - if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR); + if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); - if (vertex_->deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (vertex_->deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); auto properties = vertex_->properties.Properties(); for (const auto &property : properties) { @@ -441,8 +441,8 @@ ShardResult VertexAccessor::GetProperty(PropertyId property, View break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(value); } @@ -491,8 +491,8 @@ ShardResult> VertexAccessor::Properties(View break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return std::move(properties); } @@ -563,8 +563,8 @@ ShardResult> VertexAccessor::InEdges(View view, const break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); std::vector ret; if (in_edges.empty()) { return ret; @@ -643,8 +643,8 @@ ShardResult> VertexAccessor::OutEdges(View view, const break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); std::vector ret; if (out_edges.empty()) { return ret; @@ -690,8 +690,8 @@ ShardResult VertexAccessor::InDegree(View view) const { break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return degree; } @@ -727,8 +727,8 @@ ShardResult VertexAccessor::OutDegree(View view) const { break; } }); - if (!exists) return SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT); - if (!for_deleted_ && deleted) return SHARD_ERROR(common::ErrorCode::DELETED_OBJECT); + if (!exists) return SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT); + if (!for_deleted_ && deleted) return SHARD_ERROR(ErrorCode::DELETED_OBJECT); return degree; } diff --git a/tests/unit/storage_v3.cpp b/tests/unit/storage_v3.cpp index a214ccac6..cab463b7f 100644 --- a/tests/unit/storage_v3.cpp +++ b/tests/unit/storage_v3.cpp @@ -580,7 +580,7 @@ TEST_P(StorageV3, VertexDeleteSerializationError) { EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); auto res = acc2.DeleteVertex(&*vertex); ASSERT_TRUE(res.HasError()); - ASSERT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); + ASSERT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); EXPECT_EQ(CountVertices(acc2, View::OLD), 1U); EXPECT_EQ(CountVertices(acc2, View::NEW), 1U); acc2.AdvanceCommand(); @@ -711,20 +711,20 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_FALSE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Labels(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -779,33 +779,33 @@ TEST_P(StorageV3, VertexDeleteLabel) { // Check whether label 5 exists ASSERT_TRUE(vertex->HasLabel(label5, View::OLD).GetValue()); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto labels = vertex->Labels(View::OLD).GetValue(); ASSERT_EQ(labels.size(), 1); ASSERT_EQ(labels[0], label5); } - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether label 5 exists - ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->HasLabel(label5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Labels(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to add the label { auto ret = vertex->AddLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } // Try to remove the label { auto ret = vertex->RemoveLabelAndValidate(label5); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -855,14 +855,14 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether label 5 exists ASSERT_TRUE(vertex->GetProperty(property5, View::OLD)->IsNull()); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); ASSERT_EQ(vertex->Properties(View::OLD)->size(), 0); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to set the property5 { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -918,27 +918,27 @@ TEST_P(StorageV3, VertexDeleteProperty) { // Check whether property 5 exists ASSERT_EQ(vertex->GetProperty(property5, View::OLD)->ValueString(), "nandare"); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto properties = vertex->Properties(View::OLD).GetValue(); ASSERT_EQ(properties.size(), 1); ASSERT_EQ(properties[property5].ValueString(), "nandare"); } - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Advance command acc.AdvanceCommand(); // Check whether property 5 exists - ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->GetProperty(property5, View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex->Properties(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); // Try to set the property { auto ret = vertex->SetPropertyAndValidate(property5, PropertyValue("haihai")); - AssertShardErrorEqual(ret, SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + AssertShardErrorEqual(ret, SHARD_ERROR(ErrorCode::DELETED_OBJECT)); } acc.Abort(); @@ -1371,7 +1371,7 @@ TEST_P(StorageV3, VertexLabelSerializationError) { { auto res = vertex->AddLabelAndValidate(label1); - AssertShardErrorEqual(res, SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); + AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); } } @@ -1865,7 +1865,7 @@ TEST_P(StorageV3, VertexPropertySerializationError) { { auto res = vertex->SetPropertyAndValidate(property2, PropertyValue("nandare")); - AssertShardErrorEqual(res, SHARD_ERROR(common::ErrorCode::SERIALIZATION_ERROR)); + AssertShardErrorEqual(res, SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR)); } } @@ -2255,14 +2255,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{0}, {}); // Check state before (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); // Check state before (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 0); @@ -2282,14 +2282,14 @@ TEST_P(StorageV3, VertexNonexistentLabelPropertyEdgeAPI) { .HasValue()); // Check state after (OLD view). - ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); - ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Labels(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.HasLabel(label1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.Properties(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.GetProperty(property1, View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutEdges(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.InDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); + ASSERT_EQ(vertex.OutDegree(View::OLD).GetError(), SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); // Check state after (NEW view). ASSERT_EQ(vertex.Labels(View::NEW)->size(), 1); @@ -2663,25 +2663,25 @@ TEST_P(StorageV3, TestCreateVertexAndValidate) { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({primary_label}, {PropertyValue{0}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } { auto acc = store.Access(GetNextHlc()); auto vertex = acc.CreateVertexAndValidate({}, {PropertyValue{"test"}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } } } // namespace memgraph::storage::v3::tests diff --git a/tests/unit/storage_v3_edge.cpp b/tests/unit/storage_v3_edge.cpp index 47327ca3e..64f7f4e2e 100644 --- a/tests/unit/storage_v3_edge.cpp +++ b/tests/unit/storage_v3_edge.cpp @@ -3242,7 +3242,7 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { { auto ret = acc.DeleteVertex(&vertex_from.value()); ASSERT_TRUE(ret.HasError()); - ASSERT_EQ(ret.GetError(), SHARD_ERROR(common::ErrorCode::VERTEX_HAS_EDGES)); + ASSERT_EQ(ret.GetError(), SHARD_ERROR(ErrorCode::VERTEX_HAS_EDGES)); } // Detach delete vertex @@ -3255,8 +3255,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { // Check edges ASSERT_EQ(vertex_from->InEdges(View::OLD)->size(), 0); ASSERT_EQ(*vertex_from->InDegree(View::OLD), 0); - ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->InEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->InDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto ret = vertex_from->OutEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); @@ -3269,8 +3269,8 @@ TEST_P(StorageEdgeTest, VertexDetachDeleteSingleCommit) { ASSERT_EQ(e.FromVertex(), from_id); ASSERT_EQ(e.ToVertex(), to_id); } - ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); - ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), SHARD_ERROR(common::ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->OutEdges(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); + ASSERT_EQ(vertex_from->OutDegree(View::NEW).GetError(), SHARD_ERROR(ErrorCode::DELETED_OBJECT)); { auto ret = vertex_to->InEdges(View::OLD); ASSERT_TRUE(ret.HasValue()); diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index 4ce611c98..4bc920313 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -188,43 +188,43 @@ TEST_F(SchemaValidatorTest, TestSchemaValidateVertexCreate) { { const auto schema_violation = schema_validator.ValidateVertexCreate(NameToLabel("test"), {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } // Validate wrong secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label1}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label2}, {PropertyValue("test")}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } // Validate wrong property type { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), PropertyValue(1)}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto wrong_prop = PropertyValue(TemporalData(TemporalType::Date, 1234)); const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), wrong_prop}); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } // Passing validations EXPECT_EQ(schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue("test")}), std::nullopt); @@ -246,12 +246,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdate) { { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label1, prop_string); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label2, prop_duration); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_int), std::nullopt); EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_duration), std::nullopt); @@ -263,12 +263,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdateLabel) { { const auto schema_violation = schema_validator.ValidateLabelUpdate(label1); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } { const auto schema_violation = schema_validator.ValidateLabelUpdate(label2); ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } EXPECT_EQ(schema_validator.ValidateLabelUpdate(NameToLabel("test")), std::nullopt); } diff --git a/tests/unit/storage_v3_vertex_accessors.cpp b/tests/unit/storage_v3_vertex_accessors.cpp index dd515983a..9a155efb4 100644 --- a/tests/unit/storage_v3_vertex_accessors.cpp +++ b/tests/unit/storage_v3_vertex_accessors.cpp @@ -77,7 +77,7 @@ TEST_F(StorageV3Accessor, TestPrimaryLabel) { ASSERT_TRUE(vertex.PrimaryLabel(View::OLD).HasError()); const auto error_primary_label = vertex.PrimaryLabel(View::OLD).GetError(); ASSERT_FALSE(vertex.PrimaryLabel(View::NEW).HasError()); - EXPECT_EQ(error_primary_label, SHARD_ERROR(common::ErrorCode::NONEXISTENT_OBJECT)); + EXPECT_EQ(error_primary_label, SHARD_ERROR(ErrorCode::NONEXISTENT_OBJECT)); } { auto acc = storage.Access(GetNextHlc()); @@ -128,7 +128,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { const auto label1 = NameToLabelId("label"); auto vertex = acc.CreateVertexAndValidate({label1}, {PropertyValue{2}}, {}); ASSERT_TRUE(vertex.HasError()); - EXPECT_EQ(vertex.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + EXPECT_EQ(vertex.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { auto acc = storage.Access(GetNextHlc()); @@ -137,7 +137,7 @@ TEST_F(StorageV3Accessor, TestAddLabels) { ASSERT_TRUE(vertex.HasValue()); const auto schema_violation = vertex->AddLabelAndValidate(label1); ASSERT_TRUE(schema_violation.HasError()); - EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -181,7 +181,7 @@ TEST_F(StorageV3Accessor, TestRemoveLabels) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res1 = vertex.RemoveLabelAndValidate(primary_label); ASSERT_TRUE(res1.HasError()); - EXPECT_EQ(res1.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + EXPECT_EQ(res1.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } } @@ -200,14 +200,14 @@ TEST_F(StorageV3Accessor, TestSetKeysAndProperties) { auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{1}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue(1)); ASSERT_TRUE(res.HasError()); - EXPECT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { auto acc = storage.Access(GetNextHlc()); auto vertex = CreateVertexAndValidate(acc, {}, PropertyValue{2}); const auto res = vertex.SetPropertyAndValidate(primary_property, PropertyValue()); ASSERT_TRUE(res.HasError()); - EXPECT_EQ(res.GetError(), SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + EXPECT_EQ(res.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } } From f1e360469a57724788cc7b6c0b0cfd2dbc9e2ec2 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 14:44:28 +0100 Subject: [PATCH 22/30] Expand SHARD_ERROR with fmt format --- src/storage/v3/name_id_mapper.hpp | 4 ---- src/storage/v3/result.hpp | 8 +++---- src/storage/v3/schema_validator.cpp | 33 ++++++++++++++--------------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/storage/v3/name_id_mapper.hpp b/src/storage/v3/name_id_mapper.hpp index 70b5c5ded..d238f1072 100644 --- a/src/storage/v3/name_id_mapper.hpp +++ b/src/storage/v3/name_id_mapper.hpp @@ -48,10 +48,6 @@ class NameIdMapper final { return kUnmappedId; } - const std::string &IdToName(const LabelId label_id) const { return IdToName(label_id.AsInt()); } - - const std::string &IdToName(const PropertyId property_id) const { return IdToName(property_id.AsInt()); } - const std::string &IdToName(const uint64_t id) const { auto it = id_to_name_.find(id); MG_ASSERT(it != id_to_name_.end(), "Id not know in mapper!"); diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index 136ec0136..fcec17548 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -42,10 +42,10 @@ struct ShardError { }; // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -#define SHARD_ERROR(...) \ - ({ \ - using ErrorCode = memgraph::common::ErrorCode; \ - memgraph::storage::v3::ShardError(__VA_ARGS__, std::experimental::source_location::current()); \ +#define SHARD_ERROR(error, ...) \ + ({ \ + using ErrorCode = memgraph::common::ErrorCode; \ + memgraph::storage::v3::ShardError(error, GET_MESSAGE(__VA_ARGS__), std::experimental::source_location::current()); \ }) template diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 7854dc389..3350531aa 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -31,35 +31,34 @@ std::optional SchemaValidator::ValidateVertexCreate( // Schema on primary label const auto *schema = schemas_->GetSchema(primary_label); if (schema == nullptr) { - return SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, - fmt::format("Schema not defined for label :{}", name_id_mapper_->IdToName(primary_label))); + return SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL, "Schema not defined for label :{}", + name_id_mapper_->IdToName(primary_label.AsInt())); } // Is there another primary label among secondary labels for (const auto &secondary_label : labels) { if (schemas_->GetSchema(secondary_label)) { return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY, - fmt::format("Cannot add label :{}, since it is defined as a primary label", - name_id_mapper_->IdToName(secondary_label))); + "Cannot add label :{}, since it is defined as a primary label", + name_id_mapper_->IdToName(secondary_label.AsInt())); } } // Quick size check if (schema->second.size() != primary_properties.size()) { return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED, - fmt::format("Not all primary properties have been specified for :{} vertex", - name_id_mapper_->IdToName(primary_label))); + "Not all primary properties have been specified for :{} vertex", + name_id_mapper_->IdToName(primary_label.AsInt())); } // Check only properties defined by schema for (size_t i{0}; i < schema->second.size(); ++i) { // Check schema property type if (auto property_schema_type = PropertyTypeToSchemaType(primary_properties[i]); property_schema_type && *property_schema_type != schema->second[i].type) { - return SHARD_ERROR( - common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, - fmt::format("Property {} is of wrong type, expected {}, actual {}", - name_id_mapper_->IdToName(schema->second[i].property_id), - SchemaTypeToString(schema->second[i].type), SchemaTypeToString(*property_schema_type))); + return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + "Property {} is of wrong type, expected {}, actual {}", + name_id_mapper_->IdToName(schema->second[i].property_id.AsInt()), + SchemaTypeToString(schema->second[i].type), SchemaTypeToString(*property_schema_type)); } } @@ -77,10 +76,10 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId schema->second, [property_id](const auto &schema_property) { return property_id == schema_property.property_id; }); schema_property != schema->second.end()) { - return SHARD_ERROR( - common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, - fmt::format("Cannot update primary property {} of schema on label :{}", - name_id_mapper_->IdToName(schema_property->property_id), name_id_mapper_->IdToName(primary_label))); + return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + "Cannot update primary property {} of schema on label :{}", + name_id_mapper_->IdToName(schema_property->property_id.AsInt()), + name_id_mapper_->IdToName(primary_label.AsInt())); } return std::nullopt; } @@ -88,8 +87,8 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { const auto *schema = schemas_->GetSchema(label); if (schema) { - return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, - fmt::format("Cannot add/remove primary label :{}", name_id_mapper_->IdToName(label))); + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, "Cannot add/remove primary label :{}", + name_id_mapper_->IdToName(label.AsInt())); } return std::nullopt; } From d82cfb349ea927ba9f3f6b50a55a7ee0e1f21e8e Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 15:00:32 +0100 Subject: [PATCH 23/30] Use ShardResult --- src/storage/v3/schema_validator.cpp | 23 ++++----- src/storage/v3/schema_validator.hpp | 16 +++--- src/storage/v3/shard.cpp | 4 +- src/storage/v3/shard_rsm.cpp | 4 +- src/storage/v3/vertex_accessor.cpp | 14 ++--- tests/unit/storage_v3_schema.cpp | 80 +++++++++++++++-------------- 6 files changed, 71 insertions(+), 70 deletions(-) diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index 3350531aa..ea2522684 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -25,9 +25,8 @@ namespace memgraph::storage::v3 { SchemaValidator::SchemaValidator(Schemas &schemas, const NameIdMapper &name_id_mapper) : schemas_{&schemas}, name_id_mapper_{&name_id_mapper} {} -std::optional SchemaValidator::ValidateVertexCreate( - LabelId primary_label, const std::vector &labels, - const std::vector &primary_properties) const { +ShardResult SchemaValidator::ValidateVertexCreate(LabelId primary_label, const std::vector &labels, + const std::vector &primary_properties) const { // Schema on primary label const auto *schema = schemas_->GetSchema(primary_label); if (schema == nullptr) { @@ -62,11 +61,11 @@ std::optional SchemaValidator::ValidateVertexCreate( } } - return std::nullopt; + return {}; } -std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId primary_label, - const PropertyId property_id) const { +ShardResult SchemaValidator::ValidatePropertyUpdate(const LabelId primary_label, + const PropertyId property_id) const { // Verify existence of schema on primary label const auto *schema = schemas_->GetSchema(primary_label); MG_ASSERT(schema, "Cannot validate against non existing schema!"); @@ -81,16 +80,16 @@ std::optional SchemaValidator::ValidatePropertyUpdate(const LabelId name_id_mapper_->IdToName(schema_property->property_id.AsInt()), name_id_mapper_->IdToName(primary_label.AsInt())); } - return std::nullopt; + return {}; } -std::optional SchemaValidator::ValidateLabelUpdate(const LabelId label) const { +ShardResult SchemaValidator::ValidateLabelUpdate(const LabelId label) const { const auto *schema = schemas_->GetSchema(label); if (schema) { return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL, "Cannot add/remove primary label :{}", name_id_mapper_->IdToName(label.AsInt())); } - return std::nullopt; + return {}; } const Schemas::Schema *SchemaValidator::GetSchema(LabelId label) const { return schemas_->GetSchema(label); } @@ -98,15 +97,15 @@ const Schemas::Schema *SchemaValidator::GetSchema(LabelId label) const { return VertexValidator::VertexValidator(const SchemaValidator &schema_validator, const LabelId primary_label) : schema_validator{&schema_validator}, primary_label_{primary_label} {} -std::optional VertexValidator::ValidatePropertyUpdate(PropertyId property_id) const { +ShardResult VertexValidator::ValidatePropertyUpdate(PropertyId property_id) const { return schema_validator->ValidatePropertyUpdate(primary_label_, property_id); }; -std::optional VertexValidator::ValidateAddLabel(LabelId label) const { +ShardResult VertexValidator::ValidateAddLabel(LabelId label) const { return schema_validator->ValidateLabelUpdate(label); } -std::optional VertexValidator::ValidateRemoveLabel(LabelId label) const { +ShardResult VertexValidator::ValidateRemoveLabel(LabelId label) const { return schema_validator->ValidateLabelUpdate(label); } diff --git a/src/storage/v3/schema_validator.hpp b/src/storage/v3/schema_validator.hpp index 329d4a582..637ca5f7e 100644 --- a/src/storage/v3/schema_validator.hpp +++ b/src/storage/v3/schema_validator.hpp @@ -11,7 +11,6 @@ #pragma once -#include #include #include "storage/v2/result.hpp" @@ -27,13 +26,12 @@ class SchemaValidator { public: explicit SchemaValidator(Schemas &schemas, const NameIdMapper &name_id_mapper); - [[nodiscard]] std::optional ValidateVertexCreate( - LabelId primary_label, const std::vector &labels, - const std::vector &primary_properties) const; + [[nodiscard]] ShardResult ValidateVertexCreate(LabelId primary_label, const std::vector &labels, + const std::vector &primary_properties) const; - [[nodiscard]] std::optional ValidatePropertyUpdate(LabelId primary_label, PropertyId property_id) const; + [[nodiscard]] ShardResult ValidatePropertyUpdate(LabelId primary_label, PropertyId property_id) const; - [[nodiscard]] std::optional ValidateLabelUpdate(LabelId label) const; + [[nodiscard]] ShardResult ValidateLabelUpdate(LabelId label) const; const Schemas::Schema *GetSchema(LabelId label) const; @@ -45,11 +43,11 @@ class SchemaValidator { struct VertexValidator { explicit VertexValidator(const SchemaValidator &schema_validator, LabelId primary_label); - [[nodiscard]] std::optional ValidatePropertyUpdate(PropertyId property_id) const; + [[nodiscard]] ShardResult ValidatePropertyUpdate(PropertyId property_id) const; - [[nodiscard]] std::optional ValidateAddLabel(LabelId label) const; + [[nodiscard]] ShardResult ValidateAddLabel(LabelId label) const; - [[nodiscard]] std::optional ValidateRemoveLabel(LabelId label) const; + [[nodiscard]] ShardResult ValidateRemoveLabel(LabelId label) const; const SchemaValidator *schema_validator; diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index 4f25916c6..dbf1f043f 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -353,8 +353,8 @@ ShardResult Shard::Accessor::CreateVertexAndValidate( auto maybe_schema_violation = GetSchemaValidator().ValidateVertexCreate(shard_->primary_label_, labels, primary_properties); - if (maybe_schema_violation) { - return {std::move(*maybe_schema_violation)}; + if (maybe_schema_violation.HasError()) { + return {std::move(maybe_schema_violation.GetError())}; } auto acc = shard_->vertices_.access(); diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 7a128a78f..aac045fe4 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -330,11 +330,11 @@ ShardResult GetExpandOneResult( auto v_acc = acc.FindVertex(primary_key, View::NEW); msgs::Vertex source_vertex = {.id = src_vertex}; - const auto maybe_secondary_labels = FillUpSourceVertexSecondaryLabels(v_acc, req); + auto maybe_secondary_labels = FillUpSourceVertexSecondaryLabels(v_acc, req); if (maybe_secondary_labels.HasError()) { return maybe_secondary_labels.GetError(); } - source_vertex.labels = *maybe_secondary_labels; + source_vertex.labels = std::move(*maybe_secondary_labels); auto src_vertex_properties = FillUpSourceVertexProperties(v_acc, req, storage::v3::View::NEW, schema); diff --git a/src/storage/v3/vertex_accessor.cpp b/src/storage/v3/vertex_accessor.cpp index 6949c08cc..1b0ba6340 100644 --- a/src/storage/v3/vertex_accessor.cpp +++ b/src/storage/v3/vertex_accessor.cpp @@ -99,8 +99,8 @@ ShardResult VertexAccessor::AddLabel(LabelId label) { } ShardResult VertexAccessor::AddLabelAndValidate(LabelId label) { - if (const auto maybe_violation_error = vertex_validator_->ValidateAddLabel(label); maybe_violation_error) { - return {*maybe_violation_error}; + if (const auto maybe_violation_error = vertex_validator_->ValidateAddLabel(label); maybe_violation_error.HasError()) { + return {maybe_violation_error.GetError()}; } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; @@ -135,8 +135,9 @@ ShardResult VertexAccessor::RemoveLabel(LabelId label) { } ShardResult VertexAccessor::RemoveLabelAndValidate(LabelId label) { - if (const auto maybe_violation_error = vertex_validator_->ValidateRemoveLabel(label); maybe_violation_error) { - return {*maybe_violation_error}; + if (const auto maybe_violation_error = vertex_validator_->ValidateRemoveLabel(label); + maybe_violation_error.HasError()) { + return {maybe_violation_error.GetError()}; } if (!PrepareForWrite(transaction_, vertex_)) return SHARD_ERROR(ErrorCode::SERIALIZATION_ERROR); @@ -332,8 +333,9 @@ ShardResult VertexAccessor::CheckVertexExistence(View view) const { } ShardResult VertexAccessor::SetPropertyAndValidate(PropertyId property, const PropertyValue &value) { - if (auto maybe_violation_error = vertex_validator_->ValidatePropertyUpdate(property); maybe_violation_error) { - return {*maybe_violation_error}; + if (auto maybe_violation_error = vertex_validator_->ValidatePropertyUpdate(property); + maybe_violation_error.HasError()) { + return {maybe_violation_error.GetError()}; } utils::MemoryTracker::OutOfMemoryExceptionEnabler oom_exception; diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index 4bc920313..2c5515958 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -187,89 +186,92 @@ TEST_F(SchemaValidatorTest, TestSchemaValidateVertexCreate) { // Validate against secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(NameToLabel("test"), {}, {PropertyValue(1)}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } // Validate wrong secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label1}, {PropertyValue("test")}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label2}, {PropertyValue("test")}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } // Validate wrong property type { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue(1)}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), PropertyValue(1)}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto wrong_prop = PropertyValue(TemporalData(TemporalType::Date, 1234)); const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), wrong_prop}); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } // Passing validations - EXPECT_EQ(schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue("test")}), std::nullopt); - EXPECT_EQ(schema_validator.ValidateVertexCreate(label1, {NameToLabel("label3"), NameToLabel("label4")}, - {PropertyValue("test")}), - std::nullopt); - EXPECT_EQ(schema_validator.ValidateVertexCreate( - label2, {}, - {PropertyValue("test"), PropertyValue(122), PropertyValue(TemporalData(TemporalType::Duration, 1234))}), - std::nullopt); - EXPECT_EQ(schema_validator.ValidateVertexCreate(label2, {NameToLabel("label5"), NameToLabel("label6")}, - {PropertyValue("test123"), PropertyValue(122221), - PropertyValue(TemporalData(TemporalType::Duration, 12344321))}), - std::nullopt); + EXPECT_FALSE(schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue("test")}).HasError()); + EXPECT_FALSE( + schema_validator + .ValidateVertexCreate(label1, {NameToLabel("label3"), NameToLabel("label4")}, {PropertyValue("test")}) + .HasError()); + EXPECT_FALSE(schema_validator + .ValidateVertexCreate(label2, {}, + {PropertyValue("test"), PropertyValue(122), + PropertyValue(TemporalData(TemporalType::Duration, 1234))}) + .HasError()); + EXPECT_FALSE(schema_validator + .ValidateVertexCreate(label2, {NameToLabel("label5"), NameToLabel("label6")}, + {PropertyValue("test123"), PropertyValue(122221), + PropertyValue(TemporalData(TemporalType::Duration, 12344321))}) + .HasError()); } TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdate) { // Validate updating of primary key { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label1, prop_string); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label2, prop_duration); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } - EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_int), std::nullopt); - EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label1, prop_duration), std::nullopt); - EXPECT_EQ(schema_validator.ValidatePropertyUpdate(label2, NameToProperty("test")), std::nullopt); + EXPECT_FALSE(schema_validator.ValidatePropertyUpdate(label1, prop_int).HasError()); + EXPECT_FALSE(schema_validator.ValidatePropertyUpdate(label1, prop_duration).HasError()); + EXPECT_FALSE(schema_validator.ValidatePropertyUpdate(label2, NameToProperty("test")).HasError()); } TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdateLabel) { // Validate adding primary label { const auto schema_violation = schema_validator.ValidateLabelUpdate(label1); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } { const auto schema_violation = schema_validator.ValidateLabelUpdate(label2); - ASSERT_NE(schema_violation, std::nullopt); - EXPECT_EQ(*schema_violation, SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); + ASSERT_FALSE(schema_violation.HasError()); + EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } - EXPECT_EQ(schema_validator.ValidateLabelUpdate(NameToLabel("test")), std::nullopt); + EXPECT_FALSE(schema_validator.ValidateLabelUpdate(NameToLabel("test")).HasError()); } } // namespace memgraph::storage::v3::tests From cd7b33f23fb3e6b7c566af11cb328634177e0331 Mon Sep 17 00:00:00 2001 From: jbajic Date: Tue, 22 Nov 2022 16:22:42 +0100 Subject: [PATCH 24/30] use comparison between ErrorCode and ShardError --- src/storage/v3/shard.cpp | 4 ++-- src/storage/v3/shard_rsm.cpp | 16 ++++------------ tests/unit/storage_v3.cpp | 2 +- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/storage/v3/shard.cpp b/src/storage/v3/shard.cpp index dbf1f043f..79093449c 100644 --- a/src/storage/v3/shard.cpp +++ b/src/storage/v3/shard.cpp @@ -444,7 +444,7 @@ ShardResult>>> EdgeAccessor e(edge, edge_type, from_vertex, vertex_id, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError().code == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError() == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } @@ -457,7 +457,7 @@ ShardResult>>> EdgeAccessor e(edge, edge_type, vertex_id, to_vertex, transaction_, &shard_->indices_, config_); auto ret = DeleteEdge(e.FromVertex(), e.ToVertex(), e.Gid()); if (ret.HasError()) { - MG_ASSERT(ret.GetError().code == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); + MG_ASSERT(ret.GetError() == common::ErrorCode::SERIALIZATION_ERROR, "Invalid database state!"); return ret.GetError(); } diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index aac045fe4..62f46b944 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -355,16 +355,11 @@ ShardResult GetExpandOneResult( result_row.src_vertex_properties = std::move(*src_vertex_properties); static constexpr bool kInEdges = true; static constexpr bool kOutEdges = false; - if (!in_edges.empty()) { - if (const auto fill_edges_res = FillEdges(in_edges, result_row, edge_filler); fill_edges_res.HasError()) { - return fill_edges_res.GetError(); - } + if (const auto fill_edges_res = FillEdges(in_edges, result_row, edge_filler); fill_edges_res.HasError()) { + return fill_edges_res.GetError(); } - if (!out_edges.empty()) { - if (const auto fill_edges_res = FillEdges(out_edges, result_row, edge_filler); - fill_edges_res.HasError()) { - return fill_edges_res.GetError(); - } + if (const auto fill_edges_res = FillEdges(out_edges, result_row, edge_filler); fill_edges_res.HasError()) { + return fill_edges_res.GetError(); } return result_row; @@ -447,7 +442,6 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { return {}; }; } else { - // TODO(gvolfing) - do we want to set the action_successful here? edge_filler = [&req](const EdgeAccessor &edge, const bool is_in_edge, msgs::ExpandOneResultRow &result_row) -> ShardResult { std::vector value_properties; @@ -555,8 +549,6 @@ msgs::WriteResponses ShardRsm::ApplyWrite(msgs::DeleteVerticesRequest &&req) { auto vertex_acc = acc.FindVertex(ConvertPropertyVector(std::move(propval)), View::OLD); if (!vertex_acc) { - spdlog::debug("Error while trying to delete vertex. Vertex to delete does not exist. Transaction id: {}", - req.transaction_id.logical_id); shard_error.emplace(msgs::ShardError{common::ErrorCode::OBJECT_NOT_FOUND}); spdlog::debug("In transaction {} vertex could not be found while trying to delete it.", req.transaction_id.logical_id); diff --git a/tests/unit/storage_v3.cpp b/tests/unit/storage_v3.cpp index cab463b7f..6f6902d1c 100644 --- a/tests/unit/storage_v3.cpp +++ b/tests/unit/storage_v3.cpp @@ -2657,7 +2657,7 @@ TEST_P(StorageV3, TestCreateVertexAndValidate) { ASSERT_TRUE(vertex2.HasError()); auto error = vertex2.GetError(); - ASSERT_TRUE(error.code == common::ErrorCode::VERTEX_ALREADY_INSERTED); + ASSERT_TRUE(error == common::ErrorCode::VERTEX_ALREADY_INSERTED); } { auto acc = store.Access(GetNextHlc()); From 9fade5ebac55a8e345b3db135da94eb541f61b6a Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 10:19:27 +0100 Subject: [PATCH 25/30] Fix tests --- src/storage/v3/shard_rsm.cpp | 2 +- tests/simulation/shard_rsm.cpp | 2 +- tests/unit/machine_manager.cpp | 1 + tests/unit/storage_v3_schema.cpp | 22 +++++++++++----------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 62f46b944..a027140e2 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -805,7 +805,7 @@ msgs::ReadResponses ShardRsm::HandleRead(msgs::ScanVerticesRequest &&req) { } msgs::ScanVerticesResponse resp{.error = std::move(shard_error)}; - if (resp.error) { + if (!resp.error) { resp.next_start_id = next_start_id; resp.results = std::move(results); } diff --git a/tests/simulation/shard_rsm.cpp b/tests/simulation/shard_rsm.cpp index b9511f024..b197f114d 100644 --- a/tests/simulation/shard_rsm.cpp +++ b/tests/simulation/shard_rsm.cpp @@ -156,7 +156,7 @@ bool AttemptToCreateVertex(ShardClient &client, int64_t value) { create_req.transaction_id.logical_id = GetTransactionId(); auto write_res = client.SendWriteRequest(create_req); - MG_ASSERT(write_res.HasValue() && std::get(write_res.GetValue()).error, + MG_ASSERT(write_res.HasValue() && !std::get(write_res.GetValue()).error.has_value(), "Unexpected failure"); Commit(client, create_req.transaction_id); diff --git a/tests/unit/machine_manager.cpp b/tests/unit/machine_manager.cpp index 7b57d61ea..110220eda 100644 --- a/tests/unit/machine_manager.cpp +++ b/tests/unit/machine_manager.cpp @@ -131,6 +131,7 @@ void TestCreateVertices(msgs::ShardRequestManagerInterface &shard_request_manage auto result = shard_request_manager.Request(state, std::move(new_vertices)); EXPECT_EQ(result.size(), 1); + EXPECT_FALSE(result[0].error.has_value()) << result[0].error->message; } void TestCreateExpand(msgs::ShardRequestManagerInterface &shard_request_manager) { diff --git a/tests/unit/storage_v3_schema.cpp b/tests/unit/storage_v3_schema.cpp index 2c5515958..df84fd70c 100644 --- a/tests/unit/storage_v3_schema.cpp +++ b/tests/unit/storage_v3_schema.cpp @@ -186,43 +186,43 @@ TEST_F(SchemaValidatorTest, TestSchemaValidateVertexCreate) { // Validate against secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(NameToLabel("test"), {}, {PropertyValue(1)}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED)); } // Validate wrong secondary label { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label1}, {PropertyValue("test")}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {label2}, {PropertyValue("test")}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY)); } // Validate wrong property type { const auto schema_violation = schema_validator.ValidateVertexCreate(label1, {}, {PropertyValue(1)}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), PropertyValue(1)}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } { const auto wrong_prop = PropertyValue(TemporalData(TemporalType::Date, 1234)); const auto schema_violation = schema_validator.ValidateVertexCreate(label2, {}, {PropertyValue("test"), PropertyValue(12), wrong_prop}); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE)); } // Passing validations @@ -247,12 +247,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdate) { // Validate updating of primary key { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label1, prop_string); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } { const auto schema_violation = schema_validator.ValidatePropertyUpdate(label2, prop_duration); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY)); } EXPECT_FALSE(schema_validator.ValidatePropertyUpdate(label1, prop_int).HasError()); @@ -264,12 +264,12 @@ TEST_F(SchemaValidatorTest, TestSchemaValidatePropertyUpdateLabel) { // Validate adding primary label { const auto schema_violation = schema_validator.ValidateLabelUpdate(label1); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } { const auto schema_violation = schema_validator.ValidateLabelUpdate(label2); - ASSERT_FALSE(schema_violation.HasError()); + ASSERT_TRUE(schema_violation.HasError()); EXPECT_EQ(schema_violation.GetError(), SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL)); } EXPECT_FALSE(schema_validator.ValidateLabelUpdate(NameToLabel("test")).HasError()); From accf015dcfb180c8a67f3207a30291bfa0483a09 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 11:03:17 +0100 Subject: [PATCH 26/30] Fix clang-tidy errors --- src/storage/v3/schema_validator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/storage/v3/schema_validator.cpp b/src/storage/v3/schema_validator.cpp index ea2522684..d21043868 100644 --- a/src/storage/v3/schema_validator.cpp +++ b/src/storage/v3/schema_validator.cpp @@ -54,7 +54,7 @@ ShardResult SchemaValidator::ValidateVertexCreate(LabelId primary_label, c // Check schema property type if (auto property_schema_type = PropertyTypeToSchemaType(primary_properties[i]); property_schema_type && *property_schema_type != schema->second[i].type) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE, "Property {} is of wrong type, expected {}, actual {}", name_id_mapper_->IdToName(schema->second[i].property_id.AsInt()), SchemaTypeToString(schema->second[i].type), SchemaTypeToString(*property_schema_type)); @@ -75,7 +75,7 @@ ShardResult SchemaValidator::ValidatePropertyUpdate(const LabelId primary_ schema->second, [property_id](const auto &schema_property) { return property_id == schema_property.property_id; }); schema_property != schema->second.end()) { - return SHARD_ERROR(common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, + return SHARD_ERROR(ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY, "Cannot update primary property {} of schema on label :{}", name_id_mapper_->IdToName(schema_property->property_id.AsInt()), name_id_mapper_->IdToName(primary_label.AsInt())); From ce0f1a09f7d661463586390365f2f40e3b06f96c Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 11:32:53 +0100 Subject: [PATCH 27/30] Remove unused methods from accessors --- src/query/v2/common.hpp | 1 - src/query/v2/db_accessor.hpp | 43 ------------------------------------ 2 files changed, 44 deletions(-) diff --git a/src/query/v2/common.hpp b/src/query/v2/common.hpp index 089f3a4f9..0ee33c650 100644 --- a/src/query/v2/common.hpp +++ b/src/query/v2/common.hpp @@ -20,7 +20,6 @@ #include "query/v2/bindings/symbol.hpp" #include "query/v2/bindings/typed_value.hpp" -#include "query/v2/db_accessor.hpp" #include "query/v2/exceptions.hpp" #include "query/v2/frontend/ast/ast.hpp" #include "query/v2/path.hpp" diff --git a/src/query/v2/db_accessor.hpp b/src/query/v2/db_accessor.hpp index dfa23376f..e97b47f63 100644 --- a/src/query/v2/db_accessor.hpp +++ b/src/query/v2/db_accessor.hpp @@ -69,19 +69,6 @@ class EdgeAccessor final { return impl_.GetProperty(key, view); } - storage::v3::ShardResult SetProperty(storage::v3::PropertyId key, - const storage::v3::PropertyValue &value) { - return impl_.SetProperty(key, value); - } - - storage::v3::ShardResult RemoveProperty(storage::v3::PropertyId key) { - return SetProperty(key, storage::v3::PropertyValue()); - } - - storage::v3::ShardResult> ClearProperties() { - return impl_.ClearProperties(); - } - VertexAccessor To() const; VertexAccessor From() const; @@ -113,18 +100,6 @@ class VertexAccessor final { auto PrimaryKey(storage::v3::View view) const { return impl_.PrimaryKey(view); } - storage::v3::ShardResult AddLabel(storage::v3::LabelId label) { return impl_.AddLabelAndValidate(label); } - - storage::v3::ShardResult AddLabelAndValidate(storage::v3::LabelId label) { - return impl_.AddLabelAndValidate(label); - } - - storage::v3::ShardResult RemoveLabel(storage::v3::LabelId label) { return impl_.RemoveLabelAndValidate(label); } - - storage::v3::ShardResult RemoveLabelAndValidate(storage::v3::LabelId label) { - return impl_.RemoveLabelAndValidate(label); - } - storage::v3::ShardResult HasLabel(storage::v3::View view, storage::v3::LabelId label) const { return impl_.HasLabel(label, view); } @@ -136,24 +111,6 @@ class VertexAccessor final { return impl_.GetProperty(key, view); } - storage::v3::ShardResult SetProperty(storage::v3::PropertyId key, - const storage::v3::PropertyValue &value) { - return impl_.SetPropertyAndValidate(key, value); - } - - storage::v3::ShardResult SetPropertyAndValidate(storage::v3::PropertyId key, - const storage::v3::PropertyValue &value) { - return impl_.SetPropertyAndValidate(key, value); - } - - storage::v3::ShardResult RemovePropertyAndValidate(storage::v3::PropertyId key) { - return SetPropertyAndValidate(key, storage::v3::PropertyValue{}); - } - - storage::v3::ShardResult> ClearProperties() { - return impl_.ClearProperties(); - } - auto InEdges(storage::v3::View view, const std::vector &edge_types) const -> storage::v3::ShardResult { auto maybe_edges = impl_.InEdges(view, edge_types); From ab5fc05fd76acf94004865fe0537727806fff99d Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 15:32:28 +0100 Subject: [PATCH 28/30] Address review comments --- src/glue/v2/communication.cpp | 50 ++++++++++++++----------------- src/glue/v2/communication.hpp | 27 ++++++++--------- src/memgraph.cpp | 48 ++++------------------------- src/storage/v3/name_id_mapper.hpp | 1 - src/storage/v3/result.hpp | 1 - 5 files changed, 40 insertions(+), 87 deletions(-) diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index bc8d2da09..cd3f41255 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -71,9 +71,9 @@ query::v2::TypedValue ToTypedValue(const Value &value) { } } -BoltResult ToBoltVertex(const query::v2::accessors::VertexAccessor &vertex, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View /*view*/) { +communication::bolt::Vertex ToBoltVertex(const query::v2::accessors::VertexAccessor &vertex, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View /*view*/) { auto id = communication::bolt::Id::FromUint(0); auto labels = vertex.Labels(); @@ -91,9 +91,9 @@ BoltResult ToBoltVertex(const query::v2::accessors: return communication::bolt::Vertex{id, new_labels, new_properties}; } -BoltResult ToBoltEdge(const query::v2::accessors::EdgeAccessor &edge, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View /*view*/) { +communication::bolt::Edge ToBoltEdge(const query::v2::accessors::EdgeAccessor &edge, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication auto id = communication::bolt::Id::FromUint(0); auto from = communication::bolt::Id::FromUint(0); @@ -108,15 +108,16 @@ BoltResult ToBoltEdge(const query::v2::accessors::Edg return communication::bolt::Edge{id, from, to, type, new_properties}; } -BoltResult ToBoltPath(const query::v2::accessors::Path & /*edge*/, - const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, - storage::v3::View /*view*/) { +communication::bolt::Path ToBoltPath(const query::v2::accessors::Path & /*edge*/, + const msgs::ShardRequestManagerInterface * /*shard_request_manager*/, + storage::v3::View /*view*/) { // TODO(jbajic) Fix bolt communication - return {SHARD_ERROR(ErrorCode::DELETED_OBJECT)}; + MG_ASSERT(false, "Path is unimplemented!"); + return {}; } -BoltResult ToBoltValue(const query::v2::TypedValue &value, - const msgs::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view) { +Value ToBoltValue(const query::v2::TypedValue &value, const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view) { switch (value.type()) { case query::v2::TypedValue::Type::Null: return Value(); @@ -132,35 +133,30 @@ BoltResult ToBoltValue(const query::v2::TypedValue &value, std::vector values; values.reserve(value.ValueList().size()); for (const auto &v : value.ValueList()) { - auto maybe_value = ToBoltValue(v, shard_request_manager, view); - if (maybe_value.HasError()) return maybe_value.GetError(); - values.emplace_back(std::move(*maybe_value)); + auto value = ToBoltValue(v, shard_request_manager, view); + values.emplace_back(std::move(value)); } return Value(std::move(values)); } case query::v2::TypedValue::Type::Map: { std::map map; for (const auto &kv : value.ValueMap()) { - auto maybe_value = ToBoltValue(kv.second, shard_request_manager, view); - if (maybe_value.HasError()) return maybe_value.GetError(); - map.emplace(kv.first, std::move(*maybe_value)); + auto value = ToBoltValue(kv.second, shard_request_manager, view); + map.emplace(kv.first, std::move(value)); } return Value(std::move(map)); } case query::v2::TypedValue::Type::Vertex: { - auto maybe_vertex = ToBoltVertex(value.ValueVertex(), shard_request_manager, view); - if (maybe_vertex.HasError()) return maybe_vertex.GetError(); - return Value(std::move(*maybe_vertex)); + auto vertex = ToBoltVertex(value.ValueVertex(), shard_request_manager, view); + return Value(std::move(vertex)); } case query::v2::TypedValue::Type::Edge: { - auto maybe_edge = ToBoltEdge(value.ValueEdge(), shard_request_manager, view); - if (maybe_edge.HasError()) return maybe_edge.GetError(); - return Value(std::move(*maybe_edge)); + auto edge = ToBoltEdge(value.ValueEdge(), shard_request_manager, view); + return Value(std::move(edge)); } case query::v2::TypedValue::Type::Path: { - auto maybe_path = ToBoltPath(value.ValuePath(), shard_request_manager, view); - if (maybe_path.HasError()) return maybe_path.GetError(); - return Value(std::move(*maybe_path)); + auto path = ToBoltPath(value.ValuePath(), shard_request_manager, view); + return Value(std::move(path)); } case query::v2::TypedValue::Type::Date: return Value(value.ValueDate()); diff --git a/src/glue/v2/communication.hpp b/src/glue/v2/communication.hpp index 4ea05a61d..a20162176 100644 --- a/src/glue/v2/communication.hpp +++ b/src/glue/v2/communication.hpp @@ -30,45 +30,42 @@ class VertexAccessor; namespace memgraph::glue::v2 { -template -using BoltResult = utils::BasicResult; - /// @param storage::v3::VertexAccessor for converting to /// communication::bolt::Vertex. /// @param msgs::ShardRequestManagerInterface *shard_request_manager getting label and property names. /// @param storage::v3::View for deciding which vertex attributes are visible. /// /// @throw std::bad_alloc -BoltResult ToBoltVertex(const storage::v3::VertexAccessor &vertex, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +communication::bolt::Vertex ToBoltVertex(const storage::v3::VertexAccessor &vertex, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param storage::v3::EdgeAccessor for converting to communication::bolt::Edge. /// @param msgs::ShardRequestManagerInterface *shard_request_manager getting edge type and property names. /// @param storage::v3::View for deciding which edge attributes are visible. /// /// @throw std::bad_alloc -BoltResult ToBoltEdge(const storage::v3::EdgeAccessor &edge, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +communication::bolt::Edge ToBoltEdge(const storage::v3::EdgeAccessor &edge, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param query::v2::Path for converting to communication::bolt::Path. /// @param msgs::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge. /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -BoltResult ToBoltPath(const query::v2::accessors::Path &path, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +communication::bolt::Path ToBoltPath(const query::v2::accessors::Path &path, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); /// @param query::v2::TypedValue for converting to communication::bolt::Value. /// @param msgs::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge. /// @param storage::v3::View for ToBoltVertex and ToBoltEdge. /// /// @throw std::bad_alloc -BoltResult ToBoltValue(const query::v2::TypedValue &value, - const msgs::ShardRequestManagerInterface *shard_request_manager, - storage::v3::View view); +communication::bolt::Value ToBoltValue(const query::v2::TypedValue &value, + const msgs::ShardRequestManagerInterface *shard_request_manager, + storage::v3::View view); query::v2::TypedValue ToTypedValue(const communication::bolt::Value &value); diff --git a/src/memgraph.cpp b/src/memgraph.cpp index 23582e9ea..5903e65ad 100644 --- a/src/memgraph.cpp +++ b/src/memgraph.cpp @@ -481,27 +481,9 @@ class BoltSession final : public memgraph::communication::bolt::Session decoded_summary; for (const auto &kv : summary) { - auto maybe_value = memgraph::glue::v2::ToBoltValue(kv.second, interpreter_.GetShardRequestManager(), - memgraph::storage::v3::View::NEW); - if (maybe_value.HasError()) { - switch (maybe_value.GetError().code) { - case memgraph::common::ErrorCode::DELETED_OBJECT: - case memgraph::common::ErrorCode::SERIALIZATION_ERROR: - case memgraph::common::ErrorCode::VERTEX_HAS_EDGES: - case memgraph::common::ErrorCode::PROPERTIES_DISABLED: - case memgraph::common::ErrorCode::NONEXISTENT_OBJECT: - case memgraph::common::ErrorCode::VERTEX_ALREADY_INSERTED: - case memgraph::common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: - case memgraph::common::ErrorCode::OBJECT_NOT_FOUND: - throw memgraph::communication::bolt::ClientError("Unexpected storage error when streaming summary."); - } - } - decoded_summary.emplace(kv.first, std::move(*maybe_value)); + auto bolt_value = memgraph::glue::v2::ToBoltValue(kv.second, interpreter_.GetShardRequestManager(), + memgraph::storage::v3::View::NEW); + decoded_summary.emplace(kv.first, std::move(bolt_value)); } return decoded_summary; } catch (const memgraph::query::v2::QueryException &e) { @@ -522,28 +504,8 @@ class BoltSession final : public memgraph::communication::bolt::Session decoded_values; decoded_values.reserve(values.size()); for (const auto &v : values) { - auto maybe_value = memgraph::glue::v2::ToBoltValue(v, shard_request_manager_, memgraph::storage::v3::View::NEW); - if (maybe_value.HasError()) { - switch (maybe_value.GetError().code) { - case memgraph::common::ErrorCode::DELETED_OBJECT: - throw memgraph::communication::bolt::ClientError("Returning a deleted object as a result."); - case memgraph::common::ErrorCode::NONEXISTENT_OBJECT: - case memgraph::common::ErrorCode::OBJECT_NOT_FOUND: - throw memgraph::communication::bolt::ClientError("Returning a nonexistent object as a result."); - case memgraph::common::ErrorCode::VERTEX_HAS_EDGES: - case memgraph::common::ErrorCode::SERIALIZATION_ERROR: - case memgraph::common::ErrorCode::PROPERTIES_DISABLED: - case memgraph::common::ErrorCode::VERTEX_ALREADY_INSERTED: - case memgraph::common::ErrorCode::SCHEMA_NO_SCHEMA_DEFINED_FOR_LABEL: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_PROPERTY_WRONG_TYPE: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_KEY: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_UPDATE_PRIMARY_LABEL: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_SECONDARY_LABEL_IS_PRIMARY: - case memgraph::common::ErrorCode::SCHEMA_VERTEX_PRIMARY_PROPERTIES_UNDEFINED: - throw memgraph::communication::bolt::ClientError("Unexpected storage error when streaming results."); - } - } - decoded_values.emplace_back(std::move(*maybe_value)); + auto bolt_value = memgraph::glue::v2::ToBoltValue(v, shard_request_manager_, memgraph::storage::v3::View::NEW); + decoded_values.emplace_back(std::move(bolt_value)); } encoder_->MessageRecord(decoded_values); } diff --git a/src/storage/v3/name_id_mapper.hpp b/src/storage/v3/name_id_mapper.hpp index d238f1072..f241bca54 100644 --- a/src/storage/v3/name_id_mapper.hpp +++ b/src/storage/v3/name_id_mapper.hpp @@ -17,7 +17,6 @@ #include #include -#include "storage/v3/id_types.hpp" #include "utils/logging.hpp" #include "utils/skip_list.hpp" diff --git a/src/storage/v3/result.hpp b/src/storage/v3/result.hpp index fcec17548..e3561fcc0 100644 --- a/src/storage/v3/result.hpp +++ b/src/storage/v3/result.hpp @@ -32,7 +32,6 @@ struct ShardError { : code{code}, source{fmt::format("{}:{}", location.file_name(), location.line())} {} common::ErrorCode code; - // TODO Maybe add category std::string message; std::string source; From d6b444c38bd8071cb3ab3ad846ef6d396560c2a2 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 18:02:00 +0100 Subject: [PATCH 29/30] Log transaction id --- src/storage/v3/shard_rsm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/v3/shard_rsm.cpp b/src/storage/v3/shard_rsm.cpp index 5b919402a..b13a5ad54 100644 --- a/src/storage/v3/shard_rsm.cpp +++ b/src/storage/v3/shard_rsm.cpp @@ -466,7 +466,7 @@ EdgeFiller InitializeEdgeFillerFunction(const msgs::ExpandOneRequest &req) { auto CreateErrorResponse(const ShardError &shard_error, const auto transaction_id, const std::string_view action) { msgs::ShardError message_shard_error{shard_error.code, shard_error.message}; - spdlog::debug("{} In transaction {} {} failed: {}: {}", shard_error.source, transaction_id, action, + spdlog::debug("{} In transaction {} {} failed: {}: {}", shard_error.source, transaction_id.logical_id, action, ErrorCodeToString(shard_error.code), shard_error.message); return message_shard_error; } From d820d0a9e52030c9aef7327d0dc511cfb4834a22 Mon Sep 17 00:00:00 2001 From: jbajic Date: Wed, 23 Nov 2022 22:29:03 +0100 Subject: [PATCH 30/30] Fix clang tidy errors --- src/glue/v2/communication.cpp | 28 ++++++++++++++-------------- src/storage/v3/request_helper.cpp | 10 +++++----- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/glue/v2/communication.cpp b/src/glue/v2/communication.cpp index cd3f41255..eedf699bb 100644 --- a/src/glue/v2/communication.cpp +++ b/src/glue/v2/communication.cpp @@ -120,15 +120,15 @@ Value ToBoltValue(const query::v2::TypedValue &value, const msgs::ShardRequestMa storage::v3::View view) { switch (value.type()) { case query::v2::TypedValue::Type::Null: - return Value(); + return {}; case query::v2::TypedValue::Type::Bool: - return Value(value.ValueBool()); + return {value.ValueBool()}; case query::v2::TypedValue::Type::Int: - return Value(value.ValueInt()); + return {value.ValueInt()}; case query::v2::TypedValue::Type::Double: - return Value(value.ValueDouble()); + return {value.ValueDouble()}; case query::v2::TypedValue::Type::String: - return Value(std::string(value.ValueString())); + return {std::string(value.ValueString())}; case query::v2::TypedValue::Type::List: { std::vector values; values.reserve(value.ValueList().size()); @@ -136,7 +136,7 @@ Value ToBoltValue(const query::v2::TypedValue &value, const msgs::ShardRequestMa auto value = ToBoltValue(v, shard_request_manager, view); values.emplace_back(std::move(value)); } - return Value(std::move(values)); + return {std::move(values)}; } case query::v2::TypedValue::Type::Map: { std::map map; @@ -144,28 +144,28 @@ Value ToBoltValue(const query::v2::TypedValue &value, const msgs::ShardRequestMa auto value = ToBoltValue(kv.second, shard_request_manager, view); map.emplace(kv.first, std::move(value)); } - return Value(std::move(map)); + return {std::move(map)}; } case query::v2::TypedValue::Type::Vertex: { auto vertex = ToBoltVertex(value.ValueVertex(), shard_request_manager, view); - return Value(std::move(vertex)); + return {std::move(vertex)}; } case query::v2::TypedValue::Type::Edge: { auto edge = ToBoltEdge(value.ValueEdge(), shard_request_manager, view); - return Value(std::move(edge)); + return {std::move(edge)}; } case query::v2::TypedValue::Type::Path: { auto path = ToBoltPath(value.ValuePath(), shard_request_manager, view); - return Value(std::move(path)); + return {std::move(path)}; } case query::v2::TypedValue::Type::Date: - return Value(value.ValueDate()); + return {value.ValueDate()}; case query::v2::TypedValue::Type::LocalTime: - return Value(value.ValueLocalTime()); + return {value.ValueLocalTime()}; case query::v2::TypedValue::Type::LocalDateTime: - return Value(value.ValueLocalDateTime()); + return {value.ValueLocalDateTime()}; case query::v2::TypedValue::Type::Duration: - return Value(value.ValueDuration()); + return {value.ValueDuration()}; } } diff --git a/src/storage/v3/request_helper.cpp b/src/storage/v3/request_helper.cpp index 6a0d6da7e..dd94309ab 100644 --- a/src/storage/v3/request_helper.cpp +++ b/src/storage/v3/request_helper.cpp @@ -360,7 +360,7 @@ bool FilterOnVertex(DbAccessor &dba, const storage::v3::VertexAccessor &v_acc, c ShardResult GetExpandOneResult( Shard::Accessor &acc, msgs::VertexId src_vertex, const msgs::ExpandOneRequest &req, - const EdgeUniquenessFunction &maybe_filter_based_on_edge_uniquness, const EdgeFiller &edge_filler, + const EdgeUniquenessFunction &maybe_filter_based_on_edge_uniqueness, const EdgeFiller &edge_filler, const Schemas::Schema &schema) { /// Fill up source vertex const auto primary_key = ConvertPropertyVector(src_vertex.second); @@ -379,7 +379,7 @@ ShardResult GetExpandOneResult( } /// Fill up connecting edges - auto fill_up_connecting_edges = FillUpConnectingEdges(v_acc, req, maybe_filter_based_on_edge_uniquness); + auto fill_up_connecting_edges = FillUpConnectingEdges(v_acc, req, maybe_filter_based_on_edge_uniqueness); if (fill_up_connecting_edges.HasError()) { return fill_up_connecting_edges.GetError(); } @@ -403,7 +403,7 @@ ShardResult GetExpandOneResult( ShardResult GetExpandOneResult( VertexAccessor v_acc, msgs::VertexId src_vertex, const msgs::ExpandOneRequest &req, std::vector in_edge_accessors, std::vector out_edge_accessors, - const EdgeUniquenessFunction &maybe_filter_based_on_edge_uniquness, const EdgeFiller &edge_filler, + const EdgeUniquenessFunction &maybe_filter_based_on_edge_uniqueness, const EdgeFiller &edge_filler, const Schemas::Schema &schema) { /// Fill up source vertex msgs::Vertex source_vertex = {.id = src_vertex}; @@ -420,8 +420,8 @@ ShardResult GetExpandOneResult( } /// Fill up connecting edges - auto in_edges = maybe_filter_based_on_edge_uniquness(std::move(in_edge_accessors), msgs::EdgeDirection::IN); - auto out_edges = maybe_filter_based_on_edge_uniquness(std::move(out_edge_accessors), msgs::EdgeDirection::OUT); + auto in_edges = maybe_filter_based_on_edge_uniqueness(std::move(in_edge_accessors), msgs::EdgeDirection::IN); + auto out_edges = maybe_filter_based_on_edge_uniqueness(std::move(out_edge_accessors), msgs::EdgeDirection::OUT); msgs::ExpandOneResultRow result_row; result_row.src_vertex = std::move(source_vertex);