null+****@clear*****
null+****@clear*****
2012年 2月 23日 (木) 19:47:06 JST
Daijiro MORI 2012-02-23 19:47:06 +0900 (Thu, 23 Feb 2012)
New Revision: 742399e93a249668c94a5dc7fd53586c87b99431
Log:
grn_ii_buffer: support rollback operation.
Modified files:
lib/ii.c
Modified: lib/ii.c (+37 -12)
===================================================================
--- lib/ii.c 2012-02-23 19:48:40 +0900 (7ccdf63)
+++ lib/ii.c 2012-02-23 19:47:06 +0900 (84b1b7a)
@@ -7085,6 +7085,11 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
ii_buffer->update_buffer_size = update_buffer_size;
ii_buffer->counters = GRN_CALLOC(ii_buffer->ncounters *
sizeof(ii_buffer_counter));
+ ii_buffer->term_buffer = NULL;
+ ii_buffer->packed_buf = NULL;
+ ii_buffer->packed_len = 0;
+ ii_buffer->packed_buf_size = 0;
+ ii_buffer->total_chunk_size = 0;
if (ii_buffer->counters) {
ii_buffer->block_buf = GRN_MALLOCN(grn_id, II_BUFFER_BLOCK_SIZE);
if (ii_buffer->block_buf) {
@@ -7099,7 +7104,7 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
ii_buffer->tmpfd = mkostemp(ii_buffer->tmpfpath,
O_WRONLY|O_CREAT|O_TRUNC);
#endif /* WIN32 */
- if (ii_buffer->tmpfd) {
+ if (ii_buffer->tmpfd != -1) {
grn_obj_flags flags;
grn_table_get_info(ctx, ii->lexicon, &flags, NULL, NULL);
if (flags & GRN_OBJ_TABLE_PAT_KEY) {
@@ -7108,7 +7113,7 @@ grn_ii_buffer_open(grn_ctx *ctx, grn_ii *ii, uint64_t update_buffer_size)
}
return ii_buffer;
} else {
- ERR(GRN_INVALID_ARGUMENT, "temporary file open failed");
+ SERR("mkostemp");
}
GRN_FREE(ii_buffer->block_buf);
}
@@ -7136,10 +7141,17 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
if (ii_buffer->block_pos) {
grn_ii_buffer_flush(ctx, ii_buffer);
}
-
- close(ii_buffer->tmpfd);
- GRN_FREE(ii_buffer->block_buf);
- GRN_FREE(ii_buffer->counters);
+ if (ii_buffer->tmpfd != -1) {
+ close(ii_buffer->tmpfd);
+ }
+ if (ii_buffer->block_buf) {
+ GRN_FREE(ii_buffer->block_buf);
+ ii_buffer->block_buf = NULL;
+ }
+ if (ii_buffer->counters) {
+ GRN_FREE(ii_buffer->counters);
+ ii_buffer->counters = NULL;
+ }
if (ii_buffer->update_buffer_size &&
ii_buffer->update_buffer_size < 20) {
@@ -7155,17 +7167,16 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
GRN_LOG(ctx, GRN_LOG_NOTICE, "nblocks=%d, update_buffer_size=%zu",
ii_buffer->nblocks, ii_buffer->update_buffer_size);
- ii_buffer->term_buffer = NULL;
- ii_buffer->packed_buf = NULL;
- ii_buffer->packed_len = 0;
- ii_buffer->packed_buf_size = 0;
- ii_buffer->total_chunk_size = 0;
+ datavec_init(ctx, ii_buffer->data_vectors, ii_buffer->ii->n_elements, 0, 0);
#ifdef WIN32
ii_buffer->tmpfd = open(ii_buffer->tmpfpath, O_RDONLY|O_BINARY);
#else /* WIN32 */
ii_buffer->tmpfd = open(ii_buffer->tmpfpath, O_RDONLY);
#endif /* WIN32 */
- datavec_init(ctx, ii_buffer->data_vectors, ii_buffer->ii->n_elements, 0, 0);
+ if (ii_buffer->tmpfd == -1) {
+ SERR("oepn");
+ return ctx->rc;
+ }
{
uint32_t i;
for (i = 0; i < ii_buffer->nblocks; i++) {
@@ -7204,6 +7215,7 @@ grn_ii_buffer_commit(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
ii_buffer->filepos, ii_buffer->total_chunk_size);
close(ii_buffer->tmpfd);
unlink(ii_buffer->tmpfpath);
+ ii_buffer->tmpfd = -1;
return ctx->rc;
}
@@ -7216,6 +7228,19 @@ grn_ii_buffer_close(grn_ctx *ctx, grn_ii_buffer *ii_buffer)
if (flags & GRN_OBJ_TABLE_PAT_KEY) {
grn_pat_cache_disable(ctx, (grn_pat *)ii_buffer->ii->lexicon);
}
+ if (ii_buffer->tmp_lexicon) {
+ grn_obj_close(ctx, ii_buffer->tmp_lexicon);
+ }
+ if (ii_buffer->tmpfd != -1) {
+ close(ii_buffer->tmpfd);
+ unlink(ii_buffer->tmpfpath);
+ }
+ if (ii_buffer->block_buf) {
+ GRN_FREE(ii_buffer->block_buf);
+ }
+ if (ii_buffer->counters) {
+ GRN_FREE(ii_buffer->counters);
+ }
if (ii_buffer->blocks) {
for (i = 0; i < ii_buffer->nblocks; i++) {
if (ii_buffer->blocks[i].buffer) {