You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/03/29 02:40:59 UTC
[14/15] incubator-mynewt-core git commit: Recover if reset while
oldest sector is being compressed.
Recover if reset while oldest sector is being compressed.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/3de16002
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/3de16002
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/3de16002
Branch: refs/heads/develop
Commit: 3de160020efe3d0c2b46f7b01b444f9fec96cfad
Parents: a4b302a
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Mon Mar 28 17:35:25 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Mar 28 17:37:31 2016 -0700
----------------------------------------------------------------------
sys/config/src/config_fcb.c | 21 ++++++++--
sys/config/src/test/conf_test.c | 79 ++++++++++++++++++++++++++++++++----
2 files changed, 88 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3de16002/sys/config/src/config_fcb.c
----------------------------------------------------------------------
diff --git a/sys/config/src/config_fcb.c b/sys/config/src/config_fcb.c
index 58e2e1d..9c6b074 100644
--- a/sys/config/src/config_fcb.c
+++ b/sys/config/src/config_fcb.c
@@ -55,10 +55,25 @@ conf_fcb_src(struct conf_fcb *cf)
cf->cf_fcb.f_magic = CONF_FCB_MAGIC;
cf->cf_fcb.f_version = CONF_FCB_VERS;
cf->cf_fcb.f_scratch_cnt = 1;
- rc = fcb_init(&cf->cf_fcb);
- if (rc) {
- return OS_INVALID_PARM;
+
+ while (1) {
+ rc = fcb_init(&cf->cf_fcb);
+ if (rc) {
+ return OS_INVALID_PARM;
+ }
+
+ /*
+ * Check if system was reset in middle of emptying a sector. This
+ * situation is recognized by checking if the scratch block is missing.
+ */
+ if (fcb_free_sector_cnt(&cf->cf_fcb) < 1) {
+ flash_area_erase(cf->cf_fcb.f_active.fe_area, 0,
+ cf->cf_fcb.f_active.fe_area->fa_size);
+ } else {
+ break;
+ }
}
+
cf->cf_store.cs_itf = &conf_fcb_itf;
conf_src_register(&cf->cf_store);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3de16002/sys/config/src/test/conf_test.c
----------------------------------------------------------------------
diff --git a/sys/config/src/test/conf_test.c b/sys/config/src/test/conf_test.c
index 9f6f42e..3f6c5aa 100644
--- a/sys/config/src/test/conf_test.c
+++ b/sys/config/src/test/conf_test.c
@@ -584,8 +584,6 @@ TEST_CASE(config_test_empty_fcb)
config_wipe_srcs();
config_wipe_fcb(fcb_areas, sizeof(fcb_areas) / sizeof(fcb_areas[0]));
- cf.cf_fcb.f_magic = 0x31313131;
- cf.cf_fcb.f_version = 1;
cf.cf_fcb.f_sectors = fcb_areas;
cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
@@ -608,8 +606,6 @@ TEST_CASE(config_test_save_1_fcb)
config_wipe_srcs();
- cf.cf_fcb.f_magic = 0x31313131;
- cf.cf_fcb.f_version = 1;
cf.cf_fcb.f_sectors = fcb_areas;
cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
@@ -652,8 +648,6 @@ TEST_CASE(config_test_save_2_fcb)
config_wipe_srcs();
- cf.cf_fcb.f_magic = 0x31313131;
- cf.cf_fcb.f_version = 1;
cf.cf_fcb.f_sectors = fcb_areas;
cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
@@ -719,10 +713,8 @@ TEST_CASE(config_test_save_3_fcb)
config_wipe_srcs();
config_wipe_fcb(fcb_areas, sizeof(fcb_areas) / sizeof(fcb_areas[0]));
- cf.cf_fcb.f_magic = 0x31313131;
- cf.cf_fcb.f_version = 1;
cf.cf_fcb.f_sectors = fcb_areas;
- cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
+ cf.cf_fcb.f_sector_cnt = 4;
rc = conf_fcb_src(&cf);
TEST_ASSERT(rc == 0);
@@ -744,6 +736,73 @@ TEST_CASE(config_test_save_3_fcb)
}
}
+TEST_CASE(config_test_compress_reset)
+{
+ int rc;
+ struct conf_fcb cf;
+ struct flash_area *fa;
+ char test_value[64][CONF_MAX_VAL_LEN];
+ int elems[4];
+ int i;
+
+ config_wipe_srcs();
+ config_wipe_fcb(fcb_areas, sizeof(fcb_areas) / sizeof(fcb_areas[0]));
+
+ cf.cf_fcb.f_sectors = fcb_areas;
+ cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
+
+ rc = conf_fcb_src(&cf);
+ TEST_ASSERT(rc == 0);
+
+ rc = conf_fcb_dst(&cf);
+ TEST_ASSERT(rc == 0);
+
+ c2_var_count = 1;
+ memset(elems, 0, sizeof(elems));
+
+ for (i = 0; ; i++) {
+ config_test_fill_area(test_value, i);
+ memcpy(val_string, test_value, sizeof(val_string));
+
+ rc = conf_save();
+ TEST_ASSERT(rc == 0);
+
+ if (cf.cf_fcb.f_active.fe_area == &fcb_areas[2]) {
+ /*
+ * Started using space just before scratch.
+ */
+ break;
+ }
+ memset(val_string, 0, sizeof(val_string));
+
+ rc = conf_load();
+ TEST_ASSERT(rc == 0);
+ TEST_ASSERT(!memcmp(val_string, test_value, CONF_MAX_VAL_LEN));
+ }
+
+ fa = cf.cf_fcb.f_active.fe_area;
+ rc = fcb_append_to_scratch(&cf.cf_fcb);
+ TEST_ASSERT(rc == 0);
+ TEST_ASSERT(fcb_free_sector_cnt(&cf.cf_fcb) == 0);
+ TEST_ASSERT(fa != cf.cf_fcb.f_active.fe_area);
+
+ config_wipe_srcs();
+
+ memset(&cf, 0, sizeof(cf));
+
+ cf.cf_fcb.f_sectors = fcb_areas;
+ cf.cf_fcb.f_sector_cnt = sizeof(fcb_areas) / sizeof(fcb_areas[0]);
+
+ rc = conf_fcb_src(&cf);
+ TEST_ASSERT(rc == 0);
+
+ rc = conf_fcb_dst(&cf);
+ TEST_ASSERT(rc == 0);
+
+ TEST_ASSERT(fcb_free_sector_cnt(&cf.cf_fcb) == 1);
+ TEST_ASSERT(fa == cf.cf_fcb.f_active.fe_area);
+}
+
TEST_SUITE(config_test_all)
{
config_empty_lookups();
@@ -768,5 +827,7 @@ TEST_SUITE(config_test_all)
config_test_insert3();
config_test_save_3_fcb();
+
+ config_test_compress_reset();
}