Exemplo n.º 1
0
   int tair_manager::get(int area, data_entry &key, data_entry &value)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }

      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      data_entry mkey = key;
      mkey.merge_area(area);

      int bucket_number = get_bucket_number(key);
      log_debug("get request will server in bucket: %d", bucket_number);
      PROFILER_BEGIN("get from storage engine");
      int rc = storage_mgr->get(bucket_number, mkey, value);
      PROFILER_END();
      key.data_meta = mkey.data_meta;
      TAIR_STAT.stat_get(area, rc);
      return rc;
   }
Exemplo n.º 2
0
      int item_manager::__get_items(tair_manager *tair_mgr,int area,data_entry& key,data_entry& value,vector<any>& items,int type /*ELEMENT_TYPE_INVALID*/)
      {

         int ret = TAIR_RETURN_FAILED;
         if( (ret = tair_mgr->get(area,key,value)) != TAIR_RETURN_SUCCESS ){
            return ret;
         }
         if (!tair_mgr->get_storage_manager()->test_flag(value.data_meta.flag, TAIR_ITEM_FLAG_ITEM)) {
            log_debug("is not items type,flag:%d",value.data_meta.flag);
            return TAIR_RETURN_TYPE_NOT_MATCH;
         }
         if(type != ELEMENT_TYPE_INVALID){ //need check type
            uint32_t attr = get_attribute(value);
            log_debug("__get_items:type:%d,attr:%u",type,VAL_TYPE(attr));
            if(static_cast<uint32_t>(type) != VAL_TYPE(attr)){
               return TAIR_RETURN_TYPE_NOT_MATCH;
            }
         }
         if( !parse_array(get_items_addr(value),value.get_data()+value.get_size(),items)){
            log_debug("parse_array failed");
            return TAIR_RETURN_SERIALIZE_ERROR;
         }
         if(items.size() == 0){ //empty
            return TAIR_RETURN_ITEM_EMPTY;
         }
         return 0;
      }
Exemplo n.º 3
0
   void update_log::log(sn_operation_type operation_type, data_entry &key, data_entry &value, uint16_t db_id)
   {
      uint key_size = key.get_size();
      if (key.data_meta.keysize == 0){
         key.data_meta.keysize = key_size;
      }

      log_debug("key length: %d, value length:%d", key_size, value.get_size());
      uint value_size = 0;
      uint header_size = sizeof(item_meta_info);
      int total_size = header_size + key_size + 3 ;
      if (operation_type == SN_PUT) {
         value_size = value.get_size();
         if (key.data_meta.valsize == 0){
            key.data_meta.valsize = value_size;
         }
         total_size += value_size;
      }
      char *log_str = (char *)malloc(total_size);
      memcpy(log_str, &(key.data_meta), header_size);
      char *ptr = log_str + header_size;
      *((int8_t *)ptr) = (int8_t)operation_type;
      *((uint16_t *)(ptr + 1)) = (uint16_t)db_id;
      memcpy(ptr + 3, key.get_data(), key_size);
      if (operation_type == SN_PUT) {
         memcpy(ptr + 3 + key_size, value.get_data(), value_size);
      }
      PROFILER_BEGIN("write migrate log");
      writer->write(log_str, total_size);
      PROFILER_END();
      free(log_str);
   }
Exemplo n.º 4
0
   int tair_manager::put(int area, data_entry &key, data_entry &value, int expire_time)
   {
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (value.get_size() >= TAIR_MAX_DATA_SIZE || value.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      data_entry mkey = key; // key merged with area
      mkey.merge_area(area);

      int bucket_number = get_bucket_number(key);
      log_debug("put request will server in bucket: %d key =%s ", bucket_number, key.get_data());
      key.data_meta.log_self();
      int op_flag = get_op_flag(bucket_number, key.server_flag);

      int rc = TAIR_RETURN_SERVER_CAN_NOT_WORK;
      PROFILER_BEGIN("should write local?");
      if (should_write_local(bucket_number, key.server_flag, op_flag, rc) == false) {
         PROFILER_END();
         return rc;
      }
      PROFILER_END();

      // save into the storage engine
      bool version_care =  op_flag & TAIR_OPERATION_VERSION;
      PROFILER_BEGIN("put into storage");
      rc = storage_mgr->put(bucket_number, mkey, value, version_care, expire_time);
      PROFILER_END();

      if (rc == TAIR_RETURN_SUCCESS ) {
         key.data_meta = mkey.data_meta;
         if (op_flag & TAIR_OPERATION_DUPLICATE) {
            vector<uint64_t> slaves;
            get_slaves(key.server_flag, bucket_number, slaves);
            if (slaves.empty() == false) {
               PROFILER_BEGIN("do duplicate");
               duplicator->duplicate_data(area, &key, &value, bucket_number, slaves);
               PROFILER_END();
            }
         }

         if (migrate_log != NULL && need_do_migrate_log(bucket_number)) {
            PROFILER_BEGIN("do migrate log");
            migrate_log->log(SN_PUT, mkey, value, bucket_number);
            PROFILER_END();
         }

      }
      TAIR_STAT.stat_put(area);

      return rc;
   }
Exemplo n.º 5
0
 void RequestProcessor::dump_key(const data_entry &key, const char *msg) {
   if (msg == NULL) {
     msg = "error";
   }
   char *d_str = util::string_util::bin2ascii(key.get_data(), key.get_size(), NULL, 0);
   log_error("%s, key: %s", msg, d_str);
   free(d_str);
 }
Exemplo n.º 6
0
   int tair_manager::remove(int area, data_entry &key)
   {
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      data_entry mkey = key;
      mkey.merge_area(area);

      int bucket_number = get_bucket_number(key);

      int op_flag = get_op_flag(bucket_number, key.server_flag);
      int rc = TAIR_RETURN_SERVER_CAN_NOT_WORK;
      PROFILER_BEGIN("should write local?");
      if (should_write_local(bucket_number, key.server_flag, op_flag, rc) == false) {
         PROFILER_END();
         return rc;
      }
      PROFILER_END();
      bool version_care =  op_flag & TAIR_OPERATION_VERSION;

      PROFILER_BEGIN("remove from storage engine");
      rc = storage_mgr->remove(bucket_number, mkey, version_care);
      PROFILER_END();

      if (rc == TAIR_RETURN_SUCCESS || rc == TAIR_RETURN_DATA_NOT_EXIST) {
         if (op_flag & TAIR_OPERATION_DUPLICATE) {
            vector<uint64_t> slaves;
            get_slaves(key.server_flag, bucket_number, slaves);
            if (slaves.empty() == false) {
               PROFILER_BEGIN("do duplicate");
               duplicator->duplicate_data(area, &key, NULL, bucket_number, slaves);
               PROFILER_END();
            }
         }

         if (migrate_log != NULL && need_do_migrate_log(bucket_number)) {
            PROFILER_BEGIN("do migrate log");
            migrate_log->log(SN_REMOVE, mkey, mkey, bucket_number);
            PROFILER_END();
         }

      }
      TAIR_STAT.stat_remove(area);

      return rc;
   }
Exemplo n.º 7
0
   int tair_manager::get_item_count(int area, data_entry& key)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }
      return json::item_manager::get_item_count(this,area,key);
   }
Exemplo n.º 8
0
   int tair_manager::add_count(int area, data_entry &key, int count, int init_value, int *result_value, int expire_time)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }

      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      tbsys::CThreadGuard guard(&counter_mutex[get_mutex_index(key)]);
      // get from storage engine
      data_entry old_value;
      PROFILER_BEGIN("get from storage");
      int rc = get(area, key, old_value);
      PROFILER_END();
      log_debug("get result: %d, flag: %d", rc, key.data_meta.flag);
      key.data_meta.log_self();
      if (rc == TAIR_RETURN_SUCCESS && IS_ADDCOUNT_TYPE(key.data_meta.flag)) {
         // old value exist
         int32_t *v = (int32_t *)(old_value.get_data() + ITEM_HEAD_LENGTH);
         log_debug("old count: %d, new count: %d, init value: %d", (*v), count, init_value);
         *v += count;
         *result_value = *v;
      } else if(rc == TAIR_RETURN_SUCCESS){
         //exist,but is not add_count,return error;
         log_debug("cann't override old value");
         return TAIR_RETURN_CANNOT_OVERRIDE;
      }else {
         // old value not exist
         char fv[6]; // 2 + sizeof(int)
         *((short *)fv) = 0x1600; // for java header
         *result_value = init_value + count;
         *((int32_t *)(fv + 2)) = *result_value;
         old_value.set_data(fv, 6);
      }

      old_value.data_meta.flag |= TAIR_ITEM_FLAG_ADDCOUNT;
      log_debug("before put flag: %d", old_value.data_meta.flag);
      PROFILER_BEGIN("save count into storage");
      int result = put(area, key, old_value, expire_time);
      PROFILER_END();
      return result;
   }
Exemplo n.º 9
0
int get_from_local_cluster(ClusterHandler& handler, data_entry& key, data_entry*& value, bool& skip)
{
  int ret = handler.client()->get_hidden(key.get_area(), key, value);
  if (ret == TAIR_RETURN_DATA_NOT_EXIST || ret == TAIR_RETURN_DATA_EXPIRED)
  {
    log_warn("key not exist local");
    skip = true;
    ret = TAIR_RETURN_SUCCESS;
  }
  else if (ret != TAIR_RETURN_SUCCESS && ret != TAIR_RETURN_HIDDEN)
  {
    log_error("get local fail, ret: %d", ret);
  }
  else
  {
    key.data_meta.cdate = value->data_meta.cdate;
    key.data_meta.edate = value->data_meta.edate;
    key.data_meta.mdate = value->data_meta.mdate;
    key.data_meta.version = value->data_meta.version;
    key.data_meta.keysize = value->data_meta.keysize;
    key.data_meta.valsize = value->data_meta.valsize;
    ret = TAIR_RETURN_SUCCESS;
  }

  return ret;
}
Exemplo n.º 10
0
   int tair_manager::get_items(int area,
                               data_entry& key,
                               int offset, int count, data_entry& value /*out*/,
                               int type /*=ELEMENT_TYPE_INVALID*/)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }
      return json::item_manager::get_items(this,area,key,offset,count,value,type);
   }
Exemplo n.º 11
0
   int tair_manager::remove_items(int area,
                                  data_entry& key, int offset, int count)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      //tbsys::CThreadGuard guard(&removeItemsMutex[getMutexIndex(key)]);
      tbsys::CThreadGuard guard(&item_mutex[get_mutex_index(key)]);
      return json::item_manager::remove_items(this,area,key,offset,count);
   }
Exemplo n.º 12
0
   int tair_manager::get_and_remove(int area,
                                    data_entry& key,
                                    int offset, int count, data_entry& value /*out*/,
                                    int type /*=ELEMENT_TYPE_INVALID*/)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }
      //tbsys::CThreadGuard guard(&getAndRemoveItemsMutex[getMutexIndex(key)]);
      tbsys::CThreadGuard guard(&item_mutex[get_mutex_index(key)]);
      return json::item_manager::get_and_remove(this,area,key,offset,count,value,type);
   }
Exemplo n.º 13
0
   /*
    *List Log Format
    *Header Key_Data VALUES_NUM(4B) VALUE1_LENGTH(4B) VALUE1 ...VALUEn_LENGTH(4B) VALUEn
    */
   void update_log::log(sn_operation_type operation_type, data_entry &key, vector<data_entry* > &values, uint16_t db_id)
   {
        uint key_size = key.get_size();
        if (key.data_meta.keysize == 0) {
            key.data_meta.keysize = key_size;
        }

        log_debug("key length: %d, value length:%d", key_size, values.size());
        uint value_size = 0;
        uint header_size = sizeof(item_meta_info);
        int total_size = header_size + key_size + 3 + 4;
        if (operation_type == SN_LPUSH || operation_type == SN_RPUSH ||
                operation_type == SN_LPUSHX || operation_type == SN_RPUSHX) {
            size_t values_size = values.size();
            for(size_t i = 0; i < values_size; i++) {
                value_size = values[i]->get_size();
                total_size += value_size;
            }
            if(key.data_meta.valsize == 0) {
                key.data_meta.valsize = total_size;
            }
        }

        char *log_str = (char *)malloc(total_size);
        memcpy(log_str, &(key.data_meta), header_size);
        char *ptr = log_str + header_size;
        *((int8_t *)ptr) = (int8_t)operation_type;
        *((uint16_t *)(ptr + 1)) = (uint16_t)db_id;
        memcpy(ptr + 3, key.get_data(), key_size);
        if (operation_type == SN_PUT) {
            size_t values_size = values.size();
            key_size += 3;
            for(size_t i = 0; i < values_size; i++) {
                memcpy(ptr + key_size, values[i]->get_data(), values[i]->get_size());
                key_size += values[i]->get_size();
            }
        }
        PROFILER_BEGIN("write migrate log");
        writer->write(log_str, total_size);
        PROFILER_END();
        free(log_str); 
   }
Exemplo n.º 14
0
 //add del key
 bool add_del_key(const data_entry& key)
 {
    uint temp = len + key.get_size() + 1;
    if (temp > MAX_MUPDATE_PACKET_SIZE){
       return false;
    }
    if (key_and_values == NULL) {
       key_and_values = new tair_operc_vector();
    }
    operation_record *oprec = new operation_record();
    oprec->key = new data_entry();
    oprec->key->clone(key);
    //log_debug("addkeyis %d", oprec->key->m_isMerged);
    oprec->operation_type = 2;
    oprec->value = NULL;
    key_and_values->push_back(oprec);
    count++;
    len += key.get_size() + 1;
    return true;
 }
Exemplo n.º 15
0
   int tair_manager::direct_remove(data_entry &key)
   {
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }
      data_entry akey = key;
      akey.decode_area();

      int bucket_number = get_bucket_number(akey);
      int rc = storage_mgr->remove(bucket_number, key, false);

      if (rc == TAIR_RETURN_DATA_NOT_EXIST) {
         // for migrate, return SUCCESS
         rc = TAIR_RETURN_SUCCESS;
      }

      TAIR_STAT.stat_remove(akey.area);

      return rc;
   }
Exemplo n.º 16
0
   int tair_manager::direct_put(data_entry &key, data_entry &value)
   {
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (value.get_size() >= TAIR_MAX_DATA_SIZE || value.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      data_entry akey = key;
      int area = akey.decode_area();
      key.area = area;

      int bucket_number = get_bucket_number(akey);
      int rc = storage_mgr->put(bucket_number, key, value, false, 0);

      TAIR_STAT.stat_put(area);

      return rc;
   }
Exemplo n.º 17
0
      int fdb_manager::get(int bucket_number, data_entry & key,
                           data_entry & value, bool with_stat)
      {

        fdb_bucket *bucket = get_bucket(bucket_number);

        if(bucket == NULL) {
          return TAIR_RETURN_FAILED;
        }

        int rc = TAIR_RETURN_SUCCESS;
        PROFILER_BEGIN("get from cache");
        if(memory_cache->get(bucket_number, key, value) == EXIT_SUCCESS) {
          log_debug("value get from mdb, size: %d", value.get_size());
          value.decode_meta(true);
          key.data_meta = value.data_meta;
          log_debug("memcache ing");
          key.data_meta.log_self();
          log_debug("cache hit...");
          PROFILER_END();
          return rc;
        }
        PROFILER_END();

        rc = bucket->get(key, value);
        log_debug("fdb getting");
        key.data_meta.log_self();
        PROFILER_BEGIN("put into cache");
        if(rc == TAIR_RETURN_SUCCESS) {
          data_entry temp_value = value;
          temp_value.merge_meta();
          log_debug("value put into mdb, size: %d", temp_value.get_size());
          memory_cache->put(bucket_number, key, temp_value, false,
                            key.data_meta.edate);
        }
        PROFILER_END();

        return rc;
      }
    bool add_put_key_data(const data_entry &key, const value_entry &data)
    {
      uint32_t temp = len + key.get_size() + 1 + data.get_size();
      if (temp > MAX_MPUT_PACKET_SIZE && count > 0) {
        log_info("mput packet size overflow: %u", temp);
        return false;
      }
      if (record_vec == NULL) {
        record_vec = new mput_record_vec();
        alloc = true;
      }

      mput_record* rec = new mput_record();
      rec->key = new data_entry();
      rec->key->clone(key);
      rec->value = new value_entry();
      rec->value->clone(data);
      record_vec->push_back(rec);
      len += key.get_size() + 1;
      len += data.get_size();
      count++;
      return true;
    }
Exemplo n.º 19
0
int get_from_local_cluster(ClusterHandler& handler, data_entry& key, data_entry*& value)
{
  int ret = handler.client()->get_hidden(key.get_area(), key, value);
  if (ret == TAIR_RETURN_HIDDEN)
  {
    ret  = TAIR_RETURN_SUCCESS;
  }
  else if (ret == TAIR_RETURN_DATA_EXPIRED)
  {
    ret = TAIR_RETURN_DATA_NOT_EXIST;
  }

  return ret;
}
Exemplo n.º 20
0
      int item_manager::get_items(tair_manager *tair_mgr,int area,data_entry& key,int offset,int count,data_entry& value /*out*/,int type)
      {
         if(area < 0 || key.get_size() <= 0 || count < 1){
            return TAIR_RETURN_INVALID_ARGUMENT;
         }
         data_entry tmp_value;
         vector<any> items;
         int ret = -1;
         log_debug("start get_items:type:%d",type);
         if (  (ret = __get_items(tair_mgr,area,key,tmp_value,items,type)) < 0){
            log_debug("__get_items failed:%d",ret);
            return ret;
         }

         vector<any>::iterator start;
         vector<any>::iterator end;

         if ( (ret = __set_region(items,offset,count,start,end)) < 0){
            log_debug("__set_region failed");
            return ret;
         }
         int result_count = end - start;
         uint32_t attr = get_attribute(tmp_value);
         uint32_t result_attr = 0;
         SET_VAL_COUNT(result_attr,result_count);
         SET_VAL_TYPE(result_attr,VAL_TYPE(attr));

         string result( reinterpret_cast<char *>(&result_attr),sizeof(uint32_t));//just reserve space
         if( !prepare_serialize(VAL_TYPE(attr),start,end,result) ){
            log_debug("prepare_serialize failed");
            return TAIR_RETURN_SERIALIZE_ERROR;
         }
         log_debug("end get_items: success");
         value.set_data(result.data(),result.size(),true);
         set_attribute(value,result_attr);
         return TAIR_RETURN_SUCCESS;
      }
Exemplo n.º 21
0
   int tair_manager::add_items(int area,
                               data_entry& key,
                               data_entry& value,
                               int max_count, int expire_time/* = 0*/)
   {
      if (status != STATUS_CAN_WORK) {
         return TAIR_RETURN_SERVER_CAN_NOT_WORK;
      }
      if (key.get_size() >= TAIR_MAX_KEY_SIZE || key.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (value.get_size() >= TAIR_MAX_DATA_SIZE || value.get_size() < 1) {
         return TAIR_RETURN_ITEMSIZE_ERROR;
      }

      if (area < 0 || area >= TAIR_MAX_AREA_COUNT) {
         return TAIR_RETURN_INVALID_ARGUMENT;
      }

      key.data_meta.flag |= TAIR_ITEM_FLAG_ITEM;
      tbsys::CThreadGuard guard(&item_mutex[get_mutex_index(key)]);
      return json::item_manager::add_items(this,area,key,value,max_count,expire_time);
   }
Exemplo n.º 22
0
      //add put key and data
      bool add_put_key_data(const data_entry &key, const data_entry &data) 
      {
         uint temp = len +  key.get_size() + 1 + data.get_size();
         if (temp> MAX_MUPDATE_PACKET_SIZE && count >0){
            return false;
         }
         if (key_and_values == NULL) {
            key_and_values = new tair_operc_vector();
         }

         operation_record *oprec = new operation_record();
         oprec->operation_type = 1;
         oprec->key = new data_entry();
         //log_debug("2addputkeyis %d",key.m_isMerged);
         oprec->key->clone(key);
         //log_debug("addputkeyis %d", oprec->key->m_isMerged);
         oprec->value = new data_entry();
         oprec->value->clone(data);
         key_and_values->push_back(oprec);
         len += key.get_size() + 1;
         len += data.get_size();
         count++;
         return true;
      }
Exemplo n.º 23
0
      int item_manager::add_items(tair_manager *tair_mgr,int area,data_entry& key,data_entry& value,int max_count,int expired)
      {
         if( UNLIKELY(area < 0 || max_count <= 0)){
            return TAIR_RETURN_INVALID_ARGUMENT;
         }

         if( UNLIKELY(max_count > item_manager::MAX_ITEMS)){
            max_count = item_manager::MAX_ITEMS;
         }

         int version = key.get_version();
         data_entry old_value;
         log_debug("start add_items");
         if( tair_mgr->get(area,key,old_value) != TAIR_RETURN_SUCCESS){ // is new
            tair_mgr->get_storage_manager()->set_flag(value.data_meta.flag, TAIR_ITEM_FLAG_ITEM);
            // value.data_meta.flag |= TAIR_ITEM_FLAG_ITEM;
            uint32_t _new_attr = get_attribute(value);
            string _new_result(reinterpret_cast<char *>(&_new_attr),sizeof(_new_attr)); //just reserve space
            int _new_items_no = new_items(value,VAL_TYPE(_new_attr),max_count,_new_result);
            if(_new_items_no < 0){
               return TAIR_RETURN_SERIALIZE_ERROR;
            }
            SET_VAL_COUNT(_new_attr,_new_items_no);
            value.set_data(_new_result.data(),_new_result.size(),true); //we must set the value back.
            set_attribute(value,_new_attr);
            return tair_mgr->put(area,key,value,expired);
         }
         //whether the version is matched
         if( (version != 0) && (version != old_value.get_version())){
            return TAIR_RETURN_VERSION_ERROR;
         }

         //the get method will set the flag
         if( !CAN_OVERRIDE(old_value.data_meta.flag,TAIR_ITEM_FLAG_ITEM) ){
            log_debug("cann't override old value,old_value's flag:%d\n",old_value.data_meta.flag);
            return TAIR_RETURN_CANNOT_OVERRIDE;
         }

         uint8_t old_flag = 0;
         if (tair_mgr->get_storage_manager()->test_flag(old_value.data_meta.flag, TAIR_ITEM_FLAG_DELETED)) {
         // if (IS_DELETED(old_value.data_meta.flag)){ // in migrate
            old_flag = TAIR_ITEM_FLAG_DELETED;
         }

         //get and deal with attribute of old_value & value
         uint32_t old_attr = get_attribute(old_value);
         uint32_t new_attr = get_attribute(value);
         if( (VAL_TYPE(new_attr)) != VAL_TYPE(old_attr)){
            log_debug("type not match,old_attr:%u,new_attr:%u",old_attr,new_attr);
            return TAIR_RETURN_TYPE_NOT_MATCH;
         }

         //deserialize and merge old_value & value
         uint32_t attr = 0;
         string result(reinterpret_cast<char *>(&attr),sizeof(attr)); //just reserve space
         int item_num = -1;
         if( (item_num = merge_items(old_value,value,VAL_TYPE(new_attr),max_count,result)) < 0 ){
            log_debug("merge_items failed");
            return TAIR_RETURN_SERIALIZE_ERROR;
         }
         SET_VAL_COUNT(attr,item_num);
         SET_VAL_TYPE(attr,(VAL_TYPE(new_attr)));

         data_entry final_value;
         final_value.set_data(result.data(),result.size(),true);
         final_value.set_version(version);
         tair_mgr->get_storage_manager()->set_flag(final_value.data_meta.flag, TAIR_ITEM_FLAG_ITEM);
         tair_mgr->get_storage_manager()->set_flag(final_value.data_meta.flag, old_flag);

         log_debug("final_value:%s",get_items_addr(final_value));

         set_attribute(final_value,attr); //set attribute
         //put the new value into the storage & return
         return tair_mgr->put(area,key,final_value,expired);
      }
Exemplo n.º 24
0
    bool CTestInterfaceBase::compareDataValue(const data_entry& v1, const data_entry& v2) {
        if (v1.get_size() != v2.get_size()) return false;
        return memcmp(v1.get_data(), v2.get_data(), v1.get_size()) == 0;

    }
Exemplo n.º 25
0
int do_rsync_data(ClusterHandler& local_handler, ClusterHandler& remote_handler, int32_t type, data_entry& key)
{
  data_entry* value = NULL;
  // get from local cluster
  int ret = get_from_local_cluster(local_handler, key, value);

  // attach info to key
  if (value != NULL)
  {
    key.data_meta.cdate = value->data_meta.cdate;
    key.data_meta.edate = value->data_meta.edate;
    key.data_meta.mdate = value->data_meta.mdate;
    key.data_meta.version = value->data_meta.version;
  }

  log_debug("@@ k:%d %s %d %d %u %u %u.v:%s %d %d", key.get_area(), key.get_size() > 6 ? key.get_data()+6 : "", key.get_size(), key.get_prefix_size(),key.data_meta.cdate,key.data_meta.mdate,key.data_meta.edate, (value != NULL && value->get_size() > 4) ? value->get_data()+4 : "", value != NULL ? value->get_size() : 0, value != NULL ? value->data_meta.flag : -1);

  key.server_flag = TAIR_SERVERFLAG_RSYNC;
  key.data_meta.flag = TAIR_CLIENT_DATA_MTIME_CARE | TAIR_CLIENT_PUT_SKIP_CACHE_FLAG;

  // do repair
  if (ret == TAIR_RETURN_SUCCESS || ret == TAIR_RETURN_DATA_NOT_EXIST)
  {
    switch (type)
    {
    case TAIR_REMOTE_SYNC_TYPE_PUT:
      if (ret == TAIR_RETURN_SUCCESS)
      {
        log_error("@@ edate : %d %d %d", key.data_meta.mdate, key.data_meta.edate, value->data_meta.edate);
        ret = remote_handler.client()->put(key.get_area(), key, *value, 0, 0, false);
        if (ret == TAIR_RETURN_MTIME_EARLY)
        {
          ret = TAIR_RETURN_SUCCESS;
        }
      }
      else
      {
        log_warn("put but data not exist in local");
        ret = TAIR_RETURN_SUCCESS;
      }
      break;
    case TAIR_REMOTE_SYNC_TYPE_DELETE:
      if (ret == TAIR_RETURN_DATA_NOT_EXIST)
      {
        ret = remote_handler.client()->remove(key.get_area(), key);
        if (ret == TAIR_RETURN_DATA_NOT_EXIST || ret == TAIR_RETURN_DATA_EXPIRED || ret == TAIR_RETURN_MTIME_EARLY)
        {
          ret = TAIR_RETURN_SUCCESS;
        }
      }
      else
      {
        log_warn("delete but data exist in local");
        ret = TAIR_RETURN_SUCCESS;
      }
      break;
    default:
      log_error("invalid type: %d, ignore", type);
      ret = TAIR_RETURN_SUCCESS;
      break;
    }
  }

  if (value != NULL)
  {
    delete value;
  }

  return ret;
}
Exemplo n.º 26
0
      int item_manager::remove_items(tair_manager *tair_mgr,int area,data_entry& key,int offset,int count,data_entry* d_value /*= 0*/,int e_type /*=ELEMENT_INVALID_TYPE*/)
      {
//      assert(area >= 0);
//      assert(key.get_size() > 0);
//      assert(count >= 0);

         if(area < 0 || key.get_size() <= 0 || count < 1){
            return TAIR_RETURN_INVALID_ARGUMENT;
         }

         data_entry tmp_value;
         vector<any> items;
         int ret = -1;
         if (  (ret = __get_items(tair_mgr,area,key,tmp_value,items,e_type)) < 0){
            return ret;
         }

         vector<any>::iterator start;
         vector<any>::iterator end;
         if ( (ret = __set_region(items,offset,count,start,end)) < 0){
            return ret;
         }

         uint32_t attr = get_attribute(tmp_value);
         int delete_count = end - start;
         log_debug("delete_count:%d",delete_count);
         int type = VAL_TYPE(attr);

         assert(delete_count <= numeric_cast<int>(items.size()));

         if(d_value){
            uint32_t d_attr = 0;
            string d_result( reinterpret_cast<char *>(&d_attr),sizeof(d_attr)); //just reserve space
            prepare_serialize(type,start,end,d_result);
            SET_VAL_COUNT(d_attr, delete_count);
            SET_VAL_TYPE(d_attr,type);
            d_value->set_data(d_result.data(),d_result.size(),true);
            set_attribute(*d_value,d_attr); //set attribute
         }

         uint32_t result_attr = 0;
         string result( reinterpret_cast<char *>(&result_attr),sizeof(uint32_t));

         vector<any>::iterator remain_start;
         vector<any>::iterator remain_end;

         if(delete_count == numeric_cast<int>(items.size())){ //delete all
            return tair_mgr->remove(area,key);
         }else if(start == items.begin()){
            remain_start = end;
            remain_end = items.end();
            ret = prepare_serialize(type,remain_start,remain_end,result);
         }else if(end == items.end()){
            remain_start = items.begin();
            remain_end = start;
            ret = prepare_serialize(type,remain_start,remain_end,result);
         }else{
            result += "[";
            remain_start = items.begin();
            remain_end = start;
            ret = prepare_serialize(type,remain_start,remain_end,result,true);
            if(ret){
               result += ",";
               remain_start = end;
               remain_end = items.end();
               ret = prepare_serialize(type,remain_start,remain_end,result,true);
            }
            result += "]";
         }

         if( !ret ){
            return TAIR_RETURN_SERIALIZE_ERROR;
         }

         int exist_num = numeric_cast<int>(items.size()) - delete_count;
         SET_VAL_COUNT(result_attr, exist_num);
         SET_VAL_TYPE(result_attr,type);

         data_entry final_value;
         final_value.set_data(result.data(),result.size(),true);
         tair_mgr->get_storage_manager()->set_flag(final_value.data_meta.flag, TAIR_ITEM_FLAG_ITEM);
         // final_value.data_meta.flag |= TAIR_ITEM_FLAG_ITEM;
         set_attribute(final_value,result_attr);
         log_debug("remain data:%s",get_items_addr(final_value));
         return tair_mgr->put(area,key,final_value,0); //TODO expire
      }
Exemplo n.º 27
0
 int tair_manager::get_mutex_index(data_entry &key)
 {
    uint32_t hashcode = util::string_util::mur_mur_hash(key.get_data(), key.get_size());
    return hashcode % mutex_array_size;
 }
Exemplo n.º 28
0
 // private methods
 uint32_t tair_manager::get_bucket_number(data_entry &key)
 {
    uint32_t hashcode = tair::util::string_util::mur_mur_hash(key.get_data(), key.get_size());
    log_debug("hashcode: %u, bucket count: %d", hashcode, table_mgr->get_bucket_count());
    return hashcode % table_mgr->get_bucket_count();
 }