//k and v both are in stack //k td //v mvalue.data int insert_kv_mem(struct rbtree *rbt, struct htable *ds, uchar * k, int klen, int type, uchar * v, int vlen, int hijack, packet_type *lowerdomain) { uchar *val = NULL; struct mvalue *mv = NULL, tmp = {0}; int ret = -1; struct rbnode *pn = NULL; struct ttlnode tn = { 0 }, *tmp_tn = NULL; int idx; if (vlen < 0 || vlen > MAX_RECORD_SIZE) return -1; hashval_t *hash = &(lowerdomain->hash[0]); idx = get_pre_mem_hash(k, klen, hash); val = malloc(vlen); if (val == NULL) return -1; memcpy(val, v, vlen); mv = (struct mvalue *) v; ret = htable_insert(ds + idx, k, klen, type, val, 1, &tmp, hash); //mem, replace if (ret >= HTABLE_INSERT_RET_NEVER_EXPIRE) { free(val); } if (rbt) { if (ret == HTABLE_INSERT_RET_REPLACE) { pthread_spin_lock(&rbt->lock); tn.dlen = klen; //tmp get old data tn.exp = tmp.ttl; tn.type = type; tn.lowerdomain = NULL; tn.data = k; pn = find_node(rbt, &tn); //if update, we had delete tn in rbt //else update tn in rbt if (pn != NULL) { tmp_tn = delete_node(rbt, pn); if (tmp_tn) { free(tmp_tn->lowerdomain); free(tmp_tn); } } pthread_spin_unlock(&rbt->lock); } } if (mv->ttl == (MAX_TTL + 1)) { //never expired return 0; } if (rbt == NULL) { return 0; } //data exists in htable, delete it in ttl tree, then insert pthread_spin_lock(&rbt->lock); if (type != NS && ret == HTABLE_INSERT_RET_REPLACE) ret = insert_into_ttltree(rbt, k, klen, type, mv->ttl, lowerdomain); //ttl expired tree else ret = insert_into_ttltree(rbt, k, klen, type, tmp.ttl, lowerdomain); //ttl expired tree pthread_spin_unlock(&rbt->lock); return 0; }
void * st_th(void *arg) { int i, idx; uchar key[50] = { 0 }; int klen; uchar *val = NULL; int pre = 0; // struct hentry *he = NULL; uchar *oval; struct htable *ht; struct st_hlp *sh = (struct st_hlp *) arg; hashval_t hash; idx = sh->idx; ht = sh->ht; for (i = idx * NUMX; i < (idx + 1) * NUMX; i++) { hash = 0; sprintf((char *)key, "%dkey", i); val = malloc(50); sprintf((char *)val, "%dval", i); //printf("%d,%s,%s\n",idx,key,val); klen = strlen((const char *)key) + 1; pre = get_pre_mem_hash(key, klen, &hash); htable_insert(ht + pre, key, klen, A, val, 0, NULL, &hash); } if (idx == (THREADX - 1)) idx = -1; sleep(2); for (i = (idx + 1) * NUMX; i < (idx + 2) * NUMX; i++) { hash = 0; sprintf((char *)key, "%dkey", i); klen = strlen((const char *)key) + 1; pre = get_pre_mem_hash(key, klen, &hash); oval = htable_delete(ht + pre, key, klen, A, hash); if (oval == NULL) { printf("error in test %s,%d,%d\n", key, idx, i); } else free(oval); } sleep(5); return NULL; }
int find_record_with_ttl(struct htable *ht, uchar * key, int klen, int type, uchar *val, int vlen, struct mvalue *md, hashval_t *hash) { int idx, ret; uchar *oval; idx = get_pre_mem_hash(key, klen, hash); ret = htable_find(ht + idx, key, klen, type, val, vlen, md, hash); if (ret > 0) { if (ttl_expired(val) == 1) { oval = htable_delete(ht + idx, key, klen, type, *hash); if (oval != NULL) free(oval); } else { return ret; } } return -1; }
//k and v both are in stack //k td //v mvalue.data int insert_kv_mem(struct rbtree *rbt,struct htable *ds,uchar *k,uchar *v,int vlen) { uchar *val = NULL; struct mvalue *mv = NULL,tmp; int ret = -1; struct rbnode *pn = NULL; struct ttlnode tn = {0}; if(vlen < 0 || vlen > MAX_RECORD_SIZE) return -1; hashval_t hash = nocase_char_hash_function(k); hash = get_pre_mem_hash(k); val = malloc(vlen); if(val == NULL) return -1; memcpy(val,v,vlen); mv = (struct mvalue*)v; ret = htable_insert(ds + hash,k,val,1,&tmp); //mem, replace if(ret == 2) free(val); if(mv->ttl == (MAX_TTL + 1))//never expired return 0; if(rbt == NULL) return 0; //data exists in htable, delete it in ttl tree, then insert pthread_mutex_lock(&rbt->lock); if(ret != 0) { tn.dlen = strlen(k) + 1; //tmp get old data tn.exp = tmp.ttl; tn.data = k; pn = find_node(rbt,&tn); //if update, we had delete tn in rbt //else update tn in rbt if(pn != NULL) delete_node(rbt,pn); } ret = insert_into_ttltree(rbt,k,mv->ttl);//ttl expired tree pthread_mutex_unlock(&rbt->lock); return 0; }