void _flush_list(struct silopit *silopit, struct skipnode *x,struct skipnode *hdr,int flush_count) { int pos = 0; int count = flush_count; struct skipnode *cur = x; struct skipnode *first = hdr; struct jikukan *merge = NULL; struct meta_node *meta_info = NULL; while(cur != first) { meta_info = meta_get(silopit->meta, cur->key); if(!meta_info){ if(merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(silopit, h, merge->count, NULL); jikukan_free(merge); merge = NULL; } _flush_new_list(silopit, x, count - pos); return; } else { int cmp = strcmp(silopit->name, meta_info->index_name); if(cmp == 0) { if (!merge) merge = _read_mmap(silopit,count); jikukan_insert_node(merge, cur); } else { if (merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(silopit, h, merge->count, meta_info); jikukan_free(merge); merge = NULL; } memset(silopit->name, 0, FILE_NAME_SIZE); memcpy(silopit->name, meta_info->index_name, FILE_NAME_SIZE); merge = _read_mmap(silopit, count); jikukan_insert_node(merge, cur); } } pos++; cur = cur->forward[0]; } if (merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(silopit, h, merge->count, meta_info); jikukan_free(merge); } }
void sst_merge(struct sst *sst, struct skiplist *list, int fromlog) { (void) fromlog; struct skipnode *x = list->hdr->forward[0]; /* First time, index is NULL, need to be created */ if(sst->meta->size == 0) _flush_new_list(sst, x, list->count); else _flush_list(sst, x, list->hdr, list->count); skiplist_free(list); }
void silopit_merge(struct silopit *silopit, struct jikukan *list, int fromlog) { struct skipnode *x= list->hdr->forward[0]; if (fromlog == 1) { struct skipnode *cur = x; struct skipnode *first = list->hdr; __DEBUG(LEVEL_DEBUG, "adding log items to hiraishinfilter"); while (cur != first) { if (cur->opt == ADD) hiraishin_add(silopit->hiraishin, cur->key); cur = cur->forward[0]; } } if (silopit->meta->size == 0) _flush_new_list(silopit, x, list->count); else _flush_list(silopit, x, list->hdr, list->count); jikukan_free(list); }
void _flush_list(struct sst *sst, struct skipnode *x, struct skipnode *hdr, int flush_count) { int pos = 0; int count = flush_count; struct skipnode *cur = x; struct skipnode *first = hdr; struct skiplist *merge = NULL; struct meta_node *meta_info = NULL; while(cur != first) { meta_info = meta_get(sst->meta, cur->key); /* If m is NULL, cur->key more larger than meta's largest area * need to create new index-file */ if(!meta_info) { /* If merge is NULL, it has no merge */ if(merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(sst, h, merge->count, NULL); skiplist_free(merge); merge = NULL; } /* Flush the last nodes to disk */ _flush_new_list(sst, x, count - pos); return ; } else { /* If m is not NULL, means found the index of the cur * We need: * 1) compare the sst->name with meta index name * a)If 0: add the cur to merge, and continue * b)others: * b1)Flush the merge list to disk * b2)Open the meta's mmap, and load all blocks to new merge, add cur to merge */ int cmp = strcmp(sst->name, meta_info->index_name); if(cmp == 0) { if(!merge) merge = _read_mmap(sst, count); skiplist_insert_node(merge, cur); } else { if(merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(sst, h, merge->count, meta_info); skiplist_free(merge); merge = NULL; } memset(sst->name, 0, FILE_NAME_SIZE); memcpy(sst->name, meta_info->index_name, FILE_NAME_SIZE); merge = _read_mmap(sst, count); /* Add to merge list */ skiplist_insert_node(merge, cur); } } pos++; cur = cur->forward[0]; } if(merge) { struct skipnode *h = merge->hdr->forward[0]; _flush_merge_list(sst, h, merge->count, meta_info); skiplist_free(merge); } }