| 942 | } |
| 943 | |
| 944 | fn handle_request(store: &RedbChangeStore, frame: RequestFrame) -> (ResponseFrame, bool) { |
| 945 | let request_id = frame.request_id; |
| 946 | if frame.version != PROTOCOL_VERSION { |
| 947 | return ( |
| 948 | ResponseFrame { |
| 949 | version: PROTOCOL_VERSION, |
| 950 | request_id, |
| 951 | response: OwnerResponse::Error { |
| 952 | code: "unsupported-version".to_string(), |
| 953 | message: format!( |
| 954 | "client requested protocol {}, owner supports {}", |
| 955 | frame.version, PROTOCOL_VERSION |
| 956 | ), |
| 957 | }, |
| 958 | }, |
| 959 | false, |
| 960 | ); |
| 961 | } |
| 962 | |
| 963 | let (response, shutdown) = match frame.request { |
| 964 | OwnerRequest::Ping => ( |
| 965 | OwnerResponse::Pong { |
| 966 | pid: std::process::id(), |
| 967 | frozen_envelope_paging: true, |
| 968 | }, |
| 969 | false, |
| 970 | ), |
| 971 | OwnerRequest::ReserveProvenanceTurn { |
| 972 | session_id, |
| 973 | turn_number, |
| 974 | now, |
| 975 | } => match store.reserve_provenance_turn(&session_id, turn_number, now) { |
| 976 | Ok(turn) => ( |
| 977 | OwnerResponse::ProvenanceTurn { |
| 978 | turn, |
| 979 | // reserve_provenance_turn returns only after txn.commit(). |
| 980 | committed: true, |
| 981 | }, |
| 982 | false, |
| 983 | ), |
| 984 | Err(error) => ( |
| 985 | OwnerResponse::Error { |
| 986 | code: "provenance-store".to_string(), |
| 987 | message: error.to_string(), |
| 988 | }, |
| 989 | false, |
| 990 | ), |
| 991 | }, |
| 992 | OwnerRequest::AppendProvenanceEnvelopes { |
| 993 | provenance_id, |
| 994 | expected_generation, |
| 995 | envelopes, |
| 996 | now, |
| 997 | } => { |
| 998 | owner_failpoint("before-envelope-commit"); |
| 999 | let batch: Vec<_> = envelopes |
| 1000 | .iter() |
| 1001 | .map(|envelope| (envelope.event_id.as_str(), envelope.bytes.as_slice())) |