null+****@clear*****
null+****@clear*****
2011年 11月 16日 (水) 17:58:19 JST
Susumu Yata 2011-11-16 08:58:19 +0000 (Wed, 16 Nov 2011) New Revision: 2d6751e2cb04e7862c39a7bfc5e14f3189764ba3 Log: fixed a bug that an in-memory grn_dat fails to expand. Modified files: lib/dat.cpp Modified: lib/dat.cpp (+29 -8) =================================================================== --- lib/dat.cpp 2011-11-16 02:41:05 +0000 (175caec) +++ lib/dat.cpp 2011-11-16 08:58:19 +0000 (d7bc702) @@ -146,6 +146,7 @@ grn_dat_open_trie_if_needed(grn_ctx *ctx, grn_dat *dat) } CriticalSection critical_section(&dat->lock); + if (dat->trie && (file_id <= dat->file_id)) { // There is no need to open file if the new file has been opened by another thread. return true; @@ -173,6 +174,7 @@ grn_dat_open_trie_if_needed(grn_ctx *ctx, grn_dat *dat) dat->old_trie = trie; dat->trie = new_trie; dat->file_id = file_id; + critical_section.leave(); delete old_trie; @@ -184,19 +186,38 @@ grn_dat_open_trie_if_needed(grn_ctx *ctx, grn_dat *dat) } bool grn_dat_rebuild_trie(grn_ctx *ctx, grn_dat *dat) { - char trie_path[PATH_MAX]; - grn_dat_generate_trie_path(grn_io_path(dat->io), trie_path, dat->header->file_id + 1); + grn::dat::Trie * const new_trie = new (std::nothrow) grn::dat::Trie; + if (!new_trie) { + MERR(const_cast<char *>("new grn::dat::Trie failed")); + return false; + } + + const uint32_t file_id = dat->header->file_id; try { - const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie); - grn::dat::Trie().create(*trie, trie_path, trie->file_size() * 2); -// grn::dat::Trie().create(*trie, trie_path, (grn::dat::UInt64)(trie->file_size() * 1.5)); + char trie_path[PATH_MAX]; + grn_dat_generate_trie_path(grn_io_path(dat->io), trie_path, file_id + 1); + const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie); + new_trie->create(*trie, trie_path, trie->file_size() * 2); +// new_trie->create(*trie, trie_path, (grn::dat::UInt64)(trie->file_size() * 1.5)); } catch (const grn::dat::Exception &ex) { ERR(grn_dat_translate_error_code(ex.code()), - const_cast<char *>("grn::dat::Trie::create failed")); + const_cast<char *>("grn::dat::Trie::open failed")); + delete new_trie; return false; } - ++dat->header->file_id; - return grn_dat_open_trie_if_needed(ctx, dat); + + grn::dat::Trie * const old_trie = static_cast<grn::dat::Trie *>(dat->old_trie); + dat->old_trie = dat->trie; + dat->trie = new_trie; + dat->header->file_id = dat->file_id = file_id + 1; + + delete old_trie; + if (file_id >= 2) { + char trie_path[PATH_MAX]; + grn_dat_generate_trie_path(grn_io_path(dat->io), trie_path, file_id - 1); + grn_io_remove(ctx, trie_path); + } + return true; } void grn_dat_cursor_init(grn_ctx *, grn_dat_cursor *cursor) {