Changeset 2721
- Timestamp:
- 07/12/10 19:06:19 (14 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r2711 r2721 929 929 ushort srvid; 930 930 int cidx; 931 int reader_avail[CS_MAXREADER]; 931 932 } GCC_PACK GET_READER_STAT; 932 933 … … 1182 1183 extern void init_stat(); 1183 1184 extern void add_reader_stat(ADD_READER_STAT *add_stat); 1184 extern int get_best_reader( ushort caid, ulong prid, ushort srvid);1185 extern int get_best_reader(GET_READER_STAT *grs); 1185 1186 1186 1187 #ifdef HAVE_PCSC -
trunk/module-stat.c
r2712 r2721 229 229 * returns ridx when found or -1 when not found 230 230 */ 231 int get_best_reader( ushort caid, ulong prid, ushort srvid)231 int get_best_reader(GET_READER_STAT *grs) 232 232 { 233 233 int i; … … 236 236 READER_STAT *stat, *best_stat = NULL; 237 237 for (i = 0; i < CS_MAXREADER; i++) { 238 if (reader_stat[i] && reader[i].pid && reader[i].cs_idx) { 239 if (reader[i].tcp_connected || reader[i].card_status == CARD_INSERTED) { 240 int weight = reader[i].lb_weight <= 0?100:reader[i].lb_weight; 241 stat = get_stat(i, caid, prid, srvid); 242 if (!stat) { 243 add_stat(i, caid, prid, srvid, 1, 0); 244 return -1; //this reader is active (now) but we need statistics first! 245 } 238 if (reader_stat[i] && grs->reader_avail[i]) { 239 int weight = reader[i].lb_weight <= 0?100:reader[i].lb_weight; 240 stat = get_stat(i, grs->caid, grs->prid, grs->srvid); 241 if (!stat) { 242 add_stat(i, grs->caid, grs->prid, grs->srvid, 1, 0); 243 return -1; //this reader is active (now) but we need statistics first! 244 } 246 245 247 if (stat->ecm_count > MAX_ECM_COUNT) { 248 reset_stat(caid, prid, srvid); 246 if (stat->ecm_count > MAX_ECM_COUNT) { 247 reset_stat(grs->caid, grs->prid, grs->srvid); 248 return -1; 249 } 250 251 if (stat->rc == 0 && stat->ecm_count < MIN_ECM_COUNT) { 252 cs_debug_mask(D_TRACE, "loadbalance: reader %s needs more statistics", reader[i].label); 253 return -1; //need more statistics! 254 } 255 256 257 //Reader can decode this service (rc==0) and has MIN_ECM_COUNT ecms: 258 if (stat->rc == 0) { 259 //get 260 switch (cfg->reader_auto_loadbalance) { 261 case LB_NONE: 262 cs_debug_mask(D_TRACE, "loadbalance disabled"); 263 return -1; 264 case LB_FASTEST_READER_FIRST: 265 current = stat->time_avg * 100 / weight; 266 break; 267 case LB_OLDEST_READER_FIRST: 268 current = (reader[i].lb_last-nulltime) * 100 / weight; 269 break; 270 case LB_LOWEST_USAGELEVEL: 271 current = reader[i].lb_usagelevel * 100 / weight; 272 break; 273 default: 249 274 return -1; 250 275 } 251 252 if (stat->rc == 0 && stat->ecm_count < MIN_ECM_COUNT) { 253 cs_debug_mask(D_TRACE, "loadbalance: reader %s needs more statistics", reader[i].label); 254 return -1; //need more statistics! 255 } 256 257 258 //Reader can decode this service (rc==0) and has MIN_ECM_COUNT ecms: 259 if (stat->rc == 0) { 260 //get 261 switch (cfg->reader_auto_loadbalance) { 262 case LB_NONE: 263 cs_debug_mask(D_TRACE, "loadbalance disabled"); 264 return -1; 265 case LB_FASTEST_READER_FIRST: 266 current = stat->time_avg * 100 / weight; 267 break; 268 case LB_OLDEST_READER_FIRST: 269 current = (reader[i].lb_last-nulltime) * 100 / weight; 270 break; 271 case LB_LOWEST_USAGELEVEL: 272 current = reader[i].lb_usagelevel * 100 / weight; 273 break; 274 default: 275 return -1; 276 } 277 278 cs_debug_mask(D_TRACE, "loadbalance reader %s value %d", reader[i].label, current); 279 if (!best_stat || current < best) { 280 if (!reader[i].ph.c_available 281 || reader[i].ph.c_available(i, 282 AVAIL_CHECK_LOADBALANCE)) { 283 best_stat = stat; 284 best_ridx = i; 285 best = current; 286 } 276 277 cs_debug_mask(D_TRACE, "loadbalance reader %s value %d", reader[i].label, current); 278 if (!best_stat || current < best) { 279 if (!reader[i].ph.c_available 280 || reader[i].ph.c_available(i, 281 AVAIL_CHECK_LOADBALANCE)) { 282 best_stat = stat; 283 best_ridx = i; 284 best = current; 287 285 } 288 286 } -
trunk/module-stat.h
r2385 r2721 19 19 void add_reader_stat(ADD_READER_STAT *stat); 20 20 21 int get_best_reader( ushort caid, ulong prid, ushort srvid);21 int get_best_reader(GET_READER_STAT *grs); -
trunk/oscam.c
r2718 r2721 2178 2178 2179 2179 //receive best reader from master process. Call this function from client! 2180 int recv_best_reader(ECM_REQUEST *er )2180 int recv_best_reader(ECM_REQUEST *er, int *reader_avail) 2181 2181 { 2182 2182 if (!cfg->reader_auto_loadbalance) … … 2188 2188 grs.srvid = er->srvid; 2189 2189 grs.cidx = cs_idx; 2190 memcpy(grs.reader_avail, reader_avail, sizeof(int)*CS_MAXREADER); 2190 2191 cs_debug_mask(D_TRACE, "requesting client %s best reader for %04X/%04X/%04X", username(cs_idx), grs.caid, grs.prid, grs.srvid); 2191 2192 write_to_pipe(fd_c2m, PIP_ID_BES, (uchar*)&grs, sizeof(GET_READER_STAT)); … … 2380 2381 2381 2382 if (cfg->reader_auto_loadbalance) { 2382 int best_ridx = recv_best_reader(er); 2383 int reader_avail[CS_MAXREADER]; 2384 for (i =0; i < CS_MAXREADER; i++) 2385 reader_avail[i] = matching_reader(er, &reader[i]); 2386 2387 int best_ridx = recv_best_reader(er, reader_avail); 2383 2388 for (i = m = 0; i < CS_MAXREADER; i++) 2384 if ( matching_reader(er, &reader[i])) {2389 if (reader_avail[i]) { 2385 2390 //When autobalance enabled, all other readers are fallbacks: 2386 2391 m|=er->reader[i] = (best_ridx >= 0 && best_ridx != i)? 2: 1; … … 2594 2599 if (er->stage) { 2595 2600 er->rc=5; // timeout 2601 if (cfg->reader_auto_loadbalance) { 2602 int r; 2603 for (r=0; r<CS_MAXREADER; r++) 2604 if (er->reader[r]) 2605 send_reader_stat(r, er, 5); 2606 } 2596 2607 send_dcw(er); 2597 2608 continue; … … 2681 2692 { 2682 2693 //cs_debug_mask(D_TRACE, "got request for best reader for %04X/%04X/%04X", grs->caid, grs->prid, grs->srvid); 2683 int ridx = get_best_reader(grs ->caid, grs->prid, grs->srvid);2694 int ridx = get_best_reader(grs); 2684 2695 //cs_debug_mask(D_TRACE, "sending best reader %d", ridx); 2685 2696 write_to_pipe(client[grs->cidx].fd_m2c, PIP_ID_BES, (uchar*)&ridx, sizeof(ridx));
Note:
See TracChangeset
for help on using the changeset viewer.