Changeset 5126
Legend:
- Unmodified
- Added
- Removed
-
trunk/globals.h
r5092 r5126 588 588 int32_t reader_avail; //count of available readers 589 589 int32_t reader_count; //count of contacted readers 590 struct ecm_request_t *beta_ptr_to_nagra; //if auto-betatunnel, beta ecm points to the original nagra ecm591 590 #ifdef CS_WITH_DOUBLECHECK 592 591 int32_t checked; -
trunk/module-stat.c
r5117 r5126 323 323 else 324 324 save_stat_to_file_thread(); 325 } 326 327 /** 328 * fail_factor is multiplied to the reopen_time. This function increases the fail_factor 329 **/ 330 void inc_fail(READER_STAT *stat) 331 { 332 if (stat->fail_factor <= 0) 333 stat->fail_factor = 1; 334 else 335 stat->fail_factor *= 2; 325 336 } 326 337 … … 427 438 428 439 stat->rc = rc; 429 stat->fail_factor++;440 inc_fail(stat); 430 441 stat->last_received = ctime; 431 442 … … 440 451 stat->ecm_count > 0) { 441 452 stat->rc = 5; 442 stat->fail_factor++;453 inc_fail(stat); 443 454 } 444 455 else if ((rdr->client->login+(int)(2*cfg.ctimeout/1000)) < ctime && rdr->client->pending < 5) { //reader is longer than 5s connected && not more then 5 pending ecms 445 456 stat->rc = 5; 446 stat->fail_factor++;457 inc_fail(stat); 447 458 } 448 459 … … 618 629 ushort caid_to = get_betatunnel_caid_to(er->caid); 619 630 if (caid_to) { 620 int needs_stats = 0;631 int needs_stats_nagra, needs_stats_beta = 0; 621 632 622 633 int32_t time_nagra = 0; 623 634 int32_t time_beta = 0; 635 int32_t weight; 624 636 625 637 READER_STAT *stat_nagra; … … 628 640 //What is faster? nagra or beta? 629 641 it = ll_iter_create(er->matching_rdr); 630 while ((rdr=ll_iter_next(it)) && !needs_stats) { 642 while ((rdr=ll_iter_next(it)) && !needs_stats_nagra && !needs_stats_beta) { 643 weight = rdr->lb_weight; 644 if (weight <= 0) weight = 1; 645 631 646 stat_nagra = get_stat(rdr, er->caid, prid, er->srvid, er->l); 632 647 stat_beta = get_stat(rdr, caid_to, prid, er->srvid, er->l+10); 633 648 634 649 if (stat_nagra && stat_nagra->rc == 0 && (!time_nagra || stat_nagra->time_avg < time_nagra)) 635 time_nagra = stat_nagra->time_avg ;650 time_nagra = stat_nagra->time_avg/weight; 636 651 if (stat_beta && stat_beta->rc == 0 && (!time_beta || stat_beta->time_avg < time_beta)) 637 time_beta = stat_beta->time_avg ;652 time_beta = stat_beta->time_avg/weight; 638 653 639 if (!stat_nagra || !stat_beta) 640 needs_stats = 1; //Uncomplete reader evaluation, we need more stats! 654 //Uncomplete reader evaluation, we need more stats! 655 if (!stat_nagra) 656 needs_stats_nagra = 1; 657 if (!stat_beta) 658 needs_stats_beta = 1; 641 659 } 642 660 ll_iter_release(it); 643 661 644 662 //if we needs stats, we send 2 ecm requests: 18xx and 17xx: 645 if (needs_stats ) {663 if (needs_stats_nagra || needs_stats_beta) { 646 664 cs_debug_mask(D_TRACE, "loadbalancer-betatunnel %04X:%04X needs more statistics...", er->caid, caid_to); 647 ECM_REQUEST *er_beta = get_ecmtask(); 648 er_beta->ocaid = caid_to; 649 er_beta->caid = er->caid; 650 er_beta->prid = prid; 651 er_beta->srvid = er->srvid; 652 memcpy(er_beta->ecm, er->ecm, sizeof(er->ecm)); 653 er_beta->l = er->l; 654 er_beta->client = er->client; 655 er_beta->beta_ptr_to_nagra = er; 656 er->beta_ptr_to_nagra = er_beta; //link back 657 convert_to_beta(er->client, er_beta, caid_to); 658 er_beta->btun = 0; 659 get_cw(er->client, er_beta); 660 } 661 else if (time_beta && (!time_nagra || time_beta < time_nagra)) { 665 if (needs_stats_beta) 666 convert_to_beta(er->client, er, caid_to); 667 } 668 else if (time_beta && (!time_nagra || time_beta <= time_nagra)) { 662 669 cs_debug_mask(D_TRACE, "loadbalancer-betatunnel %04X:%04X selected beta: n%dms>b%dms", er->caid, caid_to, time_nagra, time_beta); 663 670 convert_to_beta(er->client, er, caid_to); … … 878 885 ll_destroy(timeout_services); 879 886 880 if (!n) //no best reader found? reopen if we have ecm_count>0 881 { 882 cs_debug_mask(D_TRACE, "loadbalancer: NO MATCHING READER FOUND, reopen last valid:"); 883 it = ll_iter_create(er->matching_rdr); 884 while ((rdr=ll_iter_next(it))) { 885 stat = get_stat(rdr, er->caid, prid, er->srvid, er->l); 886 if (stat && stat->ecm_count>0 && stat->last_received+get_reopen_seconds(stat) < current_time) { 887 if (!ll_contains(result, rdr) && nreaders) { 888 ll_append(result, rdr); 889 nreaders--; 887 if (ll_count(result) < ll_count(er->matching_rdr)) { 888 if (!n) //no best reader found? reopen if we have ecm_count>0 889 { 890 cs_debug_mask(D_TRACE, "loadbalancer: NO MATCHING READER FOUND, reopen last valid:"); 891 it = ll_iter_create(er->matching_rdr); 892 while ((rdr=ll_iter_next(it))) { 893 stat = get_stat(rdr, er->caid, prid, er->srvid, er->l); 894 if (stat && stat->ecm_count>0 && stat->last_received+get_reopen_seconds(stat) < current_time) { 895 if (!ll_contains(result, rdr) && nreaders) { 896 ll_append(result, rdr); 897 nreaders--; 890 898 } 891 899 n++; 892 900 cs_debug_mask(D_TRACE, "loadbalancer: reopened reader %s", rdr->label); 893 }894 }895 ll_iter_release(it);896 cs_debug_mask(D_TRACE, "loadbalancer: reopened %d readers", n);897 }898 899 //algo for reopen other reader only if responsetime>retrylimit:900 int32_t reopen = !best_rdr || (best_time && (best_time > retrylimit));901 if (reopen) {901 } 902 } 903 ll_iter_release(it); 904 cs_debug_mask(D_TRACE, "loadbalancer: reopened %d readers", n); 905 } 906 907 //algo for reopen other reader only if responsetime>retrylimit: 908 int32_t reopen = !best_rdr || (best_time && (best_time > retrylimit)); 909 if (reopen) { 902 910 #ifdef WITH_DEBUG 903 if (best_rdr)904 cs_debug_mask(D_TRACE, "loadbalancer: reader %s reached retrylimit (%dms), reopening other readers", best_rdr->label, best_time);905 else906 cs_debug_mask(D_TRACE, "loadbalancer: no best reader found, reopening other readers");911 if (best_rdr) 912 cs_debug_mask(D_TRACE, "loadbalancer: reader %s reached retrylimit (%dms), reopening other readers", best_rdr->label, best_time); 913 else 914 cs_debug_mask(D_TRACE, "loadbalancer: no best reader found, reopening other readers"); 907 915 #endif 908 it = ll_iter_create(er->matching_rdr); 909 while ((rdr=ll_iter_next(it)) && nreaders) { 910 stat = get_stat(rdr, er->caid, prid, er->srvid, er->l); 911 912 if (stat && stat->rc != 0) { //retrylimit reached: 913 if (cfg.lb_reopen_mode || stat->last_received+get_reopen_seconds(stat) < current_time) { //Retrying reader every (900/conf) seconds 914 stat->last_received = current_time; 915 nreaders += ll_remove(result, rdr); 916 ll_prepend(result, rdr); 917 nreaders--; 918 cs_debug_mask(D_TRACE, "loadbalancer: retrying reader %s (fail %d)", rdr->label, stat->fail_factor); 916 it = ll_iter_create(er->matching_rdr); 917 while ((rdr=ll_iter_next(it)) && nreaders) { 918 stat = get_stat(rdr, er->caid, prid, er->srvid, er->l); 919 920 if (stat && stat->rc != 0) { //retrylimit reached: 921 if (cfg.lb_reopen_mode || stat->last_received+get_reopen_seconds(stat) < current_time) { //Retrying reader every (900/conf) seconds 922 stat->last_received = current_time; 923 nreaders += ll_remove(result, rdr); 924 ll_prepend(result, rdr); 925 nreaders--; 926 cs_debug_mask(D_TRACE, "loadbalancer: retrying reader %s (fail %d)", rdr->label, stat->fail_factor); 927 } 919 928 } 920 929 } 921 }922 ll_iter_release(it);923 } 924 925 930 ll_iter_release(it); 931 } 932 } 933 934 //Setting return values: 926 935 ll_destroy(er->matching_rdr); 927 936 er->matching_rdr = result; -
trunk/oscam.c
r5125 r5126 2186 2186 } 2187 2187 if (ert) { 2188 //betatunnel:2189 2190 if (ert->beta_ptr_to_nagra) {2191 if (ert->caid >> 8==0x17) { //got a 17xx answer for a 18xx betatunnel request:2192 // this request is created by the lb, betatunnel 17xx for testing:2193 ECM_REQUEST *ecm_nagra = ert->beta_ptr_to_nagra; //18xx2194 if (ert->rc < E_NOTFOUND && ecm_nagra->rc >= E_99) { //found 17xx2195 //replace the orignal request with that:2196 ecm_nagra->rc = ert->rc;2197 ecm_nagra->rcEx = ert->rcEx;2198 ecm_nagra->selected_reader = ert->selected_reader;2199 memcpy(ecm_nagra->msglog, ert->msglog, sizeof(ert->msglog));2200 memcpy(ecm_nagra->cw, ert->cw, sizeof(ert->cw));2201 ll_remove(ecm_nagra->matching_rdr, ecm_nagra->selected_reader);2202 store_cw_in_cache(ecm_nagra, ecm_nagra->selected_reader->grp, ecm_nagra->rc);2203 send_dcw(cl, ecm_nagra);2204 distribute_ecm(ecm_nagra, ert->selected_reader->grp, ert->rc);2205 }2206 return; //do not send it to the client, he hasn't requested that, its from the lb2207 }2208 else2209 {2210 ECM_REQUEST *ecm_beta = ert->beta_ptr_to_nagra; //17xx2211 if (ert->rc >= E_NOTFOUND && ecm_beta->rc >= E_99) { // this is the original 18xx request2212 //if 18xx can't answered, wait for 17xx answer2213 ert->rc = E_99;2214 return;2215 }2216 }2217 }2218 2219 2188 send_dcw(cl, ert); 2220 2189 distribute_ecm(er, ert->selected_reader->grp, (ert->rc<E_NOTFOUND)?E_CACHE2:ert->rc); … … 2657 2626 //Use locking - now default=FALSE, activate on problems! 2658 2627 int32_t locked; 2659 if (cfg.lb_mode && cfg.lb_use_locking && !er->beta_ptr_to_nagra) {2628 if (cfg.lb_mode && cfg.lb_use_locking) { 2660 2629 pthread_mutex_lock(&get_cw_lock); 2661 2630 locked=1;
Note:
See TracChangeset
for help on using the changeset viewer.