Changeset b5e3f15c3ecb424e105dd5a93288c5f134de6816

Show
Ignore:
Timestamp:
04/06/09 00:26:38 (3 years ago)
Author:
Neutron Soutmun <neo.neutron@…>
Children:
8ecd62957f2caca419e633605e4b81d2936660ae
Parents:
59f8607b48ef867c2d3338c9c840006b0f459b9d
git-committer:
Neutron Soutmun <neo.neutron@…> (04/06/09 00:26:38)
Message:

Fix the member deleted during polling process

2009-04-06 Neutron Soutmun <neo.neutron@…>

  • src/rahunasd.c, src/rh-task-{memset,ipset}.c: Fix the member deleted during polling process that cause the process will stop unexpectly.
  • src/rh-task-dbset.c:
    • Using task_req and rh_task_startsess to restore set data from DB instead of manual call.
  • src/rh-task.h: Add bandwidth_slot_id into task_req structure.
  • src/rh-xmlrpc-server.c: Initial session_start = 0 to trigger the program to use the current timestamp;
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r59f8607 rb5e3f15  
     12009-04-06  Neutron Soutmun <neo.neutron@gmail.com> 
     2 
     3        * src/rahunasd.c, src/rh-task-{memset,ipset}.c: Fix the member deleted during 
     4          polling process that cause the process will stop unexpectly. 
     5        * src/rh-task-dbset.c: 
     6          - Using task_req and rh_task_startsess to restore set data from DB instead 
     7            of manual call. 
     8        * src/rh-task.h: Add bandwidth_slot_id into task_req structure. 
     9        * src/rh-xmlrpc-server.c: Initial session_start = 0 to trigger the program 
     10          to use the current timestamp; 
     11 
    1122009-04-03  Neutron Soutmun <neo.neutron@gmail.com> 
    213 
  • src/rahunasd.c

    rd5429ac rb5e3f15  
    102102  while (runner != NULL) { 
    103103    member = (struct rahunas_member *)runner->data; 
     104    runner = g_list_next(runner); 
     105 
    104106    id = member->id; 
    105107 
     
    130132      res = rh_task_stopsess(process->vs, &req); 
    131133    } 
    132  
    133     runner = g_list_next(runner); 
    134134  } 
    135135} 
  • src/rh-task-dbset.c

    rd5429ac rb5e3f15  
    1414#include "rh-ipset.h" 
    1515#include "rh-utils.h" 
    16 #include "rh-task-memset.h" 
    17 #include "rh-task-bandwidth.h" 
    1816 
    1917struct dbset_row { 
     
    208206  GList *member_node = NULL; 
    209207  struct rahunas_member *member = NULL; 
    210   struct bandwidth_req bw_req; 
     208  struct task_req req; 
     209  unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0}; 
    211210  unsigned char max_try = 3; 
    212211  
     
    226225    id = iptoid(vs->v_map, row->ip); 
    227226 
    228     DP("id=%d", id); 
    229      
    230227    if (id < 0) 
    231228      continue; 
    232229 
    233     member_node = member_get_node_by_id(vs, id); 
    234  
    235     if (member_node == NULL) { 
    236       DP("Create new member"); 
    237       member = (struct rahunas_member *) rh_malloc(sizeof(struct rahunas_member)); 
    238       if (member == NULL) 
    239         continue;  
    240        
    241       memset(member, 0, sizeof(struct rahunas_member)); 
    242       vs->v_map->members = 
    243         g_list_insert_sorted(vs->v_map->members, member, idcmp); 
    244     } else { 
    245       DP("Member already exists"); 
    246       member = (struct rahunas_member *) member_node->data; 
    247     } 
    248  
    249     // MEMSET 
    250     member->id = id; 
    251     member->session_id = g_strdup(row->session_id); 
    252     member->username   = g_strdup(row->username); 
    253     parse_mac(row->mac, &member->mac_address);  
    254     memcpy(&member->session_start, &row->session_start,  
    255            sizeof(time_t)); 
    256     memcpy(&member->session_timeout, &row->session_timeout,  
    257            sizeof(time_t)); 
    258     member->bandwidth_slot_id = row->bandwidth_slot_id; 
    259     member->bandwidth_max_down = row->bandwidth_max_down; 
    260     member->bandwidth_max_up = row->bandwidth_max_up; 
    261  
    262     // IPSET 
    263     DP("Restore, ip=%s, mac=%s", row->ip, row->mac); 
    264     set_adtip(vs->v_set, row->ip, row->mac, IP_SET_OP_ADD_IP); 
    265  
    266  
    267     // Bandwidth 
    268     sprintf(bw_req.ip, "%s", row->ip); 
    269     sprintf(bw_req.bandwidth_max_down, "%lu", row->bandwidth_max_down); 
    270     sprintf(bw_req.bandwidth_max_up, "%lu", row->bandwidth_max_up); 
    271     sprintf(bw_req.slot_id, "%u", row->bandwidth_slot_id);  
    272  
    273     mark_reserved_slot_id(row->bandwidth_slot_id); 
    274  
    275     while (max_try-- > 0) {  
    276       if (bandwidth_add(vs, &bw_req) == 0) 
    277         break; 
    278     } 
     230    req.id = id; 
     231    req.vserver_id = atoi(row->vserver_id); 
     232    req.username = row->username; 
     233    req.session_id = row->session_id; 
     234    parse_mac(row->mac, &ethernet); 
     235    memcpy(req.mac_address, &ethernet, ETH_ALEN); 
     236 
     237    req.session_start = row->session_start; 
     238    req.session_timeout = row->session_timeout; 
     239 
     240    req.bandwidth_slot_id = row->bandwidth_slot_id; 
     241    req.bandwidth_max_down = row->bandwidth_max_down;  
     242    req.bandwidth_max_up = row->bandwidth_max_up; 
     243 
     244    rh_task_startsess(vs, &req); 
    279245  } 
    280246  return TRUE; 
     
    373339                 PROGRAM, NULL, NULL, 
    374340                 GDA_CONNECTION_OPTIONS_NONE, NULL); 
    375    
     341 
    376342  strftime(&time_str, sizeof time_str, "%s", localtime(&req->session_start)); 
    377343  strftime(&time_str2, sizeof time_str2, "%s",  
  • src/rh-task-ipset.c

    rd5429ac rb5e3f15  
    3434  while (runner != NULL) { 
    3535    member = (struct rahunas_member *) runner->data; 
     36    runner = g_list_next(runner); 
     37 
    3638    id = member->id; 
    3739 
     
    4244    send_xmlrpc_stopacct(process->vs, id, RH_RADIUS_TERM_NAS_REBOOT); 
    4345    rh_task_stopsess(process->vs, &req); 
    44  
    45     runner = g_list_next(runner); 
    4646  } 
    4747} 
  • src/rh-task-memset.c

    rd5429ac rb5e3f15  
    3232gint idcmp(struct rahunas_member *a, struct rahunas_member *b) 
    3333{ 
    34   if (a == NULL || b == NULL) 
    35     return 0; 
    36  
    3734  if (a != NULL && b != NULL) 
    3835    return (a->id - b->id); 
     36 
     37  return -1; 
    3938} 
    4039 
     
    6665{ 
    6766  GList *runner = NULL; 
     67  GList *deleting = NULL; 
    6868  struct rahunas_member *member = NULL; 
    6969 
     
    7878      member = (struct rahunas_member *) runner->data;  
    7979 
     80      DP("Cleanup IP: %s", idtoip(vs->v_map, member->id)); 
     81 
    8082      rh_free_member(member); 
    81  
    82       runner = g_list_delete_link(runner, runner); 
     83      deleting = runner; 
     84      runner = g_list_next(runner); 
     85 
     86      vs->v_map->members = g_list_delete_link(vs->v_map->members, deleting); 
    8387    } 
    8488 
     
    123127 
    124128    vs->v_map->members =  
    125       g_list_insert_sorted(vs->v_map->members, member, idcmp); 
     129        g_list_insert_sorted(vs->v_map->members, member, idcmp); 
     130 
    126131  } else { 
    127132    DP("Member already exists"); 
     
    145150    member->session_id = termstring; 
    146151 
    147   time(&(member->session_start)); 
    148   memcpy(&req->session_start, &member->session_start,  
    149          sizeof(time_t)); 
     152  if (req->session_start == 0) { 
     153    time(&(req->session_start)); 
     154  }  
     155 
     156  memcpy(&member->session_start, &req->session_start, sizeof(time_t)); 
    150157 
    151158  memcpy(&member->mac_address, &req->mac_address, ETH_ALEN); 
  • src/rh-task.h

    rd5429ac rb5e3f15  
    2020  time_t session_start; 
    2121  time_t session_timeout; 
     22  unsigned short bandwidth_slot_id;  
    2223  unsigned long bandwidth_max_down; 
    2324  unsigned long bandwidth_max_up; 
  • src/rh-xmlrpc-server.c

    rd5429ac rb5e3f15  
    7979  parse_mac(mac_address, &ethernet); 
    8080  memcpy(req.mac_address, &ethernet, ETH_ALEN); 
     81  req.session_start = 0; 
    8182  req.session_timeout = 0; 
    8283