Jon,
Can you try the attached patch?
On 25/02/17 01:58 PM, Jon LaBadie wrote:
> I'm getting a lot of these messages in my nightly report
>
> planner: Last full dump of cyber.jgcomp.com:Home on tape DS1-084
> overwritten in 1 run.
> planner: Last full dump of cyber.jgcomp.com:Vault on tape DS1-079
> overwritten in 1 run.
>
> It made little sense as there are many full dumps or these
> various DLEs sprinkled back to tape DS1-000. And, although
> there were about 10 unused tapes remaining, I added a bunch
> more which had no effect on the "will be overwritten" messages.
>
> Then I looked at the tapelist and found 2 different formats.
> This is certainly due to my switching from CentOS packages
> (amanda 3.3.3.) to Zmanda pre-built binaries for RHEL (amanda
> 3.4.1).
>
> Previously labeled tapes have a 4 column layout but when the
> new amanda version uses a tape, it modifies that layout to a
> 7 column format adding "POOL", "STORAGE", and "CONFIG" columns.
> Now my tapelist has 4 contiguous groups.
>
> recently labeled unused 7 column layout
> previously labeled unused 4 column layout
> previously labeled used 7 column layout
> previously labeled used 4 column layout
>
> Why does the planner think it will overwrite the last full dumps?
>
> Would simply adding the additional 7 fields to the tapelist
> correct this error or would other things have to change also?
It should fix the issue.
>
> Would adding the extra columns adversely affect anything else?
no.
Jean-Louis
diff --git a/server-src/planner.c b/server-src/planner.c
index 3464810..4d2b55b 100644
--- a/server-src/planner.c
+++ b/server-src/planner.c
@@ -1291,6 +1291,8 @@ static int when_overwrite(
int nb_in_storage;
int runtapes;
storage_t *st;
+ policy_s *po;
+ int retention_tapes;
if ((tp = lookup_tapelabel(label)) == NULL)
return 1; /* "shouldn't happen", but trigger warning message */
@@ -1308,13 +1310,17 @@ static int when_overwrite(
}
if (!st)
return 1;
+ po = lookup_policy(storage_get_policy(st));
+ if (!po)
+ return 1;
+ retention_tapes = policy_get_retention_tapes(po);
runtapes = storage_get_runtapes(st);
if (runtapes == 0) runtapes = 1;
- nb = tape_overwrite(tp);
- nb_in_storage = nb_tape_in_storage(tp->storage);
- if (conf_tapecycle+1 > nb_in_storage)
- nb += (conf_tapecycle+1 - nb_in_storage);
+ nb = tape_overwrite(st, tp);
+ nb_in_storage = nb_tape_in_storage(st);
+ if (retention_tapes > nb_in_storage)
+ nb += (retention_tapes - nb_in_storage + 1);
tp->when_overwrite = (nb - 1) / runtapes;
if (tp->when_overwrite < 0)
diff --git a/server-src/tapefile.c b/server-src/tapefile.c
index 7e0d81f..63f8ebf 100644
--- a/server-src/tapefile.c
+++ b/server-src/tapefile.c
@@ -1175,14 +1175,21 @@ get_retention_type(
int
tape_overwrite(
+ storage_t *st,
tape_t *tp)
{
tape_t *tp1;
int nb_tapes = 0;
for (tp1 = tp; tp1 != NULL; tp1 = tp1->next) {
- if (!tp1->retention && tp1->storage && tp->storage &&
- g_str_equal(tp->storage, tp1->storage)) {
+ if (!tp1->retention &&
+ (((!tp1->storage || !tp->storage) &&
+ match_labelstr(storage_get_labelstr(st),
+ storage_get_autolabel(st),
+ tp1->label, tp1->barcode, tp1->meta,
+ storage_name(st))) ||
+ (tp1->storage && tp->storage &&
+ g_str_equal(tp->storage, tp1->storage)))) {
nb_tapes++;
}
}
@@ -1191,14 +1198,18 @@ tape_overwrite(
int
nb_tape_in_storage(
- char *storage_name)
+ storage_t *st)
{
tape_t *tp;
int nb_tapes = 0;
-
+ char *storage = storage_name(st);
for (tp = tape_list; tp != NULL; tp = tp->next) {
- if ((!storage_name && !tp->storage) ||
- (storage_name && tp->storage && g_str_equal(storage_name,tp->storage))) {
+ if (((!storage || !tp->storage) &&
+ match_labelstr(storage_get_labelstr(st),
+ storage_get_autolabel(st),
+ tp->label, tp->barcode, tp->meta,
+ storage_name(st))) ||
+ (storage && tp->storage && g_str_equal(storage, tp->storage))) {
nb_tapes++;
}
}
diff --git a/server-src/tapefile.h b/server-src/tapefile.h
index 4af86da..547f8ef 100644
--- a/server-src/tapefile.h
+++ b/server-src/tapefile.h
@@ -35,6 +35,7 @@
#define TAPEFILE_H
#include "amanda.h"
+#include "conffile.h"
typedef enum {
RETENTION_NO = 0,
@@ -110,7 +111,7 @@ int volume_is_reusable(const char *label);
int guess_runs_from_tapelist(void);
gchar **list_new_tapes(char *storage_n, int nb);
RetentionType get_retention_type(char *pool, char *label);
-int tape_overwrite(tape_t *tp);
-int nb_tape_in_storage(char *storage_name);
+int tape_overwrite(storage_t *st, tape_t *tp);
+int nb_tape_in_storage(storage_t *st);
#endif /* !TAPEFILE_H */