int ai_btree_delete(as_sindex_metadata *imd, as_sindex_pmetadata *pimd, as_sindex_key *skey, void *val) { int ret = AS_SINDEX_OK; uint64_t uk = * (uint64_t *) val; uint64_t bv = skey->b[0].u.i64; if (!pimd->ibtr) { SITRACE(imd->si, DML, debug, "AI_BTREE_FAIL: Delete failed no ibtr %d %lu", bv, uk); return AS_SINDEX_KEY_NOTFOUND; } ai_obj ncol; if (C_IS_Y(imd->dtype)) { init_ai_objFromDigest(&ncol, &skey->b[0].digest); } else { init_ai_objLong(&ncol, skey->b[0].u.i64); } ai_obj apk; init_ai_objFromDigest(&apk, (cf_digest *)val); ulong bb = pimd->ibtr->msize + pimd->ibtr->nsize; ret = reduced_iRem(pimd->ibtr, &ncol, &apk); ulong ab = pimd->ibtr->msize + pimd->ibtr->nsize; as_sindex_release_data_memory(imd, (bb - ab)); SITRACE(imd->si, DML, debug, "ai__btree_delete(N): key: %d - %lu", bv, uk); return ret; }
int ai_btree_delete(as_sindex_metadata *imd, as_sindex_pmetadata *pimd, void * skey, cf_digest * value) { int ret = AS_SINDEX_OK; if (!pimd->ibtr) { return AS_SINDEX_KEY_NOTFOUND; } ai_obj ncol; if (C_IS_Y(imd->dtype)) { init_ai_objFromDigest(&ncol, (cf_digest *)skey); } else { init_ai_objLong(&ncol, *(ulong *)skey); } ai_obj apk; init_ai_objFromDigest(&apk, value); ulong bb = pimd->ibtr->msize + pimd->ibtr->nsize; ret = reduced_iRem(pimd->ibtr, &ncol, &apk); ulong ab = pimd->ibtr->msize + pimd->ibtr->nsize; as_sindex_release_data_memory(imd, (bb - ab)); return ret; }
/* * Deletes the digest as in the passed in as gc_list, bound by n2del number of * elements per iteration, with *deleted successful deletes. */ bool ai_btree_defrag_list(as_sindex_metadata *imd, as_sindex_pmetadata *pimd, cf_ll *gc_list, ulong n2del, ulong *deleted) { // If n2del is zero here, that means caller do not want to defrag if (n2del == 0 ) { return false; } ulong success = 0; as_namespace *ns = imd->si->ns; // STEP 3: go thru the PKtoDeleteList and delete the keys ulong bb = pimd->ibtr->msize + pimd->ibtr->nsize; uint64_t validation_time_ns = 0; uint64_t deletion_time_ns = 0; while (cf_ll_size(gc_list)) { cf_ll_element * ele = cf_ll_get_head(gc_list); ll_sindex_gc_element * node = (ll_sindex_gc_element * )ele; objs_to_defrag_arr * dt = node->objs_to_defrag; // check before deleting. The digest may re-appear after the list // creation and before deletion from the secondary index int i = 0; while (dt->num != 0) { i = dt->num - 1; SET_TIME_FOR_SINDEX_GC_HIST(validation_time_ns); int ret = as_sindex_can_defrag_record(ns, &(dt->acol_digs[i].dig)); SINDEX_GC_HIST_INSERT_DATA_POINT(sindex_gc_validate_obj_hist, validation_time_ns); validation_time_ns = 0; if (ret == AS_SINDEX_GC_SKIP_ITERATION) { goto END; } else if (ret == AS_SINDEX_GC_OK) { ai_obj apk; init_ai_objFromDigest(&apk, &(dt->acol_digs[i].dig)); ai_obj *acol = &(dt->acol_digs[i].acol); cf_detail(AS_SINDEX, "Defragged %lu %ld", acol->l, *((uint64_t *)&apk.y)); SET_TIME_FOR_SINDEX_GC_HIST(deletion_time_ns); if (reduced_iRem(pimd->ibtr, acol, &apk) == AS_SINDEX_OK) { success++; SINDEX_GC_HIST_INSERT_DATA_POINT(sindex_gc_delete_obj_hist, deletion_time_ns); } deletion_time_ns = 0; } dt->num -= 1; n2del--; if (n2del == 0) { goto END; } } cf_ll_delete(gc_list, (cf_ll_element*)node); } END: as_sindex_release_data_memory(imd, (bb - pimd->ibtr->msize - pimd->ibtr->nsize)); *deleted += success; return cf_ll_size(gc_list) ? true : false; }