public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfsdump: prune inventory sessions by session id
@ 2011-02-24 16:25 Bill Kendall
  2011-02-25 19:27 ` Alex Elder
  0 siblings, 1 reply; 3+ messages in thread
From: Bill Kendall @ 2011-02-24 16:25 UTC (permalink / raw)
  To: xfs

Allow xfsinvutil to prune inventory sessions by their ID
instead of only by filesystem and cutoff date.

Signed-off-by: Bill Kendall <wkendall@sgi.com>

---
 invutil/getopt.h      |    3 +-
 invutil/invutil.c     |   99 ++++++++++++++++++++++++++++++++++++++----------
 invutil/invutil.h     |    7 ++-
 man/man8/xfsinvutil.8 |    7 +++
 4 files changed, 91 insertions(+), 25 deletions(-)

diff --git a/invutil/getopt.h b/invutil/getopt.h
index 14c9ec5..7170ac6 100644
--- a/invutil/getopt.h
+++ b/invutil/getopt.h
@@ -18,7 +18,7 @@
 #ifndef GETOPT_H
 #define GETOPT_H
 
-#define GETOPT_CMDSTRING	"dilnu:wCFM:m:"
+#define GETOPT_CMDSTRING	"dilnu:wCFM:m:s:"
 
 #define GETOPT_DEBUG		'd'	/* debug */
 #define GETOPT_INTERACTIVE	'i'	/* interactive mode */
@@ -29,5 +29,6 @@
 #define GETOPT_FORCE		'F'	/* force - do not ask for confirmation */
 #define GETOPT_PRUNEMNT		'M'	/* prune mount point */
 #define GETOPT_PRUNEMEDIALABEL	'm'	/* prune media label */
+#define GETOPT_PRUNESESSION	's'	/* prune session id */
 
 #endif /* GETOPT_H */
diff --git a/invutil/invutil.c b/invutil/invutil.c
index af6836b..37489c0 100644
--- a/invutil/invutil.c
+++ b/invutil/invutil.c
@@ -60,15 +60,18 @@ main(int argc, char *argv[])
     bool_t mntpnt_option = BOOL_FALSE;
     bool_t uuid_option = BOOL_FALSE;
     bool_t interactive_option = BOOL_FALSE;
+    bool_t session_option = BOOL_FALSE;
     static char version[32];
     char *mntPoint = NULL;
     char *r_mf_label = NULL;
     uuid_t uuid;
+    uuid_t session;
 
     snprintf(version, sizeof(version), "version %s", VERSION);
     g_programName = basename(argv[0]);
     g_programVersion = version;
     uuid_clear(uuid);
+    uuid_clear(session);
 
     while((c = getopt( argc, argv, GETOPT_CMDSTRING)) != EOF) {
 	switch(c) {
@@ -83,6 +86,13 @@ main(int argc, char *argv[])
 			 c );
 		usage();
 	    }
+	    if (session_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+			 g_programName,
+			 GETOPT_PRUNESESSION,
+			 c );
+		usage();
+	    }
 	    interactive_option = BOOL_TRUE;
 	    break;
 	case GETOPT_NONINTERACTIVE: /* obsoleted by -F */
@@ -103,10 +113,10 @@ main(int argc, char *argv[])
 			 c );
 		usage();
 	    }
-	    if (mntpnt_option) {
+	    if (mntpnt_option || session_option) {
 		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
 			 g_programName,
-			 GETOPT_PRUNEMNT,
+			 mntpnt_option ? GETOPT_PRUNEMNT : GETOPT_PRUNESESSION,
 			 c );
 		usage();
 	    }
@@ -131,6 +141,13 @@ main(int argc, char *argv[])
 			 c );
 		usage();
 	    }
+	    if (session_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+			 g_programName,
+			 GETOPT_PRUNESESSION,
+			 c );
+		usage();
+	    }
 	    check_option = BOOL_TRUE;
 	    break;
 	case GETOPT_FORCE:
@@ -151,10 +168,10 @@ main(int argc, char *argv[])
 			 c );
 		usage();
 	    }
-	    if (uuid_option) {
-		fprintf( stderr, "%s: may not specify both -%c and -%c\n", 
+	    if (uuid_option || session_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
 			 g_programName,
-			 GETOPT_UUID,
+			 uuid_option ? GETOPT_UUID : GETOPT_PRUNESESSION,
 			 c );
 		usage();
 	    }
@@ -164,6 +181,31 @@ main(int argc, char *argv[])
 	case GETOPT_PRUNEMEDIALABEL:
 	    r_mf_label = optarg;
 	    break;
+	case GETOPT_PRUNESESSION:
+	    if (check_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+			 g_programName,
+			 GETOPT_CHECKPRUNEFSTAB,
+			 c );
+		usage();
+	    }
+	    if (interactive_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+			 g_programName,
+			 GETOPT_INTERACTIVE,
+			 c );
+		usage();
+	    }
+	    if (mntpnt_option || uuid_option) {
+		fprintf( stderr, "%s: may not specify both -%c and -%c\n",
+			 g_programName,
+			 mntpnt_option ? GETOPT_PRUNEMNT : GETOPT_UUID,
+			 c );
+		usage();
+	    }
+	    session_option = BOOL_TRUE;
+	    uuid_parse(optarg, session);
+	    break;
 	default:
 	    usage();
 	    break;
@@ -209,7 +251,12 @@ main(int argc, char *argv[])
         char *tempstr = "test";
         time32_t temptime = 0;
         CheckAndPruneFstab(inventory_path, BOOL_TRUE, tempstr, &uuid,
-		temptime, NULL);
+		&session, temptime, NULL);
+    }
+    else if (session_option) {
+	CheckAndPruneFstab(
+		    inventory_path, BOOL_FALSE , mntPoint, &uuid,
+		    &session, (time32_t)0, r_mf_label);
     }
     else if (uuid_option || mntpnt_option) {
         time32_t timeSecs = ParseDate(argv[optind]);
@@ -221,7 +268,7 @@ main(int argc, char *argv[])
 	else {
 	    CheckAndPruneFstab(
 		    inventory_path, BOOL_FALSE , mntPoint, &uuid,
-		    timeSecs, r_mf_label);
+		    &session, timeSecs, r_mf_label);
 	}
     }
     else if ( interactive_option ) {
@@ -396,7 +443,7 @@ GetFstabFullPath(char *inv_path)
 
 void
 CheckAndPruneFstab(char *inv_path, bool_t checkonly, char *mountPt,
-	uuid_t *uuidp, time32_t prunetime, char *r_mf_label)
+	uuid_t *uuidp, uuid_t *sessionp, time32_t prunetime, char *r_mf_label)
 {
     char	*fstabname;
     char	*mapaddr;
@@ -410,8 +457,9 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char *mountPt,
     invt_fstab_t *fstabentry;
     invt_counter_t *counter,cnt;
 
-    if (mountPt == NULL && uuid_is_null(*uuidp)) {
-	fprintf( stderr, "%s: neither mountpoint nor uuid specified\n", g_programName );
+    if (mountPt == NULL && uuid_is_null(*uuidp) && uuid_is_null(*sessionp)) {
+	fprintf( stderr, "%s: mountpoint, uuid or session "
+			 "must be specified\n", g_programName );
 	fprintf( stderr, "%s: abnormal termination\n", g_programName );
 	exit(1);
     }
@@ -480,10 +528,16 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char *mountPt,
 		    printf("     Match on directory name only: %s\n", mountPt);
 		    IdxCheckOnly = BOOL_FALSE;
 		}
+		else if (!uuid_is_null(*sessionp)) {
+		    // no session id to match against yet, defer deciding if this is
+		    // a check-only run until we have a session
+		    IdxCheckOnly = BOOL_FALSE;
+		}
 	    }
 
 	    if (CheckAndPruneInvIndexFile(
-			IdxCheckOnly, invname , prunetime, r_mf_label) == -1 ) {
+			IdxCheckOnly, invname, sessionp,
+			prunetime, r_mf_label) == -1 ) {
 		removeflag = BOOL_TRUE;
 	    }
 
@@ -538,6 +592,7 @@ CheckAndPruneFstab(char *inv_path, bool_t checkonly, char *mountPt,
 int
 CheckAndPruneInvIndexFile( bool_t checkonly,
 			   char *idxFileName,
+			   uuid_t *sessionp,
 			   time32_t prunetime,
 			   char *r_mf_label) 
 {
@@ -551,7 +606,6 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
     invt_entry_t *invIndexEntry;
     invt_counter_t *counter;
     invt_counter_t header;
-    bool_t IdxCheckOnly = BOOL_TRUE;
 
     printf("      processing index file \n"
 	   "       %s\n",idxFileName);
@@ -594,14 +648,8 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
 	    removeflag = BOOL_TRUE;
 	}    
 
-	if (( !removeflag ) && (checkonly == BOOL_FALSE) && 
-		( invIndexEntry[i].ie_timeperiod.tp_start < prunetime))
-	{
-	    IdxCheckOnly = BOOL_FALSE;
-	    printf("          Mount point match\n");
-	}
-	if (CheckAndPruneStObjFile(IdxCheckOnly, invIndexEntry[i].ie_filename,
-		    prunetime, r_mf_label) == -1) {
+	if (CheckAndPruneStObjFile(checkonly, invIndexEntry[i].ie_filename,
+		    sessionp, prunetime, r_mf_label) == -1) {
 	    removeflag = BOOL_TRUE; /* The StObj is gone */
 	}
 
@@ -657,6 +705,7 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
 int
 CheckAndPruneStObjFile( bool_t checkonly,
 			char *StObjFileName,
+			uuid_t *sessionp,
 			time32_t prunetime,
 		        char *r_mf_label) 
 {
@@ -668,6 +717,7 @@ CheckAndPruneStObjFile( bool_t checkonly,
     bool_t	removeflag;
     int		prunedcount = 0;
     int		removedcount = 0;
+    bool_t	session_match;
 
     struct stat	sb;
     char	str[UUID_STR_LEN + 1];
@@ -776,9 +826,14 @@ CheckAndPruneStObjFile( bool_t checkonly,
                checkonly, StObjhdr->sh_pruned); 
 #endif
 
+	session_match = !uuid_compare(*sessionp, StObjses->s_sesid);
+	if (session_match) {
+	    printf("\t\tMatch on session id\n");
+	}
+
 	if ((checkonly == BOOL_FALSE)
 	    && (! StObjhdr->sh_pruned)
-	    && (StObjhdr->sh_time < prunetime)
+	    && ((StObjhdr->sh_time < prunetime) || session_match)
 	    && (uses_specified_mf_label(StObjhdr, StObjses, temp, r_mf_label))){
 	    bool_t GotResponse = BOOL_FALSE;
 
@@ -1112,6 +1167,8 @@ usage (void)
 		    pfxsz, "", g_programName);
     fprintf(stderr, "%*s%s [-F|-i] [-m media_label] -u UUID mm/dd/yyyy\n",
 		    pfxsz, "", g_programName);
+    fprintf(stderr, "%*s%s [-F] -s SESSION_ID\n",
+		    pfxsz, "", g_programName);
     fprintf(stderr, "%*s%s -i\n", pfxsz, "", g_programName);
     fprintf(stderr, "%*s%s -C\n", pfxsz, "", g_programName);
 
diff --git a/invutil/invutil.h b/invutil/invutil.h
index dc42108..f1b1681 100644
--- a/invutil/invutil.h
+++ b/invutil/invutil.h
@@ -44,9 +44,10 @@ extern bool_t	wait_for_locks;
 char *	GetFstabFullPath(char *);
 char *	GetNameOfInvIndex (char *, uuid_t);
 char *	GetNameOfStobj (char *inv_path, char *filename);
-void	CheckAndPruneFstab(char *, bool_t, char *, uuid_t *, time32_t, char *);
-int	CheckAndPruneInvIndexFile( bool_t, char *, time32_t, char *);
-int	CheckAndPruneStObjFile( bool_t, char *, time32_t, char *);
+void	CheckAndPruneFstab(
+		char *, bool_t, char *, uuid_t *, uuid_t *, time32_t, char *);
+int	CheckAndPruneInvIndexFile( bool_t, char *, uuid_t *, time32_t, char *);
+int	CheckAndPruneStObjFile( bool_t, char *, uuid_t *, time32_t, char *);
 int	uses_specified_mf_label(
 		invt_seshdr_t *, invt_session_t *, char	*, char *);
 time32_t ParseDate(char *);
diff --git a/man/man8/xfsinvutil.8 b/man/man8/xfsinvutil.8
index 27db5dc..cb878be 100644
--- a/man/man8/xfsinvutil.8
+++ b/man/man8/xfsinvutil.8
@@ -5,6 +5,7 @@ xfsinvutil \- \&xfsdump inventory database checking and pruning utility
 .nf
 \f3xfsinvutil\f1 [\-F|\-i] [\-m \f2media_label\f1] \-M \f2mount_point\f1 \f2mm/dd/yyyy\f1
 \f3xfsinvutil\f1 [\-F|\-i] [\-m \f2media_label\f1] \-u \f2UUID\f1 \f2mm/dd/yyyy\f1
+\f3xfsinvutil\f1 [\-F] \-s \f2SESSION_ID\f1
 \f3xfsinvutil\f1 \-i
 \f3xfsinvutil\f1 \-C
 .fi
@@ -64,6 +65,12 @@ in addition to those imposed by the date and the \f3\-M\f1 or
 references to media which may have been overwritten or lost. Note that
 this option does not apply to sessions with no media files.
 .TP 5
+\f3\-s\f1 \f2SESSION_ID\f1
+Prunes the dump session identified by the given session id.
+.I xfsinvutil
+will prompt the operator prior to pruning a dump session unless
+the \f3\-F\f1 option is given.
+.TP 5
 .B \-C
 With this option, 
 .I xfsinvutil 
-- 
1.7.0.4

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] xfsdump: prune inventory sessions by session id
  2011-02-24 16:25 [PATCH] xfsdump: prune inventory sessions by session id Bill Kendall
@ 2011-02-25 19:27 ` Alex Elder
  2011-02-25 21:03   ` Bill Kendall
  0 siblings, 1 reply; 3+ messages in thread
From: Alex Elder @ 2011-02-25 19:27 UTC (permalink / raw)
  To: Bill Kendall; +Cc: xfs

On Thu, 2011-02-24 at 10:25 -0600, Bill Kendall wrote:
> Allow xfsinvutil to prune inventory sessions by their ID
> instead of only by filesystem and cutoff date.

This would have been a bit nicer with a little more
explanation.  I.e.:
- You specify the session id using the new "-s <sessid>"
  command line option.
- The "-s" option is mutually exclusive with "-u <UUID>"
  and "-M <mount_point> <mm/dd/yy>".  It also cannot be
  used together with the "-i" (interactive) or "-C"
  (consistency check) options.
- The change is implemented by adding a session id argument
  to CheckAndPruneFstab(), CheckAndPruneInvIndexFile(), and
  CheckAndPruneStObjFile().  That session becomes a third
  way of identifying entries to be pruned (in addition
  to mount point and UUID).

Anyway, this looks good to me.  I have one question
below, but regardless of your answer...

Reviewed-by: Alex Elder <aelder@sgi.com>

> Signed-off-by: Bill Kendall <wkendall@sgi.com>
> 
> ---
. . .

> diff --git a/invutil/invutil.c b/invutil/invutil.c
> index af6836b..37489c0 100644
> --- a/invutil/invutil.c
> +++ b/invutil/invutil.c

. . .

> @@ -594,14 +648,8 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
>  	    removeflag = BOOL_TRUE;
>  	}    
>  
> -	if (( !removeflag ) && (checkonly == BOOL_FALSE) && 
> -		( invIndexEntry[i].ie_timeperiod.tp_start < prunetime))
> -	{
> -	    IdxCheckOnly = BOOL_FALSE;
> -	    printf("          Mount point match\n");
> -	}

Why do you no longer print this in this case?

> -	if (CheckAndPruneStObjFile(IdxCheckOnly, invIndexEntry[i].ie_filename,
> -		    prunetime, r_mf_label) == -1) {
> +	if (CheckAndPruneStObjFile(checkonly, invIndexEntry[i].ie_filename,
> +		    sessionp, prunetime, r_mf_label) == -1) {
>  	    removeflag = BOOL_TRUE; /* The StObj is gone */
>  	}
>  

. . .

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] xfsdump: prune inventory sessions by session id
  2011-02-25 19:27 ` Alex Elder
@ 2011-02-25 21:03   ` Bill Kendall
  0 siblings, 0 replies; 3+ messages in thread
From: Bill Kendall @ 2011-02-25 21:03 UTC (permalink / raw)
  To: aelder; +Cc: xfs

On 02/25/2011 01:27 PM, Alex Elder wrote:
> On Thu, 2011-02-24 at 10:25 -0600, Bill Kendall wrote:
>> Allow xfsinvutil to prune inventory sessions by their ID
>> instead of only by filesystem and cutoff date.
>
> This would have been a bit nicer with a little more
> explanation.  I.e.:
> - You specify the session id using the new "-s<sessid>"
>    command line option.
> - The "-s" option is mutually exclusive with "-u<UUID>"
>    and "-M<mount_point>  <mm/dd/yy>".  It also cannot be
>    used together with the "-i" (interactive) or "-C"
>    (consistency check) options.
> - The change is implemented by adding a session id argument
>    to CheckAndPruneFstab(), CheckAndPruneInvIndexFile(), and
>    CheckAndPruneStObjFile().  That session becomes a third
>    way of identifying entries to be pruned (in addition
>    to mount point and UUID).

Feel free to amend the commit message when you check this
in. I agree that at least it should have mentioned that
this adds a new xfsinvutil -s option.

>
> Anyway, this looks good to me.  I have one question
> below, but regardless of your answer...
>
> Reviewed-by: Alex Elder<aelder@sgi.com>
>
>> Signed-off-by: Bill Kendall<wkendall@sgi.com>
>>
>> ---
> . . .
>
>> diff --git a/invutil/invutil.c b/invutil/invutil.c
>> index af6836b..37489c0 100644
>> --- a/invutil/invutil.c
>> +++ b/invutil/invutil.c
>
> . . .
>
>> @@ -594,14 +648,8 @@ CheckAndPruneInvIndexFile( bool_t checkonly,
>>   	    removeflag = BOOL_TRUE;
>>   	}
>>
>> -	if (( !removeflag )&&  (checkonly == BOOL_FALSE)&&
>> -		( invIndexEntry[i].ie_timeperiod.tp_start<  prunetime))
>> -	{
>> -	    IdxCheckOnly = BOOL_FALSE;
>> -	    printf("          Mount point match\n");
>> -	}
>
> Why do you no longer print this in this case?

The message did not seem to serve a purpose. To reach the print
we already had to match on the mount point, and a message is
already issued for that.

As you probably noticed, the 'if' statement did not serve a
functional purpose since the prune time has to be checked for
each session anyway, and further the 'if' statement would have
to be reworked to consider whether this is a prune-by-session run.

As a side note, it's too bad that the consistency checking and
pruning is coupled together. It would be much cleaner to
implement the various pruning filters as separate functions.

Bill

>
>> -	if (CheckAndPruneStObjFile(IdxCheckOnly, invIndexEntry[i].ie_filename,
>> -		    prunetime, r_mf_label) == -1) {
>> +	if (CheckAndPruneStObjFile(checkonly, invIndexEntry[i].ie_filename,
>> +		    sessionp, prunetime, r_mf_label) == -1) {
>>   	    removeflag = BOOL_TRUE; /* The StObj is gone */
>>   	}
>>
>
> . . .

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-02-25 21:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-24 16:25 [PATCH] xfsdump: prune inventory sessions by session id Bill Kendall
2011-02-25 19:27 ` Alex Elder
2011-02-25 21:03   ` Bill Kendall

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox