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