X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fautoprune.c;h=a7fb458a59f6bb2b0f73ab6a0a5bc42e410e7932;hb=b9ac1b6c82fd69ecf139edce98585a889906db8b;hp=a925a9530e7eff40f2703fb578adab822cef55e5;hpb=f7fb2261ab648bfc02a32773b7a5a2201783e189;p=bacula%2Fbacula diff --git a/bacula/src/dird/autoprune.c b/bacula/src/dird/autoprune.c index a925a9530e..a7fb458a59 100644 --- a/bacula/src/dird/autoprune.c +++ b/bacula/src/dird/autoprune.c @@ -34,67 +34,50 @@ /* Forward referenced functions */ -void create_ua_context(JCR *jcr, UAContext *ua) -{ - memset(ua, 0, sizeof(UAContext)); - ua->jcr = jcr; - ua->db = jcr->db; - ua->cmd = get_pool_memory(PM_FNAME); - ua->args = get_pool_memory(PM_FNAME); - ua->verbose = 1; -} - -void free_ua_context(UAContext *ua) -{ - if (ua->cmd) { - free_pool_memory(ua->cmd); - } - if (ua->args) { - free_pool_memory(ua->args); - } -} /* - * Auto Prune Jobs and Files - * Volumes are done separately + * Auto Prune Jobs and Files. This is called at the end of every + * Job. We do not prune volumes here. */ int do_autoprune(JCR *jcr) { - UAContext ua; + UAContext *ua; CLIENT *client; - int pruned; + bool pruned; if (!jcr->client) { /* temp -- remove me */ return 1; } - create_ua_context(jcr, &ua); + ua = new_ua_context(jcr); client = jcr->client; if (jcr->job->PruneJobs || jcr->client->AutoPrune) { Jmsg(jcr, M_INFO, 0, _("Begin pruning Jobs.\n")); - prune_jobs(&ua, client); - pruned = TRUE; + prune_jobs(ua, client, jcr->JobType); + pruned = true; } else { - pruned = FALSE; + pruned = false; } if (jcr->job->PruneFiles || jcr->client->AutoPrune) { Jmsg(jcr, M_INFO, 0, _("Begin pruning Files.\n")); - prune_files(&ua, client); - pruned = TRUE; + prune_files(ua, client); + pruned = true; } if (pruned) { Jmsg(jcr, M_INFO, 0, _("End auto prune.\n\n")); } - free_ua_context(&ua); + free_ua_context(ua); return 1; } /* - * Prune all volumes in current Pool. + * Prune all volumes in current Pool. This is called from + * catreq.c when the Storage daemon is asking for another + * volume and no appendable volumes are available. * * Return 0: on error * number of Volumes Purged @@ -106,47 +89,47 @@ int prune_volumes(JCR *jcr) uint32_t *ids = NULL; int num_ids = 0; MEDIA_DBR mr; - POOL_DBR pr; - UAContext ua; + UAContext *ua; if (!jcr->job->PruneVolumes && !jcr->pool->AutoPrune) { - Dmsg0(200, "AutoPrune not set in Pool.\n"); - return stat; + Dmsg0(100, "AutoPrune not set in Pool.\n"); + return 0; } memset(&mr, 0, sizeof(mr)); - memset(&pr, 0, sizeof(pr)); - create_ua_context(jcr, &ua); + ua = new_ua_context(jcr); db_lock(jcr->db); - pr.PoolId = jcr->PoolId; - if (!db_get_pool_record(jcr->db, &pr) || !db_get_media_ids(jcr->db, &num_ids, &ids)) { + /* Get the List of all media ids in the current Pool */ + if (!db_get_media_ids(jcr, jcr->db, jcr->PoolId, &num_ids, &ids)) { Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); - goto rtn; + goto bail_out; } - + /* Visit each Volume and Prune it */ for (i=0; idb, &mr)) { + if (!db_get_media_record(jcr, jcr->db, &mr)) { Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db)); continue; } /* Prune only Volumes from current Pool */ - if (pr.PoolId != mr.PoolId) { + if (jcr->PoolId != mr.PoolId) { continue; } - /* Prune only Volumes with status "Full" */ - if (strcmp(mr.VolStatus, "Full") != 0) { - continue; + /* Prune only Volumes with status "Full", "Used", or "Append" */ + if (strcmp(mr.VolStatus, "Full") == 0 || + strcmp(mr.VolStatus, "Append") == 0 || + strcmp(mr.VolStatus, "Used") == 0) { + Dmsg1(200, "Prune Volume %s\n", mr.VolumeName); + stat += prune_volume(ua, &mr); + Dmsg1(200, "Num pruned = %d\n", stat); } - Dmsg1(200, "Prune Volume %s\n", mr.VolumeName); - stat += prune_volume(&ua, &pr, &mr); - Dmsg1(200, "Num pruned = %d\n", stat); } -rtn: + +bail_out: db_unlock(jcr->db); - free_ua_context(&ua); + free_ua_context(ua); if (ids) { free(ids); }