Skip to content

Commit 43febe1

Browse files
committed
TSDB: format only sectors that failed check (the same way as KVDB)
1 parent b1043ed commit 43febe1

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

src/fdb_tsdb.c

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
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

107109
struct 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

Comments
 (0)