Spaces:
Build error
Build error
use segment::common::operation_error::{OperationError, SegmentFailedState}; | |
use segment::data_types::vectors::only_default_vector; | |
use segment::entry::entry_point::SegmentEntry; | |
use serde_json::json; | |
use tempfile::Builder; | |
use crate::fixtures::segment::empty_segment; | |
fn test_insert_fail_recovery() { | |
let dir = Builder::new().prefix("segment_dir").tempdir().unwrap(); | |
let vec1 = vec![1.0, 0.0, 1.0, 1.0]; | |
let mut segment = empty_segment(dir.path()); | |
segment | |
.upsert_point(1, 1.into(), only_default_vector(&vec1)) | |
.unwrap(); | |
segment | |
.upsert_point(1, 2.into(), only_default_vector(&vec1)) | |
.unwrap(); | |
segment.error_status = Some(SegmentFailedState { | |
version: 2, | |
point_id: Some(1.into()), | |
error: OperationError::service_error("test error"), | |
}); | |
// op_num is greater than errored. Skip because not recovered yet | |
let fail_res = segment.set_payload( | |
3, | |
1.into(), | |
&json!({ "color": vec!["red".to_string()] }).into(), | |
&None, | |
); | |
assert!(fail_res.is_err()); | |
// Also skip even with another point operation | |
let fail_res = segment.set_payload( | |
3, | |
2.into(), | |
&json!({ "color": vec!["red".to_string()] }).into(), | |
&None, | |
); | |
assert!(fail_res.is_err()); | |
// Perform operation, but keep error status: operation is not fully recovered yet | |
let ok_res = segment.set_payload( | |
2, | |
2.into(), | |
&json!({ "color": vec!["red".to_string()] }).into(), | |
&None, | |
); | |
assert!(ok_res.is_ok()); | |
assert!(segment.error_status.is_some()); | |
// Perform operation and recover the error - operation is fixed now | |
let recover_res = segment.set_payload( | |
2, | |
1.into(), | |
&json!({ "color": vec!["red".to_string()] }).into(), | |
&None, | |
); | |
assert!(recover_res.is_ok()); | |
assert!(segment.error_status.is_none()); | |
} | |