diff --git a/hisysevent.yaml b/hisysevent.yaml index c59ebc41d2106651741f3365aee349eb8de81d17..576ee797c1e938db28ece8ccef7da1aabc303958 100644 --- a/hisysevent.yaml +++ b/hisysevent.yaml @@ -171,3 +171,8 @@ ACCESSTOKEN_EXCEPTION: ERROR_CODE: {type: INT32, desc: error code} ERROR_MSG: {type: STRING, desc: error reason} +ACCESSTOKEN_DATABASE_EXCEPTION: + __BASE: {type: FAULT, level: CRITICAL, desc: accesstoken database exception} + SCENE_CODE: {type: INT32, desc: scene code} + ERROR_CODE: {type: INT32, desc: error code} + TABLE_NAME: {type: STRING, desc: table name} diff --git a/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h b/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h index 4e58271b2ef401406d100d6b524150554ee53069..f3882ca11a4c053187d9b975bca26f0602d3576d 100644 --- a/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h +++ b/services/accesstokenmanager/main/cpp/include/dfx/hisysevent_adapter.h @@ -39,6 +39,23 @@ enum CommonSceneCode { AT_COMMOM_START = 0, AT_COMMON_FINISH = 1, }; +enum AccessTokenDbSceneCode { + AT_DB_INSERT_RESTORE = 1001, + AT_DB_INSERT_RESTORE_FAILED = 1002, + AT_DB_INSERT_FAILED = 1003, + AT_DB_DELETE_RESTORE = 2001, + AT_DB_DELETE_RESTORE_FAILED = 2002, + AT_DB_DELETE_FAILED = 2003, + AT_DB_UPDATE_RESTORE = 3001, + AT_DB_UPDATE_RESTORE_FAILED = 3002, + AT_DB_UPDATE_FAILED = 3003, + AT_DB_QUERY_RESTORE = 4001, + AT_DB_QUERY_RESTORE_FAILED = 4002, + AT_DB_QUERY_FAILED = 4003, + AT_DB_COMMIT_RESTORE = 5001, + AT_DB_COMMIT_RESTORE_FAILED = 5002, + AT_DB_COMMIT_FAILED = 5003, +}; enum AddHapSceneCode { INSTALL_START = 0, TOKEN_ID_CHANGE, @@ -74,6 +91,7 @@ void ReportSysEventServiceStart(const AccessTokenDfxInfo& info); void ReportSysEventServiceStartError(SceneCode scene, const std::string& errMsg, int32_t errCode); void ReportSysCommonEventError(int32_t ipcCode, int32_t errCode); void ReportSysEventAddHap(const AccessTokenDfxInfo& info); +void ReportSysEventDbException(AccessTokenDbSceneCode scene, int32_t errCode, const std::string& tableName); } // namespace AccessToken } // namespace Security diff --git a/services/accesstokenmanager/main/cpp/src/database/access_token_db.cpp b/services/accesstokenmanager/main/cpp/src/database/access_token_db.cpp index b7c17073d5eb5b686e2f26e42522edc988e3f3ae..6328d2374cf6606571a2915c1d80701d6a3e306c 100644 --- a/services/accesstokenmanager/main/cpp/src/database/access_token_db.cpp +++ b/services/accesstokenmanager/main/cpp/src/database/access_token_db.cpp @@ -22,6 +22,7 @@ #include "accesstoken_common_log.h" #include "access_token_error.h" #include "access_token_open_callback.h" +#include "hisysevent_adapter.h" #include "rdb_helper.h" #include "time_util.h" #include "token_field_const.h" @@ -65,15 +66,17 @@ int32_t AccessTokenDb::RestoreAndInsertIfCorrupt(const int32_t resultCode, int64 LOGW(ATM_DOMAIN, ATM_TAG, "Detech database corrupt, restore from backup!"); int32_t res = db->Restore(""); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + LOGC(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_INSERT_RESTORE_FAILED, res, tableName); return res; } LOGI(ATM_DOMAIN, ATM_TAG, "Database restore success, try insert again!"); res = db->BatchInsert(outInsertNum, tableName, buckets); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Failed to batch insert into table %{public}s again, res is %{public}d.", + LOGC(ATM_DOMAIN, ATM_TAG, "Failed to batch insert into table %{public}s again, res is %{public}d.", tableName.c_str(), res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_INSERT_FAILED, res, tableName); return res; } @@ -123,7 +126,7 @@ int32_t AccessTokenDb::AddValues(const AtmDataType type, const std::vector db = GetRdb(); if (db == nullptr) { - LOGE(ATM_DOMAIN, ATM_TAG, "db is nullptr."); + LOGC(ATM_DOMAIN, ATM_TAG, "db is nullptr."); return AccessTokenError::ERR_DATABASE_OPERATE_FAILED; } @@ -136,13 +139,14 @@ int32_t AccessTokenDb::AddValues(const AtmDataType type, const std::vectorRestore(""); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + LOGC(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_DELETE_RESTORE_FAILED, res, predicates.GetTableName()); return res; } LOGI(ATM_DOMAIN, ATM_TAG, "Database restore success, try delete again!"); res = db->Delete(deletedRows, predicates); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Failed to delete record from table %{public}s again, res is %{public}d.", + LOGC(ATM_DOMAIN, ATM_TAG, "Failed to delete record from table %{public}s again, res is %{public}d.", predicates.GetTableName().c_str(), res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_DELETE_FAILED, res, predicates.GetTableName()); return res; } @@ -188,7 +194,7 @@ int32_t AccessTokenDb::RemoveValues(const AtmDataType type, const GenericValues& std::shared_ptr db = GetRdb(); if (db == nullptr) { - LOGE(ATM_DOMAIN, ATM_TAG, "db is nullptr."); + LOGC(ATM_DOMAIN, ATM_TAG, "db is nullptr."); return AccessTokenError::ERR_DATABASE_OPERATE_FAILED; } @@ -200,6 +206,7 @@ int32_t AccessTokenDb::RemoveValues(const AtmDataType type, const GenericValues& if (res != NativeRdb::E_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "Failed to delete record from table %{public}s, res is %{public}d.", tableName.c_str(), res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_DELETE_RESTORE, res, tableName); int32_t result = RestoreAndDeleteIfCorrupt(res, deletedRows, predicates, db); if (result != NativeRdb::E_OK) { return result; @@ -222,15 +229,17 @@ int32_t AccessTokenDb::RestoreAndUpdateIfCorrupt(const int32_t resultCode, int32 LOGW(ATM_DOMAIN, ATM_TAG, "Detech database corrupt, restore from backup!"); int32_t res = db->Restore(""); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + LOGC(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_UPDATE_RESTORE_FAILED, res, predicates.GetTableName()); return res; } LOGI(ATM_DOMAIN, ATM_TAG, "Database restore success, try update again!"); res = db->Update(changedRows, bucket, predicates); if (res != NativeRdb::E_OK) { - LOGE(ATM_DOMAIN, ATM_TAG, "Failed to update record from table %{public}s again, res is %{public}d.", + LOGC(ATM_DOMAIN, ATM_TAG, "Failed to update record from table %{public}s again, res is %{public}d.", predicates.GetTableName().c_str(), res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_UPDATE_FAILED, res, predicates.GetTableName()); return res; } @@ -272,6 +281,7 @@ int32_t AccessTokenDb::Modify(const AtmDataType type, const GenericValues& modif if (res != NativeRdb::E_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "Failed to update record from table %{public}s, res is %{public}d.", tableName.c_str(), res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_UPDATE_RESTORE, res, tableName); int32_t result = RestoreAndUpdateIfCorrupt(res, changedRows, bucket, predicates, db); if (result != NativeRdb::E_OK) { LOGC(ATM_DOMAIN, ATM_TAG, "Failed to restore and update, result is %{public}d.", result); @@ -299,9 +309,12 @@ int32_t AccessTokenDb::RestoreAndQueryIfCorrupt(const NativeRdb::RdbPredicates& queryResultSet = nullptr; LOGW(ATM_DOMAIN, ATM_TAG, "Detech database corrupt, restore from backup!"); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_QUERY_RESTORE, res, predicates.GetTableName()); res = db->Restore(""); if (res != NativeRdb::E_OK) { LOGC(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + ReportSysEventDbException( + AccessTokenDbSceneCode::AT_DB_QUERY_RESTORE_FAILED, res, predicates.GetTableName()); return res; } LOGI(ATM_DOMAIN, ATM_TAG, "Database restore success, try query again!"); @@ -310,6 +323,8 @@ int32_t AccessTokenDb::RestoreAndQueryIfCorrupt(const NativeRdb::RdbPredicates& if (queryResultSet == nullptr) { LOGC(ATM_DOMAIN, ATM_TAG, "Failed to find records from table %{public}s again.", predicates.GetTableName().c_str()); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_QUERY_FAILED, + AccessTokenError::ERR_DATABASE_OPERATE_FAILED, predicates.GetTableName()); return AccessTokenError::ERR_DATABASE_OPERATE_FAILED; } } else { @@ -348,6 +363,8 @@ int32_t AccessTokenDb::Find(AtmDataType type, const GenericValues& conditionValu if (queryResultSet == nullptr) { LOGC(ATM_DOMAIN, ATM_TAG, "Failed to find records from table %{public}s.", tableName.c_str()); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_QUERY_FAILED, + AccessTokenError::ERR_DATABASE_OPERATE_FAILED, tableName); return AccessTokenError::ERR_DATABASE_OPERATE_FAILED; } @@ -387,6 +404,7 @@ int32_t AccessTokenDb::RestoreAndCommitIfCorrupt(const int32_t resultCode, int32_t res = db->Restore(""); if (res != NativeRdb::E_OK) { LOGC(ATM_DOMAIN, ATM_TAG, "Db restore failed, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_COMMIT_RESTORE_FAILED, res, ""); return res; } LOGI(ATM_DOMAIN, ATM_TAG, "Database restore success, try commit again!"); @@ -394,6 +412,7 @@ int32_t AccessTokenDb::RestoreAndCommitIfCorrupt(const int32_t resultCode, res = db->Commit(); if (res != NativeRdb::E_OK) { LOGC(ATM_DOMAIN, ATM_TAG, "Failed to Commit again, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_COMMIT_FAILED, res, ""); return res; } @@ -440,6 +459,7 @@ int32_t AccessTokenDb::DeleteAndInsertValues( res = db->Commit(); if (res != NativeRdb::E_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "Failed to commit, res is %{public}d.", res); + ReportSysEventDbException(AccessTokenDbSceneCode::AT_DB_COMMIT_RESTORE, res, ""); int32_t result = RestoreAndCommitIfCorrupt(res, db); if (result != NativeRdb::E_OK) { LOGC(ATM_DOMAIN, ATM_TAG, "Failed to restore and commit, result is %{public}d.", result); diff --git a/services/accesstokenmanager/main/cpp/src/dfx/hisysevent_adapter.cpp b/services/accesstokenmanager/main/cpp/src/dfx/hisysevent_adapter.cpp index f13756be48d35cc2d04d19dd1e8505f798554d21..0d241cd89208810078f1998bf1a22fe798b9f347 100644 --- a/services/accesstokenmanager/main/cpp/src/dfx/hisysevent_adapter.cpp +++ b/services/accesstokenmanager/main/cpp/src/dfx/hisysevent_adapter.cpp @@ -95,6 +95,12 @@ void ReportSysEventAddHap(const AccessTokenDfxInfo& info) LOGE(ATM_DOMAIN, ATM_TAG, "Failed to write hisysevent write, ret %{public}d.", res); } } + +void ReportSysEventDbException(AccessTokenDbSceneCode scene, int32_t errCode, const std::string& tableName) +{ + HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::ACCESS_TOKEN, "ACCESSTOKEN_DATABASE_EXCEPTION", + HiviewDFX::HiSysEvent::EventType::FAULT, "SCENE_CODE", scene, "ERROR_CODE", errCode, "TABLE_NAME", tableName); +} } // namespace AccessToken } // namespace Security } // namespace OHOS \ No newline at end of file diff --git a/services/common/database/test/BUILD.gn b/services/common/database/test/BUILD.gn index 97ec48ce56dc93096295c3bf0bb0661d84dabbfd..dbba5667e0b4c8c3c362ddb99cda76224d9724c6 100644 --- a/services/common/database/test/BUILD.gn +++ b/services/common/database/test/BUILD.gn @@ -32,6 +32,7 @@ ohos_unittest("libdatabase_test") { "${access_token_path}/services/common/utils/include", "${access_token_path}/services/accesstokenmanager/main/cpp/include/callback", "${access_token_path}/services/accesstokenmanager/main/cpp/include/database", + "${access_token_path}/services/accesstokenmanager/main/cpp/include/dfx", "${access_token_path}/services/accesstokenmanager/main/cpp/include/permission", "${access_token_path}/services/accesstokenmanager/main/cpp/include/token", ] @@ -43,6 +44,7 @@ ohos_unittest("libdatabase_test") { "${access_token_path}/services/accesstokenmanager/main/cpp/src/database/access_token_open_callback.cpp", "${access_token_path}/services/accesstokenmanager/main/cpp/src/database/data_translator.cpp", "${access_token_path}/services/accesstokenmanager/main/cpp/src/database/token_field_const.cpp", + "${access_token_path}/services/accesstokenmanager/main/cpp/src/dfx/hisysevent_adapter.cpp", "${access_token_path}/services/accesstokenmanager/main/cpp/src/permission/permission_validator.cpp", "unittest/database_test.cpp", ]