diff --git a/services/src/ability.rs b/services/src/ability.rs index bdd421dfeecdea65be1d11ee1d0599e3321ff069..093a62444a5fa892ea5faf274117dfe2c40c30e1 100644 --- a/services/src/ability.rs +++ b/services/src/ability.rs @@ -63,10 +63,12 @@ impl RequestAbility { PANIC_INFO = Some(info); })); - ylong_runtime::builder::RuntimeBuilder::new_multi_thread() + if let Err(e) = ylong_runtime::builder::RuntimeBuilder::new_multi_thread() .worker_num(4) .build_global() - .unwrap(); + { + error!("ylong_runtime error: {}", e); + } info!("ylong_runtime init ok"); let runcount_manager = RunCountManager::init(); @@ -79,7 +81,11 @@ impl RequestAbility { unsafe { SYSTEM_CONFIG_MANAGER.write(SystemConfigManager::init()) }; info!("system_config_manager init ok"); - let task_manager = TaskManager::init(runcount_manager.clone(), client_manger.clone(), self.active_counter.clone()); + let task_manager = TaskManager::init( + runcount_manager.clone(), + client_manger.clone(), + self.active_counter.clone(), + ); *self.task_manager.lock().unwrap() = Some(task_manager.clone()); info!("task_manager init ok"); @@ -119,8 +125,14 @@ impl Ability for RequestAbility { ) { info!("on_start_with_reason: {:?}", reason); if reason.name == "usual.event.USER_REMOVED" { - let user_id = reason.value.parse::().unwrap(); - account::remove_account_tasks(user_id); + match reason.value.parse::() { + Ok(user_id) => { + account::remove_account_tasks(user_id); + } + Err(e) => { + error!("on_start_with_reason err {}", e); + } + } self.init(handler); } else { self.init(handler); @@ -164,11 +176,14 @@ static A: extern "C" fn() = { #[link_section = ".text.startup"] extern "C" fn init() { info!("begin request service init"); - let system_ability = RequestAbility::new() + if let Some(system_ability) = RequestAbility::new() .build_system_ability(samgr::definition::DOWNLOAD_SERVICE_ID, false) - .unwrap(); - system_ability.register(); - info!("request service inited"); + { + system_ability.register(); + info!("request service inited"); + } else { + info!("request service inited error"); + } } init }; diff --git a/services/src/lib.rs b/services/src/lib.rs index 4ba5cdaf2a0e696d798f91e71d2dc916916c6db9..c8f571335e3911c5f8fc8debc49603ed861b8534 100644 --- a/services/src/lib.rs +++ b/services/src/lib.rs @@ -83,9 +83,9 @@ mod tests { match DB_LOCK.lock() { Ok(inner) => inner, Err(_) => { - RequestDb::get_instance() - .execute("DELETE FROM request_task") - .unwrap(); + if let Err(e) = RequestDb::get_instance().execute("DELETE FROM request_task") { + error!("lock delete failed: {}", e); + } DB_LOCK = std::sync::Mutex::new(()); DB_LOCK.lock().unwrap() } @@ -100,9 +100,9 @@ mod tests { impl<'a> Drop for DatabaseLock<'a> { fn drop(&mut self) { - RequestDb::get_instance() - .execute("DELETE FROM request_task") - .unwrap(); + if let Err(e) = RequestDb::get_instance().execute("DELETE FROM request_task") { + error!("drop delete failed: {}", e); + } } } diff --git a/services/src/manage/task_manager.rs b/services/src/manage/task_manager.rs index f8b97c9802e0cfc56d548c015818fde9ef454271..e2fb5df2539dc44810ddc35bdd6b65d03feecb8e 100644 --- a/services/src/manage/task_manager.rs +++ b/services/src/manage/task_manager.rs @@ -467,21 +467,39 @@ impl TaskManagerTx { let (tx, rx) = oneshot::channel(); let event = QueryEvent::Show(task_id, uid, tx); let _ = self.send_event(TaskManagerEvent::Query(event)); - ylong_runtime::block_on(rx).unwrap() + match ylong_runtime::block_on(rx) { + Ok(task_info) => task_info, + Err(error) => { + error!("In `show`, block on failed, err {}", error); + None + } + } } pub(crate) fn query(&self, task_id: u32, action: Action) -> Option { let (tx, rx) = oneshot::channel(); let event = QueryEvent::Query(task_id, action, tx); let _ = self.send_event(TaskManagerEvent::Query(event)); - ylong_runtime::block_on(rx).unwrap() + match ylong_runtime::block_on(rx) { + Ok(task_info) => task_info, + Err(error) => { + error!("In `query`, block on failed, err {}", error); + None + } + } } pub(crate) fn touch(&self, uid: u64, task_id: u32, token: String) -> Option { let (tx, rx) = oneshot::channel(); let event = QueryEvent::Touch(task_id, uid, token, tx); let _ = self.send_event(TaskManagerEvent::Query(event)); - ylong_runtime::block_on(rx).unwrap() + match ylong_runtime::block_on(rx) { + Ok(task_info) => task_info, + Err(error) => { + error!("In `touch`, block on failed, err {}", error); + None + } + } } } diff --git a/services/src/service/run_count/manager.rs b/services/src/service/run_count/manager.rs index 9e7972396da27a4e1c073683b5057a61bfa8766e..d349491a6496b7087785f9c55edf49b6c22c0445 100644 --- a/services/src/service/run_count/manager.rs +++ b/services/src/service/run_count/manager.rs @@ -58,7 +58,14 @@ impl RunCountManagerEntry { let (tx, rx) = oneshot::channel::(); let event = RunCountEvent::Subscribe(pid, obj, tx); self.send_event(event); - ylong_runtime::block_on(rx).unwrap() + match ylong_runtime::block_on(rx) { + Ok(error_code) => error_code, + Err(error) => { + error!("In `subscribe_run_count`, block on failed, err {}", error); + // todo: may be another error code + ErrorCode::Other + } + } } pub(crate) fn unsubscribe_run_count(&self, pid: u64) -> ErrorCode { diff --git a/services/src/task/config.rs b/services/src/task/config.rs index f1fe03b3a3f25cc29495dbac7dfd47837fb0dcfd..e08b82390e025a46e4ec13ee02e99f5ee96d95bb 100644 --- a/services/src/task/config.rs +++ b/services/src/task/config.rs @@ -474,6 +474,7 @@ impl Serialize for TaskConfig { parcel.write(&file_spec.mime_type)?; parcel.write(&file_spec.is_user_file)?; if file_spec.is_user_file { + // Safety: If is user file, the `fd` must be some. let file = unsafe { File::from_raw_fd(file_spec.fd.unwrap()) }; parcel.write_file(file)?; } diff --git a/services/src/task/download.rs b/services/src/task/download.rs index e2c452ff5e1c45f111d6e63bc00da714329d4594..40bb6efc64f882e5ab6ff26dc312b4e03207a047 100644 --- a/services/src/task/download.rs +++ b/services/src/task/download.rs @@ -105,15 +105,19 @@ pub(crate) async fn download(task: Arc, abort_flag: Arc impl RequestTask { async fn prepare_download(&self) -> Result<(), TaskError> { - let file = self.files.get(0).unwrap(); - task_control::file_seek(file.clone(), SeekFrom::End(0)).await?; - let downloaded = task_control::file_metadata(file).await?.len() as usize; + if let Some(file) = self.files.get(0) { + task_control::file_seek(file.clone(), SeekFrom::End(0)).await?; + let downloaded = task_control::file_metadata(file).await?.len() as usize; - let mut progress = self.progress.lock().unwrap(); - progress.common_data.index = 0; - progress.common_data.total_processed = downloaded; - progress.common_data.state = State::Running.repr; - progress.processed = vec![downloaded]; + let mut progress = self.progress.lock().unwrap(); + progress.common_data.index = 0; + progress.common_data.total_processed = downloaded; + progress.common_data.state = State::Running.repr; + progress.processed = vec![downloaded]; + } else { + error!("prepare_download err, no file in the task"); + return Err(TaskError::Failed(Reason::OthersError)); + } Ok(()) } } @@ -166,17 +170,20 @@ pub(crate) async fn download_inner( info!("task {} server not support range", task.task_id()); return Err(TaskError::Failed(Reason::UnsupportedRangeRequest)); } - let file = task.files.get(0).unwrap(); - - let has_downloaded = task_control::file_metadata(file).await?.len() > 0; - if has_downloaded { - error!("task {} file not cleared", task.task_id()); - sys_event!( - ExecFault, - DfxCode::TASK_FAULT_09, - &format!("task {} file not cleared", task.task_id()) - ); - task_control::clear_downloaded_file(task.clone()).await?; + if let Some(file) = task.files.get(0) { + let has_downloaded = task_control::file_metadata(file).await?.len() > 0; + if has_downloaded { + error!("task {} file not cleared", task.task_id()); + sys_event!( + ExecFault, + DfxCode::TASK_FAULT_09, + &format!("task {} file not cleared", task.task_id()) + ); + task_control::clear_downloaded_file(task.clone()).await?; + } + } else { + error!("download_inner err, no file in the `task`"); + return Err(TaskError::Failed(Reason::OthersError)); } } } diff --git a/services/src/task/operator.rs b/services/src/task/operator.rs index f6765251032ade7210b3d28d73487b681908a4e3..2d6d708372f72347b0c4f7eb3abbfab909574850 100644 --- a/services/src/task/operator.rs +++ b/services/src/task/operator.rs @@ -97,7 +97,12 @@ impl TaskOperator { data: &[u8], skip_size: usize, ) -> Poll> { - let file_mutex = self.task.files.get(0).unwrap(); + let file_mutex = if let Some(mutex) = self.task.files.get(0) { + mutex + } else { + error!("poll_write_file err, no file in the `task`"); + return Poll::Ready(Err(HttpClientError::other("error msg"))); + }; let mut file = file_mutex.lock().unwrap(); if self.abort_flag.load(Ordering::Acquire) { diff --git a/services/src/task/request_task.rs b/services/src/task/request_task.rs index 6bf22b9f7065b94fc1507651d81ea1c62b0a8349..129e6d2669d13bd709c86926b4081891505bcc3d 100644 --- a/services/src/task/request_task.rs +++ b/services/src/task/request_task.rs @@ -340,7 +340,12 @@ impl RequestTask { ) -> Result { let mut request_builder = task.build_request_builder()?; - let file = task.files.get(0).unwrap(); + let file = if let Some(mutex) = task.files.get(0) { + mutex + } else { + error!("build_download_request err, no file in the `task`"); + return Err(TaskError::Failed(Reason::OthersError)); + }; let has_downloaded = task_control::file_metadata(file).await?.len(); let resume_download = has_downloaded > 0; diff --git a/services/src/task/task_control.rs b/services/src/task/task_control.rs index d634f940eb9c5c08cf5c5a78739f3cf82c07c9ab..3992f66c6f18da9822778891d080bbb443c52c83 100644 --- a/services/src/task/task_control.rs +++ b/services/src/task/task_control.rs @@ -92,7 +92,15 @@ pub(crate) async fn clear_downloaded_file(task: Arc) -> Result<(), info!("task {} clear downloaded file", task.task_id()); runtime_spawn_blocking(move || { { - let file_mutex = task.files.get(0).unwrap(); + let file_mutex = if let Some(mutex) = task.files.get(0) { + mutex + } else { + error!("clear_downloaded_file err, 1no file in the `task`"); + return Err(io::Error::new(io::ErrorKind::Other, + "clear_downloaded_file err, 1no file in the `task`" + )); + }; + let mut file = file_mutex.lock().unwrap(); file.set_len(0)?; file.seek(SeekFrom::Start(0))?;