Skip to content

Commit 356b0a8

Browse files
committed
Core/Batch: Add handling for server errors in value conversion
Signed-off-by: Shoham Elias <[email protected]>
1 parent f2201b9 commit 356b0a8

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

glide-core/src/client/value_conversion.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ pub(crate) fn convert_to_expected_type(
5454
return Ok(value);
5555
};
5656

57+
// If the value is a server error, return it as is, without conversion.
58+
if let Value::ServerError(_) = value {
59+
return Ok(value);
60+
}
61+
5762
match expected {
5863
ExpectedReturnType::Map {
5964
key_type,

glide-core/tests/test_client.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,66 @@ pub(crate) mod shared_client_tests {
13181318
});
13191319
}
13201320

1321+
#[rstest]
1322+
#[serial_test::serial]
1323+
#[timeout(SHORT_CLUSTER_TEST_TIMEOUT)]
1324+
fn test_pipeline_failed_commands_skip_conversion(
1325+
#[values(false, true)] use_cluster: bool,
1326+
#[values(false, true)] atomic: bool,
1327+
) {
1328+
block_on_all(async {
1329+
let mut test_basics = setup_test_basics(
1330+
use_cluster,
1331+
TestConfiguration {
1332+
shared_server: true,
1333+
..Default::default()
1334+
},
1335+
)
1336+
.await;
1337+
1338+
let mut pipeline = Pipeline::new();
1339+
if atomic {
1340+
pipeline.atomic();
1341+
}
1342+
pipeline.set("key", "value");
1343+
pipeline.hgetall("key");
1344+
1345+
let result = if atomic {
1346+
test_basics
1347+
.client
1348+
.send_transaction(&pipeline, None, None, false)
1349+
.await
1350+
.expect("Transaction failed")
1351+
} else {
1352+
test_basics
1353+
.client
1354+
.send_pipeline(
1355+
&pipeline,
1356+
None,
1357+
false,
1358+
None,
1359+
PipelineRetryStrategy {
1360+
retry_server_error: false,
1361+
retry_connection_error: false,
1362+
},
1363+
)
1364+
.await
1365+
.expect("Pipeline failed")
1366+
};
1367+
1368+
let arr = match result {
1369+
Value::Array(ref arr) => arr,
1370+
_ => panic!("Expected array result, got: {:?}", result),
1371+
};
1372+
1373+
assert_eq!(arr[0], Value::Okay, "Pipeline result: {arr:?}");
1374+
assert!(
1375+
matches!(&arr[1], Value::ServerError(err) if err.err_code().contains("WRONGTYPE")),
1376+
"Pipeline result: {arr:?}"
1377+
);
1378+
});
1379+
}
1380+
13211381
#[test]
13221382
#[serial_test::serial]
13231383
fn test_client_telemetry_standalone() {

0 commit comments

Comments
 (0)