示例#1
0
void rwdts_appconf_prepare_complete_fail(rwdts_appconf_t *ac,
                                         const rwdts_xact_info_t *xact_info,
                                         rw_status_t rs,
                                         const char *errstr) {
  RW_ASSERT_TYPE(ac, rwdts_appconf_t);
  rwdts_appconf_xact_t *appx =
      (rwdts_appconf_xact_t *)xact_info->xact->group[ac->group->id]->scratch;
  RW_ASSERT_TYPE(appx, rwdts_appconf_xact_t);

  RW_ASSERT(appx->queries_in > 0);
  appx->queries_out++;
  RW_ASSERT(appx->queries_out <= appx->queries_in);

  int idx = appx->errs_ct++;
  appx->errs = realloc(appx->errs, sizeof(appx->errs[0]) * appx->errs_ct);
  appx->errs[idx].str = strdup(errstr);
  appx->errs[idx].rs = rs;
  appx->errs[idx].corrid = (xact_info->queryh &&
                            ((RWDtsQuery*)xact_info->queryh)->has_corrid ?
                            ((RWDtsQuery*)xact_info->queryh)->corrid : 0);

  rwdts_member_send_error(xact_info->xact, NULL,
                          (RWDtsQuery*)xact_info->queryh,
                          NULL, NULL, rs, errstr);
  RWTRACE_CRIT(xact_info->apih->rwtrace_instance,
               RWTRACE_CATEGORY_RWTASKLET,
               "APPCONF prepare_complete_fail code %d str '%s'\n",
               rs,
               errstr);

  rwdts_xact_info_respond_keyspec(xact_info, RWDTS_XACT_RSP_CODE_NACK,
                                  NULL, NULL);
}
示例#2
0
bool
KeySpecHelper::is_rooted()
{
  const ProtobufCMessage *dom_path = get_dompath();

  if (!dom_path) {
    return false;
  }

  size_t offset;
  protobuf_c_boolean is_dptr = FALSE;
  void *field_ptr = nullptr;
  const ProtobufCFieldDescriptor *fd = nullptr;

  size_t count = protobuf_c_message_get_field_desc_count_and_offset(dom_path,
      RW_SCHEMA_TAG_KEYSPEC_ROOTED, &fd, &field_ptr, &offset, &is_dptr);

  if (!count) {
    return false;
  }

  RW_ASSERT(fd->type == PROTOBUF_C_TYPE_BOOL);
  RW_ASSERT(fd->label != PROTOBUF_C_LABEL_REPEATED);

  if (*(protobuf_c_boolean *)field_ptr) {
    return true;
  }

  return false;
}
示例#3
0
void sanitize_manifest(vcs_manifest * manifest) {
  if (!manifest->init_phase) {
    manifest->init_phase = (vcs_manifest_init *)malloc(sizeof(vcs_manifest_init));
    RW_ASSERT(manifest->init_phase);
    vcs_manifest_init__init(manifest->init_phase);
  }

  if (!manifest->init_phase->settings) {
    manifest->init_phase->settings = (vcs_manifest_settings *)malloc(sizeof(vcs_manifest_settings));
    RW_ASSERT(manifest->init_phase->settings);
    vcs_manifest_settings__init(manifest->init_phase->settings);
  }

  if (!manifest->init_phase->settings->rwmsg) {
    manifest->init_phase->settings->rwmsg = (vcs_manifest_rwmsg *)malloc(sizeof(vcs_manifest_rwmsg));
    RW_ASSERT(manifest->init_phase->settings->rwmsg);
    vcs_manifest_rwmsg__init(manifest->init_phase->settings->rwmsg);
  }

  if (!manifest->init_phase->settings->rwvcs) {
    manifest->init_phase->settings->rwvcs = (vcs_manifest_rwvcs *)malloc(sizeof(vcs_manifest_rwvcs));
    RW_ASSERT(manifest->init_phase->settings->rwvcs);
    vcs_manifest_rwvcs__init(manifest->init_phase->settings->rwvcs);
  }

  if (!manifest->init_phase->settings->rwvcs->has_collapse_each_rwprocess) {
    manifest->init_phase->settings->rwvcs->has_collapse_each_rwprocess = true;
    manifest->init_phase->settings->rwvcs->collapse_each_rwprocess = true;
  }
  if (!manifest->init_phase->settings->rwvcs->has_collapse_each_rwvm) {
    manifest->init_phase->settings->rwvcs->has_collapse_each_rwvm = true;
    manifest->init_phase->settings->rwvcs->collapse_each_rwvm = true;
  }
}
示例#4
0
RwSchemaCategory
KeySpecHelper::get_category()
{
  RwSchemaCategory category = RW_SCHEMA_CATEGORY_ANY;
  const ProtobufCMessage* dom_path = get_dompath();

  if (dom_path) {

    const ProtobufCFieldDescriptor *fd = nullptr;
    protobuf_c_boolean is_dptr = false;
    void *field_ptr = nullptr;
    size_t offset = 0;

    size_t count = protobuf_c_message_get_field_desc_count_and_offset(
        dom_path, RW_SCHEMA_TAG_KEYSPEC_CATEGORY, &fd, &field_ptr, &offset, &is_dptr);

    if (count) {
      RW_ASSERT(fd->type == PROTOBUF_C_TYPE_ENUM);
      RW_ASSERT(fd->label != PROTOBUF_C_LABEL_REPEATED);
      RW_ASSERT(&rw_schema_category__descriptor == fd->descriptor);

      category = *(RwSchemaCategory*)field_ptr;
    }
  }

  return category;
}
示例#5
0
const rw_keyspec_entry_t*
KeySpecHelper::get_specific_path_entry(uint32_t tag)
{
  const ProtobufCMessage* dom_path = get_dompath();

  if (!dom_path) {
    return nullptr;
  }

  const ProtobufCFieldDescriptor *fd = nullptr;
  void *field_ptr = nullptr;
  size_t offset = 0;
  protobuf_c_boolean is_dptr = false;

  size_t count = protobuf_c_message_get_field_desc_count_and_offset(
      dom_path, tag, &fd, &field_ptr, &offset, &is_dptr);

  if (!count) {
    return nullptr;
  }

  RW_ASSERT(fd->type == PROTOBUF_C_TYPE_MESSAGE);
  RW_ASSERT(fd->label != PROTOBUF_C_LABEL_REPEATED);

  return (const rw_keyspec_entry_t *)field_ptr;
}
示例#6
0
CF_EXPORT void
rwsched_tasklet_CFRunLoopTimerInvalidate(rwsched_tasklet_ptr_t sched_tasklet,
        rwsched_CFRunLoopTimerRef rwsched_timer)
{
    // Validate input paraemters
    RW_CF_TYPE_VALIDATE(sched_tasklet, rwsched_tasklet_ptr_t);
    rwsched_instance_ptr_t instance = sched_tasklet->instance;
    RW_CF_TYPE_VALIDATE(instance, rwsched_instance_ptr_t);
    RW_CF_TYPE_VALIDATE(rwsched_timer, rwsched_CFRunLoopTimerRef);

    rwsched_timer->invalidate_called = 1;
#if 1
    int i;
    for (i = 1 ; i < sched_tasklet->cftimer_array->len ; i++) {
        if (g_array_index(sched_tasklet->cftimer_array, rwsched_CFRunLoopTimerRef, i) == rwsched_timer) {
            g_array_remove_index (sched_tasklet->cftimer_array, i);
            break;
        }
    }
#else
    RW_ASSERT(rwsched_timer->index != 0);
    RW_ASSERT(sched_tasklet->cftimer_array->len > rwsched_timer->index);
    g_array_index(sched_tasklet->cftimer_array, rwsched_CFRunLoopTimerRef, rwsched_timer->index) = NULL;
    rwsched_timer->index = 0;
#endif
    // Call the native CFRunLoop function
    CFRunLoopTimerInvalidate(rwsched_timer->cf_object);
}
示例#7
0
int main(int argc, char **argv, char **envp) {

  if (3 != argc) {
    fprintf(stderr, "Usage: ./rwdts_redis_client <ip> <port>\n");
    return -1;
  }

  //uint16_t port = atoi(argv[2]);

  myUserData.handle = rwdts_kv_allocate_handle(REDIS_DB);
  rwsched_instance_ptr_t rwsched = NULL;
  rwsched = rwsched_instance_new();
  RW_ASSERT(rwsched);

  rwsched_tasklet_ptr_t tasklet = NULL;
  tasklet = rwsched_tasklet_new(rwsched);
  RW_ASSERT(tasklet);

  rwdts_kv_handle_db_connect(myUserData.handle, rwsched, tasklet, "127.0.0.1:9997",
                             "test", NULL, redis_initialized, myUserData.handle);

  myUserData.rwsched = rwsched;
  myUserData.tasklet = tasklet;
  myUserData.count = 0;
  myUserData.my_shard_deleted = 0;

  rwsched_dispatch_main_until(tasklet, 1000, 0);

  return 1;
}
示例#8
0
文件: rw_ip.c 项目: gonotes/RIFT.ware
char* rw_ip_prefix_t_get_str(char* str, const rw_ip_prefix_t *prefix)
{
  char maskstr[5];
  
  RW_ASSERT(prefix);
  RW_ASSERT((prefix->ip_v == RW_IPV6) || (prefix->ip_v == RW_IPV4));

  if (prefix->ip_v == RW_IPV6) {
    struct in6_addr in6;
    int i;
    for (i = 0; i < 4; i++){
      in6.s6_addr32[i] = htonl(prefix->u.v6.addr[i]);
    }
    inet_ntop(AF_INET6, &(in6), str, INET6_ADDRSTRLEN);
  } else { // RW_IPV4
    struct in_addr in;
    in.s_addr = htonl(prefix->u.v4.addr);
    inet_ntop(AF_INET, &(in), str, INET6_ADDRSTRLEN);
  }
  
  sprintf(maskstr, "/%d", prefix->masklen);
  strcat(str, maskstr);
  
  return str;
}
示例#9
0
文件: rw_ip.c 项目: gonotes/RIFT.ware
int rw_ip_addr_cmp(const void *v1, const void *v2)
{
  const rw_ip_addr_t *a1 = (const rw_ip_addr_t *)v1;
  const rw_ip_addr_t *a2 = (const rw_ip_addr_t *)v2;
  RW_ASSERT((a1->ip_v == RW_IPV4) ||
            (a1->ip_v == RW_IPV6));

  RW_ASSERT((a2->ip_v == RW_IPV4) ||
            (a2->ip_v == RW_IPV6));

  if (a1->ip_v < a2->ip_v)
    return -1;
  if (a1->ip_v > a2->ip_v)
    return 1;

  if (a1->ip_v == RW_IPV4){
    if (a1->u.v4.addr < a2->u.v4.addr)
    return -1;
  if (a1->u.v4.addr > a2->u.v4.addr)
    return 1;
  }else{
    int i;
    for (i = 0; i < 4; i++){
      if (a1->u.v6.addr[i] < a2->u.v6.addr[i])
        return -1;
      if (a1->u.v6.addr[i] > a2->u.v6.addr[i])
        return 1;
    }
  }

  return 0;
}
示例#10
0
static void
rwlogd_file_send_log(RwlogdPeerAPI_Service    *srv,
                                              const RwlogdFileSendLogReq *req,
                                              void                           *user_handle,
                                              RwlogdFileSendLogRsp_Closure    closure,
                                              void                           *closure_data)
{
  rwlogd_instance_ptr_t       instance;
  RwlogdFileSendLogRsp                     rsp;

  // Validate input parameters
  RW_ASSERT(srv);
  if (!srv) { return; }
  RW_ASSERT(req);
  if (!req) { return; }
  RW_ASSERT(user_handle);
  if (!user_handle) { return; }
  RW_ASSERT(closure);
  if (!closure) { return; }
  RW_ASSERT(closure_data);
  if (!closure_data) { return; }

  instance = (rwlogd_instance_ptr_t) user_handle;
  //RW_CF_TYPE_VALIDATE(instance, rwlogd_instance_ptr_t);

  rwlogd_handle_file_log(instance->rwlogd_info, req->my_key,req->sink_name);

  // Initialize response structure
  rwlogd_file_send_log_rsp__init(&rsp);
  closure(&rsp, closure_data);

  return;
}
示例#11
0
static void
rwlogd_send_log(RwlogdPeerAPI_Service   *srv,
                const RwlogdSendLogReq  *req,
                void                    *user_handle,
                RwlogdStatus_Closure    closure,
                void                    *closure_data)
{
  rwlogd_instance_ptr_t       instance;
  RwlogdStatus                     rsp;
  size_t log_size = 0;
  size_t offset = 0;

  // Validate input parameters
  RW_ASSERT(srv);
  if (!srv) { return; }
  RW_ASSERT(req);
  if (!req) { return; }
  RW_ASSERT(user_handle);
  if (!user_handle) { return; }
  RW_ASSERT(closure);
  if (!closure) { return; }
  RW_ASSERT(closure_data);
  if (!closure_data) { return; }

  instance = (rwlogd_instance_ptr_t) user_handle;
  //RW_CF_TYPE_VALIDATE(instance, rwlogd_instance_ptr_t);
  
  RWLOG_DEBUG_PRINT("Received Log in instance: %d of length %lu\n", instance->rwtasklet_info->identity.rwtasklet_instance_id,req->log_msg.len);
  instance->rwlogd_info->stats.peer_recv_requests++;

  while(offset < req->log_msg.len) 
  {
    rwlog_hdr_t *hdr = (rwlog_hdr_t *)(req->log_msg.data + offset);

    if(hdr->magic != RWLOG_MAGIC || ((offset + hdr->size_of_proto+sizeof(rwlog_hdr_t)) > req->log_msg.len) ||
       (hdr->log_category > instance->rwlogd_info->num_categories || hdr->log_severity > RW_LOG_LOG_SEVERITY_DEBUG)) {
      RWLOG_DEBUG_PRINT("read %dl Magic%d category:%u Severity:%u; rotating\n",
                        (int)req->log_msg.len, hdr->magic,hdr->log_category,hdr->log_severity);
      instance->rwlogd_info->stats.invalid_log_from_peer++;

      rwlogd_status__init(&rsp);
      rsp.status = RWLOGD_STATUS__MSGSTATUS__FAILURE;
      closure(&rsp, closure_data);

      return;
    }

    log_size = hdr->size_of_proto+sizeof(rwlog_hdr_t);
    offset += log_size;
    rwlogd_handle_log(instance,(uint8_t *)hdr,log_size,TRUE);
    instance->rwlogd_info->stats.logs_received_from_peer++;
  }

  // Initialize response structure
  rwlogd_status__init(&rsp);
  rsp.status = RWLOGD_STATUS__MSGSTATUS__SUCCESS;
  closure(&rsp, closure_data);

  return;
}
示例#12
0
// Copiers for Confd TLV List Iterators
rw_tree_walker_status_t build_and_move_iterator_child_value (RwTLVListIterator* parent_iter,
                                                               RwPbcmTreeIterator* child_iter)
{
  rw_ylib_data_t child_val;
  
  rw_status_t rs = child_iter->get_value(&child_val);
  RW_ASSERT(RW_STATUS_SUCCESS == rs);

  RwTLVListIterator::tlv_list_iter_t parent,child;
  rs = parent_iter->get_value(parent);

  if (rs != RW_STATUS_SUCCESS) {
    return RW_TREE_WALKER_FAILURE;
  }

  // Adding a child needs zero (leaf list with existing confd TLV), one
  // (leaf with no existing confd TLV) or two (containers and lists) confd
  // TLV value

  rw_tree_walker_status_t rt = RW_TREE_WALKER_FAILURE;
RW_ASSERT(RW_YLIB_DATA_TYPE_PB == child_val.type);
 rt  = add_tlv_list_child (parent_iter, &child_val.rw_pb,
                               child_iter->get_yang_node_name(),
                               child_iter->get_yang_ns(),
                               child);
  if (rt != RW_TREE_WALKER_SUCCESS)  {
    // no need to move to a child
    return rt;
  }

  rs = parent_iter->move_to_child (child);
  RW_ASSERT(RW_STATUS_SUCCESS == rs);
  return rt;

}
示例#13
0
rw_status_t get_string_value (rw_confd_value_t *v,
                              std::string& str)
{
  str.clear();
  if (v->value) {
    if (v->cs_node->info.type) {
      
      char value[1024];
      struct confd_type *ct = v->cs_node->info.type;

      if (C_LIST == v->cs_node->info.shallow_type) {
        ct = confd_get_leaf_list_type (v->cs_node);
        RW_ASSERT(ct);
      }
      int len = confd_val2str (ct, v->value,value, sizeof (value));
      if (len < 0) {
        return RW_STATUS_FAILURE;
      }
      RW_ASSERT ((size_t) len < sizeof (value));
      str = value;
    } else {
      str = confd_hash2str(v->cs_node->tag);
    }
  }
  return RW_STATUS_SUCCESS;
}
示例#14
0
rw_status_t
rwdts_kv_update_db_xact_commit(rwdts_member_data_object_t *mobj, RWDtsQueryAction action)
{
  rwdts_api_t *apih;
  rwdts_member_registration_t *reg;

  reg = mobj->reg;
  RW_ASSERT_TYPE(reg, rwdts_member_registration_t);
  RW_ASSERT(action != RWDTS_QUERY_INVALID);
  apih = reg->apih;
  RW_ASSERT(apih);

  if (mobj->kv_tab_handle == NULL) {
    /* Problem */
    return RW_STATUS_FAILURE;
  }

  RWDTS_CREATE_SHARD(reg->reg_id, apih->client_path, apih->router_path);
  /* Perform KV xact operation */
  if (apih->db_up && ((action == RWDTS_QUERY_CREATE) ||
      (RWDTS_QUERY_UPDATE == action))) {
    rwdts_kv_light_api_xact_insert_commit(mobj->kv_tab_handle, mobj->serial_num,
                                          shard, (void *)mobj->key,
                                          mobj->key_len, (void *)rwdts_kv_light_insert_xact_commit_obj_cb,
                                          (void *)mobj);
  } else if (apih->db_up && (action == RWDTS_QUERY_DELETE)) {
    rwdts_kv_light_table_xact_delete_commit(mobj->kv_tab_handle, mobj->serial_num,
                                            (void *)mobj->key,
                                            mobj->key_len,
                                            (void *)rwdts_kv_light_delete_xact_commit_obj_cb,
                                            (void *)mobj);
  }
  return RW_STATUS_SUCCESS;
}
示例#15
0
static protobuf_c_boolean rw_ip_prefix_t_unpack(
  ProtobufCInstance *instance,
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  size_t in_size,
  const uint8_t* in,
  protobuf_c_boolean maybe_clear,
  void* void_member)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ip_prefix_t_helper);
  RW_ASSERT(void_member);
  RW_ASSERT(in);
  RW_ASSERT(instance);
  rw_ip_prefix_t* ip_prefaddr = (rw_ip_prefix_t*)void_member;

  char str[RW_PREFIX_ADDRSTRLEN*2];
  if (in_size >= sizeof(str)) {
    return FALSE;
  }
  memcpy(str, in, in_size);
  str[in_size] = 0;
  memset(ip_prefaddr, 0, sizeof(*ip_prefaddr));

  char* slash = strchr(str, '/');
  if (slash){
    *slash = 0;
  }
  // Check if this is an IPv6 address
  if (strchr(str, ':')) {
    struct in6_addr in6;
    int i;
    ip_prefaddr->ip_v = RW_IPV6;
    
    if (inet_pton(AF_INET6, str, &(in6)) <= 0) {
      return FALSE;
    }
    for (i = 0; i < 4; i++){
      ip_prefaddr->u.v6.addr[i] = ntohl(in6.s6_addr32[i]);
    }
  } else {
    struct in_addr in;
    // Assume IPv4 address
    ip_prefaddr->ip_v = RW_IPV4;
    if (inet_aton(str, (&in)) <= 0){
      return FALSE;
    }
    ip_prefaddr->u.v4.addr = ntohl(in.s_addr);
  }
  if (slash){
    char *end = NULL;
    unsigned long res = strtoul(slash+1, &end, 0);
    if (end && *end != '\0') {
      return FALSE;
    }
    ip_prefaddr->masklen = (uint8_t)res;
  }
  return TRUE;
}
示例#16
0
static void
rwmsgbroker__component__instance_start(RwTaskletPluginComponent *self,
					RwTaskletPluginComponentHandle *h_component,
					RwTaskletPluginInstanceHandle *h_instance)
{
  rwmsgbroker_component_ptr_t component;
  rwmsgbroker_instance_ptr_t instance;
  rwcal_module_ptr_t rwcal;

  // Validate input parameters
  component = (rwmsgbroker_component_ptr_t) h_component->priv;
  RW_CF_TYPE_VALIDATE(component, rwmsgbroker_component_ptr_t);
  instance = (rwmsgbroker_instance_ptr_t) h_instance->priv;
  RW_CF_TYPE_VALIDATE(instance, rwmsgbroker_instance_ptr_t);

  // The instance is started so print a debug message
  RWTRACE_INFO(instance->rwtasklet_info->rwtrace_instance,
	             RWTRACE_CATEGORY_RWTASKLET,
	             "RW.MsgBroker -- Tasklet [%d] is started on VM [%d]!",
               instance->rwtasklet_info->identity.rwtasklet_instance_id, //0);
               instance->rwtasklet_info->rwvcs->identity.rwvm_instance_id);

  rwvcs_instance_ptr_t rwvcs = instance->rwtasklet_info->rwvcs;
  RW_ASSERT(rwvcs);
  int rwvm_instance_id = rwvcs->identity.rwvm_instance_id;
  RW_ASSERT(rwvcs->pb_rwmanifest
            && rwvcs->pb_rwmanifest->init_phase
            && rwvcs->pb_rwmanifest->init_phase->settings
            && rwvcs->pb_rwmanifest->init_phase->settings->rwmsg);
  int multi_broker = (rwvcs->pb_rwmanifest->init_phase->settings->rwmsg->multi_broker &&
                      rwvcs->pb_rwmanifest->init_phase->settings->rwmsg->multi_broker->has_enable &&
                      rwvcs->pb_rwmanifest->init_phase->settings->rwmsg->multi_broker->enable);

  char *ext_ip_address = instance->rwtasklet_info->rwvcs->identity.vm_ip_address;
  RWTRACE_INFO(instance->rwtasklet_info->rwtrace_instance,
               RWTRACE_CATEGORY_RWTASKLET,
               "RW.MsgBroker -- Tasklet [%d] is started on VM [%d] ip-addr [%s] multi_broker [%d]!\n",
               instance->rwtasklet_info->identity.rwtasklet_instance_id,
               rwvm_instance_id, ext_ip_address,
               multi_broker);

  int sid = 1;
  rwcal = ((rwvx_instance_t*)(instance->rwtasklet_info->rwvx))->rwcal_module;
  instance->broker = rwmsg_broker_create(sid,
                                         (multi_broker?rwvm_instance_id:0),
                                         ext_ip_address,
                                         instance->rwtasklet_info->rwsched_instance,
                                         instance->rwtasklet_info->rwsched_tasklet_info,
                                         rwcal,
                                         rwtasklet_info_is_collapse_thread(instance->rwtasklet_info), /* mainq */
                                         instance->rwtasklet_info->rwmsg_endpoint,
                                         instance->rwtasklet_info);

  RW_ASSERT(instance->broker);

  rw_status_t rs;
  rs = rwmsg_broker_dts_registration (instance);
  RW_ASSERT(rs == RW_STATUS_SUCCESS);
}
示例#17
0
文件: rwmain.c 项目: RIFTIO/RIFT.ware
/*
 * Called when we get a response from DTS with any additional component
 * definitions added to the inventory via runtime configuration.
 *
 * Adds any new components to the manifest held by rwvcs and then schedules
 * the init_phase.
 */
static void on_inventory_update(rwdts_xact_t * xact, rwdts_xact_status_t* xact_status, void * ud)
{
  //rw_status_t status;
  struct rwmain_gi * rwmain;
  rwvcs_instance_ptr_t rwvcs;
  vcs_manifest_inventory * ret_inventory;
  vcs_manifest_inventory * inventory;


  rwmain = (struct rwmain_gi *)ud;
  rwvcs = rwmain->rwvx->rwvcs;
  RW_CF_TYPE_VALIDATE(rwvcs, rwvcs_instance_ptr_t);

  if (xact_status->status == RWDTS_XACT_FAILURE || xact_status->status == RWDTS_XACT_ABORTED) {
    rwmain_trace_info(rwmain, "Lookup of component probably failed");
    goto done;
  }

  rwmain_trace_info(rwmain, "Updating inventory");

  rwdts_query_result_t *qrslt = rwdts_xact_query_result(xact, 0);  
  while (qrslt) {
    ret_inventory = (vcs_manifest_inventory*)(qrslt->message);
    RW_ASSERT(ret_inventory);
    RW_ASSERT(ret_inventory->base.descriptor == RWPB_G_MSG_PBCMD(RwManifest_data_Manifest_Inventory));

    inventory = rwvcs->pb_rwmanifest->inventory;
    for (size_t i = 0; i < ret_inventory->n_component; ++i) {
      // Any updates to the static manifest are going to be ignored.
      if (rwvcs_manifest_have_component(rwvcs, ret_inventory->component[i]->component_name)) {
        continue;
      }

      inventory->component = (vcs_manifest_component **)realloc(
          inventory->component,
          sizeof(vcs_manifest_component *) * (inventory->n_component + 1));
      RW_ASSERT(inventory->component);
      inventory->component[inventory->n_component] = (vcs_manifest_component*)protobuf_c_message_duplicate(
          NULL,
          &ret_inventory->component[i]->base,
          ret_inventory->component[i]->base.descriptor);
      inventory->n_component++;

      rwmain_trace_info(
          rwmain,
          "Updating inventory with %s",
          ret_inventory->component[i]->component_name);
    }
    qrslt = rwdts_xact_query_result(xact, 0);
  }

done:
  schedule_next(rwmain, init_phase, 0, NULL);
}
示例#18
0
/**
 * Function to compare two character buffer keys of a SkipList
 */
int
rw_sklist_comp_charbuf(void * v1, void * v2)
{
  const uint8_t *p1, *p2;
  int32_t result;
  RW_ASSERT(v1 != NULL);
  RW_ASSERT(v2 != NULL);
  p1 = (const uint8_t *)v1;
  p2 = (const uint8_t *)v2;
  result = (int32_t)*p1 - (int32_t)*p2;
  return result?result:strcmp((const char *)p1,(const char *)p2); /* try to avoid strcmp */
}
示例#19
0
void rwdts_appconf_prepare_complete_na(rwdts_appconf_t *ac,
                                       const rwdts_xact_info_t *xact_info) {
  RW_ASSERT_TYPE(ac, rwdts_appconf_t);
  rwdts_appconf_xact_t *appx = (rwdts_appconf_xact_t *)xact_info->xact->group[ac->group->id]->scratch;
  RW_ASSERT_TYPE(appx, rwdts_appconf_xact_t);

  RW_ASSERT(appx->queries_in > 0);
  appx->queries_out++;
  RW_ASSERT(appx->queries_out <= appx->queries_in);

  rwdts_xact_info_respond_keyspec(xact_info, RWDTS_XACT_RSP_CODE_NA, NULL, NULL);
}
示例#20
0
文件: rwmain.c 项目: RIFTIO/RIFT.ware
rw_status_t process_init_phase(struct rwmain_gi * rwmain)
{
  rw_status_t status;
  rwvcs_instance_ptr_t rwvcs;

  rwvcs = rwmain->rwvx->rwvcs;

  if (rwvcs->pb_rwmanifest->init_phase->settings->rwvcs->no_autostart == false) {
    vcs_manifest_component *m_component;
    char * instance_name = NULL;

    instance_name = to_instance_name(rwmain->component_name, rwmain->instance_id);
    RW_ASSERT(*instance_name);

    // Lookup the component to start
    status = rwvcs_manifest_component_lookup(rwvcs, rwmain->component_name, &m_component);
    rwmain_trace_info(rwmain, "rwvcs_manifest_component_lookup %s", rwmain->component_name);
    RW_ASSERT(status == RW_STATUS_SUCCESS);

    if (m_component->component_type == RWVCS_TYPES_COMPONENT_TYPE_RWVM) {
      RWVCS_LATENCY_CHK_PRE(rwmain->rwvx->rwsched);
      rwmain_rwvm_init(
          rwmain,
          m_component->rwvm,
          rwmain->component_name,
          rwmain->instance_id,
          instance_name,
          rwmain->parent_id);
      RWVCS_LATENCY_CHK_POST(rwmain->rwvx->rwtrace, RWTRACE_CATEGORY_RWMAIN,
                             rwmain_rwvm_init, "rwmain_rwvm_init:%s", instance_name);
    } else if (m_component->component_type == RWVCS_TYPES_COMPONENT_TYPE_RWPROC) {
      RWVCS_LATENCY_CHK_PRE(rwmain->rwvx->rwsched);
      rwmain_rwproc_init(
          rwmain,
          m_component->rwproc,
          rwmain->component_name,
          rwmain->instance_id,
          instance_name,
          rwmain->parent_id);
      RWVCS_LATENCY_CHK_POST(rwmain->rwvx->rwtrace, RWTRACE_CATEGORY_RWMAIN,
                             rwmain_rwproc_init, "rwmain_rwproc_init:%s", instance_name);
    } else {
      rwmain_trace_crit(
          rwmain,
          "rwmain cannot start a component which is not a vm or process (%s)",
          m_component->component_name);
      RW_CRASH();
    }
  }

  return RW_STATUS_SUCCESS;
}
示例#21
0
static protobuf_c_boolean rw_ip_prefix_t_init_usebody(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  void* void_member)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ip_prefix_t_helper);
  RW_ASSERT(void_member);
  rw_ip_prefix_t* ip_prefaddr = (rw_ip_prefix_t*)void_member;
  memset(ip_prefaddr, 0, sizeof(*ip_prefaddr));
  ip_prefaddr->ip_v = RW_IPV6;
  return TRUE;
}
示例#22
0
static size_t rw_ip_addr_t_get_packed_size(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  const void* void_member)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ip_addr_t_helper);
  RW_ASSERT(void_member);
  const rw_ip_addr_t* ip_addr = (const rw_ip_addr_t*)void_member;
  char str[INET6_ADDRSTRLEN*2];
  rw_ip_addr_t_get_str(str, ip_addr);
  return strlen(str);
}
示例#23
0
static size_t rw_call_id_t_get_packed_size(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  const void* void_member)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_call_id_t_helper);
  RW_ASSERT(void_member);
  const rw_call_id_t* call_id = (const rw_call_id_t*)void_member;
  char str[RW_CALL_ID_STRLEN*2];
  rw_call_id_t_get_str(str, call_id);
  return strlen(str);
}
示例#24
0
/**
 * Function to compare two character pointer keys of a SkipList
 */
int rw_sklist_comp_charptr(void * v1, void * v2)
{
  const char *p1, *p2;
  int result;
  RW_ASSERT(v1 != NULL);
  RW_ASSERT(v2 != NULL);
  p1 = *(const char **)v1;
  p2 = *(const char **)v2;
  RW_ASSERT(p1 != NULL);
  RW_ASSERT(p2 != NULL);
  result = (int)*p1 - (int)*p2;
  return result?result:strcmp(p1,p2); /* try to avoid strcmp */
}
示例#25
0
/**
 * Free an Empty SkipList
 */
rw_status_t
rw_sklist_free(rw_sklist_t *skl)
{
  RW_ASSERT(NULL != skl);
  RW_ASSERT(RW_SKLIST_LENGTH(skl) == 0);
  RW_ASSERT(NULL == skl->head);

  if (skl->dynamic) {
    /* RW_ZERO_VARIABLE(skl); */
    RW_FREE(skl);
  }

  return RW_STATUS_SUCCESS;
}
示例#26
0
// ATTN: Obsolete. Please replace uses of this with proper c-type usage
int rw_c_type_helper_rw_mac_addr_t_set_from_str_impl(void *p, const char *str, size_t str_len)
{
  rw_mac_addr_t *mac_addr = (rw_mac_addr_t*)p;
  RW_ASSERT(mac_addr != NULL);
  RW_ASSERT(str != NULL);

  memset(mac_addr, 0, sizeof(*mac_addr));

  // Assume MAC-address in the format 00-aa-bb-cc-dd-ee
  ConverMacAddressStringIntoByte((char*)str,
                                 (unsigned char*)mac_addr->addr,
                                 ':'); //Bytes separator in MAC address string like 00-aa-bb-cc-dd-ee
  return(0);
}
示例#27
0
static int rw_ipV6_addr_t_compare(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  const void* void_a,
  const void* void_b)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ipV6_addr_t_helper);
  RW_ASSERT(void_a);
  RW_ASSERT(void_b);
  const rw_ipV6_addr_t* a = (const rw_ipV6_addr_t*)void_a;
  const rw_ipV6_addr_t* b = (const rw_ipV6_addr_t*)void_b;
  return memcmp(a, b, sizeof(rw_ipV6_addr_t));
}
示例#28
0
static int rw_ipV4_addr_t_compare(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  const void* void_a,
  const void* void_b)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ipV4_addr_t_helper);
  RW_ASSERT(void_a);
  RW_ASSERT(void_b);
  const rw_ipV4_addr_t* a = (const rw_ipV4_addr_t*)void_a;
  const rw_ipV4_addr_t* b = (const rw_ipV4_addr_t*)void_b;
  return (int)a->addr - (int)b->addr;
}
示例#29
0
static int rw_ipV4_prefix_t_compare(
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  const void* void_a,
  const void* void_b)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ipV4_prefix_t_helper);
  RW_ASSERT(void_a);
  RW_ASSERT(void_b);
  const rw_ip_prefix_t* a = (const rw_ip_prefix_t*)void_a;
  const rw_ip_prefix_t* b = (const rw_ip_prefix_t*)void_b;
  return rw_ip_prefix_cmp(a, b);  
}
示例#30
0
static protobuf_c_boolean rw_ip_addr_t_unpack(
  ProtobufCInstance *instance,
  const ProtobufCCTypeDescriptor* ctypedesc,
  const ProtobufCFieldDescriptor* fielddesc,
  size_t in_size,
  const uint8_t* in,
  protobuf_c_boolean maybe_clear,
  void* void_member)
{
  UNUSED(fielddesc);
  RW_ASSERT(ctypedesc == &rw_ip_addr_t_helper);
  RW_ASSERT(void_member);
  RW_ASSERT(in);
  RW_ASSERT(instance);
  rw_ip_addr_t* ip_addr = (rw_ip_addr_t*)void_member;

  char str[INET6_ADDRSTRLEN*2];
  if (in_size >= sizeof(str)) {
    return FALSE;
  }
  memcpy(str, in, in_size);
  str[in_size] = 0;

  memset(ip_addr, 0, sizeof(*ip_addr));

  // Check if this is an IPv6 address
  if (strchr(str, ':')) {
    struct in6_addr in6;
    int i;
    ip_addr->ip_v = RW_IPV6;

    if (inet_pton(AF_INET6, str, &(in6)) <= 0) {
      return FALSE;
    }
    for (i = 0; i < 4; i++){
      ip_addr->u.v6.addr[i] = ntohl(in6.s6_addr32[i]);
    }
  } else {
    struct in_addr in;
    // Assume IPv4 address
    ip_addr->ip_v = RW_IPV4;
    if (inet_aton(str, (&in)) <= 0){
      return FALSE;
    }
    ip_addr->u.v4.addr = ntohl(in.s_addr);
  }
  return TRUE;
}