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 */

Reply via email to