archivist_lib/
error.rs

1// Copyright 2020 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::logs::error::LogsError;
6use fidl::prelude::*;
7use fidl_fuchsia_diagnostics::BatchIteratorControlHandle;
8use log::warn;
9use thiserror::Error;
10use zx_status::Status as ZxStatus;
11
12#[derive(Debug, Error)]
13pub enum Error {
14    #[error(transparent)]
15    Logs(#[from] LogsError),
16
17    #[error("Failed to serve outgoing dir: {0}")]
18    ServeOutgoing(#[source] anyhow::Error),
19
20    #[error(transparent)]
21    Inspect(#[from] fuchsia_inspect::Error),
22
23    #[error(
24        "Encountered a diagnostics data repository node with more than one artifact container. {0:?}"
25    )]
26    MultipleArtifactContainers(Vec<String>),
27
28    #[error(transparent)]
29    Hierarchy(#[from] diagnostics_hierarchy::Error),
30
31    #[error(transparent)]
32    Selectors(#[from] anyhow::Error),
33}
34
35#[derive(Debug, Error)]
36pub enum AccessorError {
37    #[error("data_type must be set")]
38    MissingDataType,
39
40    #[error("client_selector_configuration must be set")]
41    MissingSelectors,
42
43    #[error("no selectors were provided")]
44    EmptySelectors,
45
46    #[error("requested selectors are unsupported: {}", .0)]
47    InvalidSelectors(&'static str),
48
49    #[error("couldn't parse/validate the provided selectors: {}", .0)]
50    ParseSelectors(#[from] selectors::Error),
51
52    #[error("only selectors of type `component:root` are supported for logs at the moment")]
53    InvalidLogSelector,
54
55    #[error("format must be set")]
56    MissingFormat,
57
58    #[error("only JSON supported right now")]
59    UnsupportedFormat,
60
61    #[error("stream_mode must be set")]
62    MissingMode,
63
64    #[error("only snapshot supported right now")]
65    UnsupportedMode,
66
67    #[error("IPC failure")]
68    Ipc {
69        #[from]
70        source: fidl::Error,
71    },
72
73    #[error("Unable to create a VMO -- extremely unusual!")]
74    VmoCreate(#[source] ZxStatus),
75
76    #[error("Unable to write to VMO -- we may be OOMing")]
77    VmoWrite(#[source] ZxStatus),
78
79    #[error("Unable to get VMO size -- extremely unusual")]
80    VmoSize(#[source] ZxStatus),
81
82    #[error("JSON serialization failure: {0}")]
83    Serialization(#[from] serde_json::Error),
84
85    #[error("CBOR serialization failure: {0}")]
86    CborSerialization(#[source] anyhow::Error),
87
88    #[error("batch timeout was set on StreamParameter and on PerformanceConfiguration")]
89    DuplicateBatchTimeout,
90
91    #[error("IO error: {0}")]
92    Io(#[from] std::io::Error),
93}
94
95impl AccessorError {
96    pub fn close(self, control: BatchIteratorControlHandle) {
97        warn!(error:% = self; "Closing BatchIterator.");
98        let epitaph = match self {
99            AccessorError::DuplicateBatchTimeout
100            | AccessorError::MissingDataType
101            | AccessorError::EmptySelectors
102            | AccessorError::MissingSelectors
103            | AccessorError::InvalidSelectors(_)
104            | AccessorError::InvalidLogSelector
105            | AccessorError::ParseSelectors(_) => ZxStatus::INVALID_ARGS,
106            AccessorError::VmoCreate(status)
107            | AccessorError::VmoWrite(status)
108            | AccessorError::VmoSize(status) => status,
109            AccessorError::MissingFormat | AccessorError::MissingMode => ZxStatus::INVALID_ARGS,
110            AccessorError::UnsupportedFormat | AccessorError::UnsupportedMode => {
111                ZxStatus::WRONG_TYPE
112            }
113            AccessorError::Serialization { .. } => ZxStatus::BAD_STATE,
114            AccessorError::CborSerialization { .. } => ZxStatus::BAD_STATE,
115            AccessorError::Ipc { .. } | AccessorError::Io(_) => ZxStatus::IO,
116        };
117        control.shutdown_with_epitaph(epitaph);
118    }
119}