tdb2: add an internal TDB_CANT_CHECK flag.
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 30 Nov 2011 00:42:22 +0000 (11:12 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 30 Nov 2011 00:42:22 +0000 (11:12 +1030)
This will be used shortly to indicate that a TDB2 file indicates it
cannot be checked.

ccan/tdb2/check.c
ccan/tdb2/tdb2.h

index 3003b626161122f59d6721c3133193b1d2ea203e..230eaee8e367d7d13045f4fcdc68101a10d20c40 100644 (file)
@@ -782,6 +782,12 @@ enum TDB_ERROR tdb_check_(struct tdb_context *tdb,
        uint64_t features;
        enum TDB_ERROR ecode;
 
        uint64_t features;
        enum TDB_ERROR ecode;
 
+       if (tdb->flags & TDB_CANT_CHECK) {
+               return tdb_logerr(tdb, TDB_SUCCESS, TDB_LOG_WARNING,
+                                 "tdb_check: database has unknown features,"
+                                 " cannot check.");
+       }
+
        if (tdb->flags & TDB_VERSION1) {
                if (tdb1_check(tdb, check, data) == -1)
                        return tdb->last_error;
        if (tdb->flags & TDB_VERSION1) {
                if (tdb1_check(tdb, check, data) == -1)
                        return tdb->last_error;
index 525fbd71758c5c0632c101729dce761295b3cb66..3fa99b15dbb6cab3d09162b3789efd5b8501e875 100644 (file)
@@ -87,6 +87,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
 #define TDB_ALLOW_NESTING   256 /* fake nested transactions */
 #define TDB_RDONLY   512 /* implied by O_RDONLY */
 #define TDB_VERSION1  1024 /* create/open an old style TDB */
 #define TDB_ALLOW_NESTING   256 /* fake nested transactions */
 #define TDB_RDONLY   512 /* implied by O_RDONLY */
 #define TDB_VERSION1  1024 /* create/open an old style TDB */
+#define TDB_CANT_CHECK  2048 /* has a feature which we don't understand */
 
 /**
  * tdb1_incompatible_hash - better (Jenkins) hash for tdb1
 
 /**
  * tdb1_incompatible_hash - better (Jenkins) hash for tdb1
@@ -538,6 +539,11 @@ enum TDB_ERROR tdb_repack(struct tdb_context *tdb);
  * checks as well.  If check() returns an error, that is returned from
  * tdb_check().
  *
  * checks as well.  If check() returns an error, that is returned from
  * tdb_check().
  *
+ * Note that the TDB uses a feature which we don't understand which
+ * indicates we can't run tdb_check(), this will log a warning to that
+ * effect and return TDB_SUCCESS.  You can detect this condition by
+ * looking for TDB_CANT_CHECK in tdb_get_flags().
+ *
  * Returns TDB_SUCCESS or an error.
  */
 #define tdb_check(tdb, check, data)                                    \
  * Returns TDB_SUCCESS or an error.
  */
 #define tdb_check(tdb, check, data)                                    \