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();
 }