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