Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Return textual error message for ac status
Add an error message field to AdmissionControlStatus proto
  • Loading branch information
Jiabao Wu authored and calibra-opensource committed Jul 8, 2019
1 parent 2cb3d32 commit 33b7b19
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 22 deletions.
43 changes: 30 additions & 13 deletions admission_control/admission_control_proto/src/lib.rs
Expand Up @@ -3,7 +3,6 @@

pub mod proto;

use crate::proto::admission_control::AdmissionControlStatus as ProtoAdmissionControlStatus;
use failure::prelude::*;
use logger::prelude::*;
use mempool::MempoolAddTransactionStatus;
Expand All @@ -14,33 +13,51 @@ use types::vm_error::VMStatus;
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum AdmissionControlStatus {
/// Validator accepted the transaction.
Accepted = 0,
Accepted,
/// The sender is blacklisted.
Blacklisted = 1,
Blacklisted(String),
/// The transaction is rejected, e.g. due to incorrect signature.
Rejected = 2,
Rejected(String),
}

impl IntoProto for AdmissionControlStatus {
type ProtoType = crate::proto::admission_control::AdmissionControlStatus;

fn into_proto(self) -> Self::ProtoType {
use crate::proto::admission_control::AdmissionControlStatusCode as ProtoStatusCode;
let mut admission_control_status = Self::ProtoType::new();
match self {
AdmissionControlStatus::Accepted => ProtoAdmissionControlStatus::Accepted,
AdmissionControlStatus::Blacklisted => ProtoAdmissionControlStatus::Blacklisted,
AdmissionControlStatus::Rejected => ProtoAdmissionControlStatus::Rejected,
AdmissionControlStatus::Accepted => {
admission_control_status.set_code(ProtoStatusCode::Accepted)
}
AdmissionControlStatus::Blacklisted(msg) => {
admission_control_status.set_message(msg);
admission_control_status.set_code(ProtoStatusCode::Blacklisted)
}
AdmissionControlStatus::Rejected(msg) => {
admission_control_status.set_message(msg);
admission_control_status.set_code(ProtoStatusCode::Rejected)
}
}
admission_control_status
}
}

impl FromProto for AdmissionControlStatus {
type ProtoType = crate::proto::admission_control::AdmissionControlStatus;

fn from_proto(object: Self::ProtoType) -> Result<Self> {
let ret = match object {
ProtoAdmissionControlStatus::Accepted => AdmissionControlStatus::Accepted,
ProtoAdmissionControlStatus::Blacklisted => AdmissionControlStatus::Blacklisted,
ProtoAdmissionControlStatus::Rejected => AdmissionControlStatus::Rejected,
fn from_proto(mut proto_admission_control_status: Self::ProtoType) -> Result<Self> {
use crate::proto::admission_control::AdmissionControlStatusCode as ProtoStatusCode;
let ret = match proto_admission_control_status.get_code() {
ProtoStatusCode::Accepted => AdmissionControlStatus::Accepted,
ProtoStatusCode::Blacklisted => {
let msg = proto_admission_control_status.take_message();
AdmissionControlStatus::Blacklisted(msg)
}
ProtoStatusCode::Rejected => {
let msg = proto_admission_control_status.take_message();
AdmissionControlStatus::Rejected(msg)
}
};
Ok(ret)
}
Expand Down Expand Up @@ -83,7 +100,7 @@ impl FromProto for SubmitTransactionResponse {

fn from_proto(mut object: Self::ProtoType) -> Result<Self> {
let ac_status = if object.has_ac_status() {
Some(AdmissionControlStatus::from_proto(object.get_ac_status())?)
Some(AdmissionControlStatus::from_proto(object.take_ac_status())?)
} else {
None
};
Expand Down
Expand Up @@ -19,11 +19,20 @@ message SubmitTransactionRequest {
types.SignedTransaction signed_txn = 1;
}

// AC response status containing code and optionally an error message.
message AdmissionControlStatus {
AdmissionControlStatusCode code = 1;
string message = 2;
}

// Additional statuses that are possible from admission control in addition
// to VM statuses.
enum AdmissionControlStatus {
enum AdmissionControlStatusCode {
// Validator accepted the transaction.
Accepted = 0;
// The sender is blacklisted.
Blacklisted = 1;
// The transaction is rejected, e.g. due to incorrect signature.
Rejected = 2;
}

Expand Down
1 change: 1 addition & 0 deletions admission_control/admission_control_service/Cargo.toml
Expand Up @@ -29,6 +29,7 @@ types = { path = "../../types" }
vm_validator = { path = "../../vm_validator" }

[dev-dependencies]
assert_matches = "1.3.0"
storage_service = { path = "../../storage/storage_service" }

[build-dependencies]
Expand Down
Expand Up @@ -6,11 +6,12 @@
//! next step.

use crate::OP_COUNTERS;
use admission_control_proto::proto::{
admission_control::{
AdmissionControlStatus, SubmitTransactionRequest, SubmitTransactionResponse,
use admission_control_proto::{
proto::{
admission_control::{SubmitTransactionRequest, SubmitTransactionResponse},
admission_control_grpc::AdmissionControl,
},
admission_control_grpc::AdmissionControl,
AdmissionControlStatus,
};
use failure::prelude::*;
use futures::future::Future;
Expand Down Expand Up @@ -101,7 +102,10 @@ where
.data(&signed_txn_proto)
.log();
let mut response = SubmitTransactionResponse::new();
response.set_ac_status(AdmissionControlStatus::Rejected);
response.set_ac_status(
AdmissionControlStatus::Rejected("submit txn rejected".to_string())
.into_proto(),
);
OP_COUNTERS.inc_by("submit_txn.rejected.invalid_txn", 1);
return Ok(response);
}
Expand Down Expand Up @@ -165,7 +169,7 @@ where
let mut response = SubmitTransactionResponse::new();
if mempool_result.get_status().get_code() == MempoolAddTransactionStatusCode::Valid {
OP_COUNTERS.inc_by("submit_txn.txn_accepted", 1);
response.set_ac_status(AdmissionControlStatus::Accepted);
response.set_ac_status(AdmissionControlStatus::Accepted.into_proto());
} else {
debug!(
"txn failed in mempool, status: {:?}, txn: {:?}",
Expand Down
Expand Up @@ -9,6 +9,8 @@ use crate::{
unit_tests::LocalMockMempool,
};
use admission_control_proto::{AdmissionControlStatus, SubmitTransactionResponse};

use assert_matches::assert_matches;
use crypto::{
hash::CryptoHash,
signing::{generate_keypair, sign_message},
Expand Down Expand Up @@ -200,9 +202,9 @@ fn test_reject_unknown_fields() {
ac_service.submit_transaction_inner(req.clone()).unwrap(),
)
.unwrap();
assert_eq!(
assert_matches!(
response.ac_status.unwrap(),
AdmissionControlStatus::Rejected
AdmissionControlStatus::Rejected(_)
);
}

Expand Down

0 comments on commit 33b7b19

Please sign in to comment.