Пример #1
0
static int memcachefs_rename(const char *from, const char *to)
{
    int ret;
    handle_t *handle;
    char *key;
    size_t keylen;
    void *val;
    size_t vallen;

    if(opt.verbose){
        fprintf(stderr, "%s(%s -> %s)\n", __func__, from, to);
    }
    handle = handle_get(pool);

    key = (char *)from + 1;
    keylen = strlen(key);
    val = (char*)mc_aget2(handle->mc, key, keylen, &vallen);
    if(!val){
        handle_release(pool, handle->index);
        return -ENOENT;
    }

    key = (char *)to + 1;
    keylen = strlen(key);
    ret = mc_set(handle->mc, key, keylen, val, vallen, 0, 0);
    if(ret){
        handle_release(pool, handle->index);
        return -EIO;
    }

    key = (char *)from + 1;
    keylen = strlen(key);
    ret = mc_delete(handle->mc, key, keylen, 0);
    if(ret){
        handle_release(pool, handle->index);
        return -EIO;
    }

    free(val);
    return 0;
}
Пример #2
0
static int l_sipmemcache_delete(lua_State *L)
{
  struct sipmemcache *o;
  const char *key;
  size_t keylen;
  int ret;

  o = luaL_checkudata(L, 1, "siplua.memcache");
  key = luaL_checklstring(L, 2, &keylen);
  if (o->finalized || !o->mc)
    {
      lua_pushnil(L);
    }
  else
    {
      int hold_timer = 0;
      ret = mc_delete(o->mc, (char *)key, keylen, hold_timer);
      lua_pushinteger(L, ret);
    }
  return 1;
}
Пример #3
0
static int memcachefs_unlink(const char *path)
{
    int ret;
    handle_t *handle;
    char *key;
    size_t keylen;

    if(opt.verbose){
        fprintf(stderr, "%s(\"%s\")\n", __func__, path);
    }
    handle = handle_get(pool);
    if(!handle){
        return -EMFILE;
    }
    key = (char *)path + 1;
    keylen = strlen(key);
    ret = mc_delete(handle->mc, key, keylen, 0);
    handle_release(pool, handle->index);
    if(ret){
        return -EIO;
    }

    return 0;
}
Пример #4
0
int
main(int argc, char *argv[]) {
  struct memcache *mc = NULL;
  u_int32_t num_tests = 0, valsize = 0;
  u_int32_t i;
  struct timeval t1, t2;
  const char *key;
  char *tests = NULL;
  char *val;
  u_int32_t keylen;
  double addtime, deltime;
  const char fmt[] = "%s\t%f\t%f\t%f\n";
  struct memcache_req *req;
  struct memcache_res *res;

  if (argc > 1)
    num_tests = strtol(argv[1], NULL, 10);

  if (num_tests == 0)
    num_tests = 10;

  if (argc > 2)
    valsize = strtol(argv[2], NULL, 10);

  if (argc > 3)
    tests = strdup(argv[3]);

  if (tests == NULL)
    tests = strdup("adgs");

  if (valsize == 0)
    valsize = 50;

  val = (char *)malloc(valsize + 1);
  memset(val, 69, valsize);
  val[valsize] = '\0';

  /* XXX I should add a min/max time value for each request */
  printf("Value size:\t%d\n", valsize);
  printf("Num tests:\t%d\n", num_tests);
  printf("Test\tOps per second\tTotal Time\tTime per Request\n");

  key = "bench_key";
  keylen = strlen(key);

  mc = mc_new();
  if (mc == NULL)
    err(EX_OSERR, "Unable to allocate a new memcache object");

  mc_err_filter_del(MCM_ERR_LVL_INFO);
  mc_err_filter_del(MCM_ERR_LVL_NOTICE);

  mc_server_add4(mc, "localhost:11211");

  /* Establish a connection */
  mc_set(mc, key, keylen, val, valsize, 0, 0);

  /* BEGIN set test, if specified */
  if (strchr(tests, (int)'s') != NULL) {
    if (gettimeofday(&t1, NULL) != 0)
      err(EX_OSERR, "gettimeofday(2)");

    for (i = 0; i < num_tests; i++) {
      mc_set(mc, key, keylen, val, valsize, 0, 0);
    }

    if (gettimeofday(&t2, NULL) != 0)
      err(EX_OSERR, "gettimeofday(2)");
    /* END set test */
    printf(fmt, "set", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests);
  }


  if (strchr(tests, (int)'g') != NULL) {
    /* BEGIN get request */
    req = mc_req_new();
    res = mc_req_add(req, key, keylen);
    res->size = valsize;
    res->val = malloc(res->size);
    mc_res_free_on_delete(res, 1);

    if (gettimeofday(&t1, NULL) != 0)
      err(EX_OSERR, "gettimeofday(2)");

    for (i = 0; i < num_tests; i++) {
      mc_get(mc, req);
    }

    if (gettimeofday(&t2, NULL) != 0)
      err(EX_OSERR, "gettimeofday(2)");

    mc_req_free(req);
    /* END get test */
    printf(fmt, "get", num_tests / tt(&t1, &t2), tt(&t1, &t2), tt(&t1, &t2) / num_tests);
  }



  if (strchr(tests, 'a') != NULL || strchr(tests, 'd') != NULL) {
    /* Run the add/delete test */
    mc_delete(mc, key, keylen, 0);
    addtime = deltime = 0.0;
    for (i = 0; i < num_tests; i++) {
      /* BEGIN add test */
      if (strchr(tests, 'a') != NULL) {
	if (gettimeofday(&t1, NULL) != 0)
	  err(EX_OSERR, "gettimeofday(2)");

	mc_add(mc, key, keylen, val, valsize, 0, 0);

	if (gettimeofday(&t2, NULL) != 0)
	  err(EX_OSERR, "gettimeofday(2)");

	addtime += tt(&t1, &t2);
	/* END add test */
      }

      /* BEGIN delete test */
      if (strchr(tests, 'd') != NULL) {
	if (gettimeofday(&t1, NULL) != 0)
	  err(EX_OSERR, "gettimeofday(2)");

	mc_delete(mc, key, keylen, 0);

	if (gettimeofday(&t2, NULL) != 0)
	  err(EX_OSERR, "gettimeofday(2)");

	deltime += tt(&t1, &t2);
	/* END delete test */
      }
    }

    if (strchr(tests, 'a') != NULL)
      printf(fmt, "add",    num_tests / addtime, addtime, addtime / num_tests);

    if (strchr(tests, 'd') != NULL)
      printf(fmt, "delete", num_tests / deltime, deltime, deltime / num_tests);
  }


  free(tests);
  free(val);
  mc_free(mc);

  return EX_OK;
}
Пример #5
0
static int cw_db_del_main(const char *family, const char *keys, int like, const char *value, int use_memcache )
{
	char *sql;
	char *zErr = 0;
	int res = 0;
	sqlite3 *db;
	char *op = "=";
	char *pct = "";
	int retry=0;

	if (!family || cw_strlen_zero(family)) {
		family = "_undef_";
	}

	if (like) {
		op = "like";
		pct = "%";
	}

	if (family && keys && value) {
		sql = sqlite3_mprintf("delete from %q where family %s '%q%s' and keys %s '%q%s' AND value %s '%q%s' ", 
                                        globals.tablename, op, family, pct, op, keys, pct, op, value, pct );
	} else if (family && keys) {
		sql = sqlite3_mprintf("delete from %q where family %s '%q%s' and keys %s '%q%s'", globals.tablename, op, family, pct, op, keys, pct);
	} else if (family) {
		sql = sqlite3_mprintf("delete from %q where family %s '%q%s'", globals.tablename, op, family, pct);
	} else {
		sql = sqlite3_mprintf("delete from %q", globals.tablename);
	}

        if ( !sql ) {
		cw_log(LOG_ERROR, "Memory Error!\n");
		return -1;   /* Return an error */
	}

#ifdef HAVE_MEMCACHE
        if ( memcached_data.active && use_memcache )  
        {
            //cw_log(LOG_ERROR,"MEMCACHE DEL Family %s : %s => %s (%d)\n", family, keys, value, like);

            if ( memcached_data.has_error ) 
                database_cache_retry_connect();

            if ( !like && !value ) {
                int fullkeylen;
	        char fullkey[256] = "";
	        fullkeylen = snprintf(fullkey, sizeof(fullkey), "/%s/%s", family, keys);
                mc_delete( memcached_data.mc, fullkey, fullkeylen, 0);
                if ( !database_sql_queue(sql) ) {
                    sqlite3_free(sql);
                    return 0;
                }
            }
            else
            {
                // If it's a deltree or we're dropping a specific value.
                // then we shouldn't do anything.
                // The best way here is to force the flush of all the QUEUE 
                // to the DB, clear all the cache and go on as usual.
//TODO check it
                database_flush_cache();
            }
        }
#endif

	sanity_check();
	if (!(db = sqlite_open_db(globals.dbfile))) {
		return -1;
	}

	if (sql) {
retry_2:
		if (retry > 0)
			cw_log(LOG_DEBUG, "SQL Query: [%s] (retry %d)\n", sql, retry);
		else
			cw_log(LOG_DEBUG, "SQL [%s]\n", sql);
		res = sqlite3_exec(db,
						   sql,
						   NULL,
						   NULL,
						   &zErr
						   );

		if (zErr) {
			if (retry >= SQL_MAX_RETRIES) {
				cw_log(LOG_ERROR, "SQL ERR Query: [%s] Error: [%s] Retries: %d Max: %d\n", sql, zErr, retry, SQL_MAX_RETRIES);
				sqlite3_free(zErr);
			} else {
				cw_log(LOG_DEBUG, "SQL ERR Query: %s Error: [%s] Retries %d\n", sql, zErr, ++retry);
				sqlite3_free(zErr);
				usleep(SQL_RETRY_USEC);
				goto retry_2;
			}
			res = -1;
		} else {
			if (!sqlite3_changes(db))
				res = -1;
			else
				res = 0;
		}
	}

	if (sql) {
		sqlite3_free(sql);
		sql = NULL;
	}

	sqlite3_close(db);
	return res;
}
Пример #6
0
int cw_db_put(const char *family, const char *keys, char *value)
{
	char *sql = NULL;
	char *zErr = 0;
	int res = 0;
	sqlite3 *db;
	int retry=0;

	if (!family || cw_strlen_zero(family)) {
		family = "_undef_";
	}

	if ( !(sql = sqlite3_mprintf("insert into %q values('%q','%q','%q')", globals.tablename, family, keys, value)) ) {
		cw_log(LOG_ERROR, "Memory Error!\n");
		res = -1;	/* Return an error */
	}

	cw_db_del(family, keys);

#ifdef HAVE_MEMCACHE
        if ( memcached_data.active )  
        {
            if ( memcached_data.has_error ) 
                database_cache_retry_connect();

            //cw_log(LOG_ERROR,"MEMCACHE PUT Family %s : %s => %s (%d) \n", family, keys, value, strlen(value) );
            int fullkeylen;
	    char fullkey[256] = "";
	    fullkeylen = snprintf(fullkey, sizeof(fullkey), "/%s/%s", family, keys);

            mc_delete( memcached_data.mc, fullkey, fullkeylen, 0);
            if ( mc_set(memcached_data.mc, fullkey, fullkeylen, value, (size_t) strlen(value) , db_cache_lifetime, 0) == 0) {
                // ADD THE SQL TO THE QUEUE TO BE EXECUTED ASYNCRONOUSLY
                if ( !database_sql_queue(sql) ) {
                    sqlite3_free(sql);
                    return 0;
                }
            }
            else
            {
                //DIDN'T WORK
                // So store as we did before...
            }
        }
#endif

	sanity_check();

	if (!(db = sqlite_open_db(globals.dbfile))) {
		return -1;
	}


retry_0:
	if ( sql ) {
		cw_log(LOG_DEBUG, "SQL [%s]\n", sql);

		res = sqlite3_exec(db,
				   sql,
				   NULL,
				   NULL,
				   &zErr
				   );

		if (zErr) {
			if (retry >= SQL_MAX_RETRIES) {
				cw_log(LOG_ERROR, "SQL ERR Query: [%s] Error: [%s] Retries: %d Max: %d\n", sql, zErr, retry, SQL_MAX_RETRIES);
				sqlite3_free(zErr);
			} else {
				cw_log(LOG_DEBUG, "SQL ERR Query: %s Error: [%s] Retries %d\n", sql, zErr, ++retry);
				sqlite3_free(zErr);
				usleep(SQL_RETRY_USEC);
				goto retry_0;
			}
			res = -1;
		} else {
			res = 0;
		}
	}

	if (sql) {
		sqlite3_free(sql);
		sql = NULL;
	}
	sqlite3_close(db);

	return res;
}