Exemple #1
0
//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;
}
Exemple #2
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;
}
Exemple #3
0
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;
}
Exemple #4
0
//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;
}