[Groonga-commit] groonga/groonga at a7d2026 [master] grndb recover: clear dirty flag in database

Back to archive index

Kouhei Sutou null+****@clear*****
Thu Oct 27 11:56:44 JST 2016


Kouhei Sutou	2016-10-27 11:56:44 +0900 (Thu, 27 Oct 2016)

  New Revision: a7d20262ac78a37bb91fa86a1258c60b4cbf3399
  https://github.com/groonga/groonga/commit/a7d20262ac78a37bb91fa86a1258c60b4cbf3399

  Message:
    grndb recover: clear dirty flag in database

  Modified files:
    lib/dat.cpp
    lib/db.c
    lib/grn_dat.h
    lib/grn_pat.h
    lib/pat.c

  Modified: lib/dat.cpp (+19 -0)
===================================================================
--- lib/dat.cpp    2016-10-27 11:56:19 +0900 (b815e74)
+++ lib/dat.cpp    2016-10-27 11:56:44 +0900 (ce33a60)
@@ -1205,4 +1205,23 @@ grn_dat_clean(grn_ctx *ctx, grn_dat *dat)
   return rc;
 }
 
+grn_rc
+grn_dat_clear_dirty(grn_ctx *ctx, grn_dat *dat)
+{
+  grn_rc rc = GRN_SUCCESS;
+
+  if (!dat->io) {
+    return rc;
+  }
+
+  {
+    CriticalSection critical_section(&dat->lock);
+    dat->is_dirty = GRN_FALSE;
+    dat->header->n_dirty_opens = 0;
+    rc = grn_io_flush(ctx, dat->io);
+  }
+
+  return rc;
+}
+
 }  // extern "C"

  Modified: lib/db.c (+21 -0)
===================================================================
--- lib/db.c    2016-10-27 11:56:19 +0900 (8a6054d)
+++ lib/db.c    2016-10-27 11:56:44 +0900 (3c47a9e)
@@ -754,6 +754,26 @@ grn_db_clean(grn_ctx *ctx, grn_obj *db)
   }
 }
 
+static grn_rc
+grn_db_clear_dirty(grn_ctx *ctx, grn_obj *db)
+{
+  grn_obj *keys;
+
+  if (!db) {
+    return GRN_SUCCESS;
+  }
+
+  keys = ((grn_db *)db)->keys;
+  switch (keys->header.type) {
+  case GRN_TABLE_PAT_KEY :
+    return grn_pat_clear_dirty(ctx, (grn_pat *)keys);
+  case GRN_TABLE_DAT_KEY :
+    return grn_dat_clear_dirty(ctx, (grn_dat *)keys);
+  default :
+    return GRN_SUCCESS;
+  }
+}
+
 void
 grn_db_touch(grn_ctx *ctx, grn_obj *s)
 {
@@ -14601,6 +14621,7 @@ static void
 grn_db_recover_database(grn_ctx *ctx, grn_obj *db)
 {
   if (!grn_obj_is_locked(ctx, db)) {
+    grn_db_clear_dirty(ctx, db);
     return;
   }
 

  Modified: lib/grn_dat.h (+1 -0)
===================================================================
--- lib/grn_dat.h    2016-10-27 11:56:19 +0900 (337c251)
+++ lib/grn_dat.h    2016-10-27 11:56:44 +0900 (02ce093)
@@ -84,6 +84,7 @@ GRN_API grn_rc grn_dat_flush(grn_ctx *ctx, grn_dat *dat);
 grn_rc grn_dat_dirty(grn_ctx *ctx, grn_dat *dat);
 grn_bool grn_dat_is_dirty(grn_ctx *ctx, grn_dat *dat);
 grn_rc grn_dat_clean(grn_ctx *ctx, grn_dat *dat);
+grn_rc grn_dat_clear_dirty(grn_ctx *ctx, grn_dat *dat);
 
 #ifdef __cplusplus
 }

  Modified: lib/grn_pat.h (+1 -0)
===================================================================
--- lib/grn_pat.h    2016-10-27 11:56:19 +0900 (46ee2c9)
+++ lib/grn_pat.h    2016-10-27 11:56:44 +0900 (69a5d0c)
@@ -122,6 +122,7 @@ grn_bool grn_pat_is_key_encoded(grn_ctx *ctx, grn_pat *pat);
 grn_rc grn_pat_dirty(grn_ctx *ctx, grn_pat *pat);
 grn_bool grn_pat_is_dirty(grn_ctx *ctx, grn_pat *pat);
 grn_rc grn_pat_clean(grn_ctx *ctx, grn_pat *pat);
+grn_rc grn_pat_clear_dirty(grn_ctx *ctx, grn_pat *pat);
 
 #ifdef __cplusplus
 }

  Modified: lib/pat.c (+14 -0)
===================================================================
--- lib/pat.c    2016-10-27 11:56:19 +0900 (4e1de66)
+++ lib/pat.c    2016-10-27 11:56:44 +0900 (c6972ae)
@@ -3629,3 +3629,17 @@ grn_pat_clean(grn_ctx *ctx, grn_pat *pat)
 
   return rc;
 }
+
+grn_rc
+grn_pat_clear_dirty(grn_ctx *ctx, grn_pat *pat)
+{
+  grn_rc rc = GRN_SUCCESS;
+
+  CRITICAL_SECTION_ENTER(pat->lock);
+  pat->is_dirty = GRN_FALSE;
+  pat->header->n_dirty_opens = 0;
+  rc = grn_io_flush(ctx, pat->io);
+  CRITICAL_SECTION_LEAVE(pat->lock);
+
+  return rc;
+}
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index