5555#define db_max_size (db ) (((fdb_db_t)db)->max_size)
5656#define db_oldest_addr (db ) (((fdb_db_t)db)->oldest_addr)
5757
58+ #define SECTOR_NUM (db_max_size(db) / db_sec_size(db))
59+
5860#define db_lock (db ) \
5961 do { \
6062 if (((fdb_db_t)db)->lock) ((fdb_db_t)db)->lock((fdb_db_t)db); \
@@ -106,7 +108,7 @@ struct query_count_args {
106108
107109struct check_sec_hdr_cb_args {
108110 fdb_tsdb_t db ;
109- bool check_failed ;
111+ size_t failed_count ;
110112 size_t empty_num ;
111113 uint32_t empty_addr ;
112114};
@@ -776,15 +778,25 @@ static bool check_sec_hdr_cb(tsdb_sec_info_t sector, void *arg1, void *arg2)
776778
777779 if (!sector -> check_ok ) {
778780 FDB_INFO ("Sector (0x%08" PRIX32 ") header info is incorrect.\n" , sector -> addr );
779- (arg -> check_failed ) = true;
780- return true;
781+ arg -> failed_count ++ ;
782+ if (db -> parent .not_formatable ) {
783+ return true;
784+ } else {
785+ FDB_DEBUG ("Sector header info is incorrect. Auto format this sector (0x%08" PRIX32 ").\n" , sector -> addr );
786+ format_sector (db , sector -> addr );
787+ }
781788 } else if (sector -> status == FDB_SECTOR_STORE_USING ) {
782789 if (db -> cur_sec .addr == FDB_DATA_UNUSED ) {
783790 memcpy (& db -> cur_sec , sector , sizeof (struct tsdb_sec_info ));
784791 } else {
785792 FDB_INFO ("Warning: Sector status is wrong, there are multiple sectors in use.\n" );
786- (arg -> check_failed ) = true;
787- return true;
793+ arg -> failed_count ++ ;
794+ if (db -> parent .not_formatable ) {
795+ return true;
796+ } else {
797+ FDB_DEBUG ("Sector header info is incorrect. Auto format this sector (0x%08" PRIX32 ").\n" , sector -> addr );
798+ format_sector (db , sector -> addr );
799+ }
788800 }
789801 } else if (sector -> status == FDB_SECTOR_STORE_EMPTY ) {
790802 (arg -> empty_num ) += 1 ;
@@ -925,7 +937,7 @@ fdb_err_t fdb_tsdb_init(fdb_tsdb_t db, const char *name, const char *path, fdb_g
925937{
926938 fdb_err_t result = FDB_NO_ERR ;
927939 struct tsdb_sec_info sector ;
928- struct check_sec_hdr_cb_args check_sec_arg = { db , false , 0 , 0 };
940+ struct check_sec_hdr_cb_args check_sec_arg = { db , 0 , 0 , 0 };
929941
930942 FDB_ASSERT (get_time );
931943
@@ -948,16 +960,19 @@ fdb_err_t fdb_tsdb_init(fdb_tsdb_t db, const char *name, const char *path, fdb_g
948960
949961 /* check all sector header */
950962 sector .addr = 0 ;
963+
964+ /* check all sector header */
951965 sector_iterator (db , & sector , FDB_SECTOR_STORE_UNUSED , & check_sec_arg , NULL , check_sec_hdr_cb , true);
952- /* format all sector when check failed */
953- if (check_sec_arg .check_failed ) {
954- if (db -> parent .not_formatable ) {
955- result = FDB_READ_ERR ;
956- goto __exit ;
957- } else {
958- tsl_format_all (db );
959- }
960- } else {
966+ if (db -> parent .not_formatable && check_sec_arg .failed_count > 0 ) {
967+ result = FDB_READ_ERR ;
968+ goto __exit ;
969+ }
970+ /* all sector header check failed */
971+ if (check_sec_arg .failed_count == SECTOR_NUM ) {
972+ FDB_INFO ("All sector header is incorrect. Set it to default.\n" );
973+ tsl_format_all (db );
974+ }
975+
961976 uint32_t latest_addr ;
962977 if (check_sec_arg .empty_num > 0 ) {
963978 latest_addr = check_sec_arg .empty_addr ;
@@ -976,7 +991,7 @@ fdb_err_t fdb_tsdb_init(fdb_tsdb_t db, const char *name, const char *path, fdb_g
976991 } else {
977992 db_oldest_addr (db ) = latest_addr + db_sec_size (db );
978993 }
979- }
994+
980995 FDB_DEBUG ("TSDB (%s) oldest sectors is 0x%08" PRIX32 ", current using sector is 0x%08" PRIX32 ".\n" , db_name (db ), db_oldest_addr (db ),
981996 db -> cur_sec .addr );
982997 /* read the current using sector info */
0 commit comments