X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Fplanner.c;h=c8501e2f35aced2ab93db61374600e0fd921c0ef;hb=3c4bb2012986d596b3ee0e65fac4b2c5b7b01540;hp=e2c1497c76f221d5eedcb5aca31423de0c06d9a9;hpb=cb38d19aa8dc2c5d380ab2d7ad9724a5d99eee5d;p=debian%2Famanda diff --git a/server-src/planner.c b/server-src/planner.c index e2c1497..c8501e2 100644 --- a/server-src/planner.c +++ b/server-src/planner.c @@ -191,6 +191,12 @@ main( int planner_setuid; int exit_status = EXIT_SUCCESS; gboolean no_taper = FALSE; + gboolean from_client = FALSE; + + if (argc > 1 && argv && argv[1] && g_str_equal(argv[1], "--version")) { + printf("planner-%s\n", VERSION); + return (0); + } /* * Configure program for internationalization: @@ -265,8 +271,14 @@ main( no_taper = TRUE; diskarg_offset += 1; } + if (argc - diskarg_offset > 0 && strcmp(argv[diskarg_offset], "--from-client") == 0) { + from_client = TRUE; + diskarg_offset += 1; + } + run_server_global_scripts(EXECUTE_ON_PRE_ESTIMATE, get_config_name()); + /* * 1. Networking Setup * @@ -315,7 +327,7 @@ main( conf_tapecycle = getconf_int(CNF_TAPECYCLE); conf_etimeout = (time_t)getconf_int(CNF_ETIMEOUT); conf_reserve = getconf_int(CNF_RESERVE); - conf_autoflush = getconf_boolean(CNF_AUTOFLUSH); + conf_autoflush = getconf_no_yes_all(CNF_AUTOFLUSH); conf_usetimestamps = getconf_boolean(CNF_USETIMESTAMPS); today = time(0); @@ -341,6 +353,19 @@ main( g_fprintf(stderr,"%s",errstr); exit_status = EXIT_FAILURE; } + + for (dp = origq.head; dp != NULL; dp = dp->next) { + if (dp->todo) { + if (from_client) { + if (!dp->dump_limit || !dp->dump_limit->same_host) + dp->todo = 0; + } else { + if (dp->dump_limit && !dp->dump_limit->server) + dp->todo = 0; + } + } + } + nb_disk = 0; for (dp = origq.head; dp != NULL; dp = dp->next) { if (dp->todo) { @@ -436,7 +461,8 @@ main( } /* see if this matches the command-line arguments */ - if (!match_dumpfile(&file, argc-diskarg_offset, + if (conf_autoflush == 1 && + !match_dumpfile(&file, argc-diskarg_offset, argv+diskarg_offset)) { continue; } @@ -552,6 +578,8 @@ main( while(!empty(estq)) analyze_estimate(dequeue_disk(&estq)); while(!empty(failq)) handle_failed(dequeue_disk(&failq)); + run_server_global_scripts(EXECUTE_ON_POST_ESTIMATE, get_config_name()); + /* * At this point, all the disks are on schedq sorted by priority. * The total estimated size of the backups is in total_size. @@ -998,6 +1026,10 @@ setup_estimate( case DS_STANDARD: case DS_NOINC: askfor(ep, i++, 0, &info); + if (ep->last_level == -1) + ep->degr_mesg = _("Skipping: new disk can't be dumped in degraded mode"); + else + ep->degr_mesg = _("Skipping: strategy NOINC can't be dumped in degraded mode"); if(dp->skip_full) { log_add(L_INFO, _("Ignoring skip-full for %s:%s " "because the strategy is NOINC."), @@ -1321,15 +1353,11 @@ static void get_estimates(void) hostp = dp->host; if(hostp->up == HOST_READY) { something_started = 1; + run_server_host_scripts(EXECUTE_ON_PRE_HOST_ESTIMATE, + get_config_name(), hostp); for(dp1 = hostp->disks; dp1 != NULL; dp1 = dp1->hostnext) { if (dp1->todo) - run_server_scripts(EXECUTE_ON_PRE_HOST_ESTIMATE, - get_config_name(), dp1, - est(dp1)->estimate[0].level); - } - for(dp1 = hostp->disks; dp1 != NULL; dp1 = dp1->hostnext) { - if (dp1->todo) - run_server_scripts(EXECUTE_ON_PRE_DLE_ESTIMATE, + run_server_dle_scripts(EXECUTE_ON_PRE_DLE_ESTIMATE, get_config_name(), dp1, est(dp1)->estimate[0].level); } @@ -1809,8 +1837,12 @@ static void handle_result( hostp->up = HOST_READY; if (pkt == NULL) { - errbuf = vstrallocf(_("Request to %s failed: %s"), + if (strcmp(security_geterror(sech), "timeout waiting for REP") == 0) { + errbuf = vstrallocf("Some estimate timeout on %s, using server estimate if possible", hostp->hostname); + } else { + errbuf = vstrallocf(_("Request to %s failed: %s"), hostp->hostname, security_geterror(sech)); + } goto error_return; } if (pkt->type == P_NAK) { @@ -1952,7 +1984,8 @@ static void handle_result( break; } } - if (i == MAX_LEVELS) { + if (i == MAX_LEVELS && level > 0) { + /* client always report level 0 for some error */ goto bad_msg; /* this est wasn't requested */ } est(dp)->got_estimate++; @@ -2064,7 +2097,7 @@ static void handle_result( est(dp)->estimate[1].nsize > (gint64)0) && (est(dp)->estimate[2].level == -1 || est(dp)->estimate[2].nsize > (gint64)0)))) { - run_server_scripts(EXECUTE_ON_POST_DLE_ESTIMATE, + run_server_dle_scripts(EXECUTE_ON_POST_DLE_ESTIMATE, get_config_name(), dp, est(dp)->estimate[0].level); est(dp)->post_dle = 1; @@ -2073,13 +2106,9 @@ static void handle_result( } if(hostp->up == HOST_DONE) { - for(dp = hostp->disks; dp != NULL; dp = dp->hostnext) { - if (dp->todo) - if (pkt->type == P_REP) { - run_server_scripts(EXECUTE_ON_POST_HOST_ESTIMATE, - get_config_name(), dp, - est(dp)->estimate[0].level); - } + if (pkt->type == P_REP) { + run_server_host_scripts(EXECUTE_ON_POST_HOST_ESTIMATE, + get_config_name(), hostp); } } @@ -2263,7 +2292,15 @@ static void analyze_estimate( lev0size = est_tape_size(dp, 0); if(lev0size == (gint64)-1) lev0size = ep->last_lev0size; - balanced_size += (double)(lev0size / (gint64)runs_per_cycle); + if (dp->strategy == DS_NOINC) { + balanced_size += (double)lev0size; + } else if (dp->dumpcycle == 0) { + balanced_size += (double)(lev0size * conf_dumpcycle / (gint64)runs_per_cycle); + } else if (dp->dumpcycle != conf_dumpcycle) { + balanced_size += (double)(lev0size * (conf_dumpcycle / dp->dumpcycle) / (gint64)runs_per_cycle); + } else { + balanced_size += (double)(lev0size / (gint64)runs_per_cycle); + } } g_fprintf(stderr,_("total size %lld total_lev0 %1.0lf balanced-lev0size %1.0lf\n"), @@ -2464,7 +2501,7 @@ static void delay_dumps(void) for(dp = schedq.head; dp != NULL; dp = ndp) { int avail_tapes = 1; - if (dp->splitsize > (gint64)0) + if (dp->splitsize > (gint64)0 || dp->allow_split) avail_tapes = conf_runtapes; ndp = dp->next; /* remove_disk zaps this */ @@ -2952,7 +2989,8 @@ static int promote_hills(void) } for(dp = schedq.head; dp != NULL; dp = dp->next) { - days = est(dp)->next_level0; /* This is > 0 by definition */ + days = est(dp)->next_level0; + if (days < 0) days = 0; if(daysskip_full && dp->strategy != DS_NOFULL && dp->strategy != DS_INCRONLY) { sp[days].disks++;