Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Nov 2001 11:51:07 -0500 (EST)
From:      Mikhail Teterin <mi@aldan.algebra.com>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/32138: better progress reporting for dump(8)
Message-ID:  <200111201651.fAKGp7s38773@aldan.algebra.com>

next in thread | raw e-mail | index | archive | help

>Number:         32138
>Category:       bin
>Synopsis:       better progress reporting for dump(8)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Nov 20 09:00:00 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Mikhail Teterin
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
Virtual Estates, Inc.
>Environment:
System: FreeBSD aldan.algebra.com 5.0-CURRENT FreeBSD 5.0-CURRENT #6: Mon Nov 5 08:47:03 EST 2001 mi@aldan.algebra.com:/ccd/obj/ccd/src/sys/DEBUG i386


>Description:

	The included patch makes dump(8) update its proctitle to reflect
	what it is doing at the moment (including the percentage of the
	task completed). It also provides reasonable handling of SIGINFO,
	and removes the arbitrary (and confusing) requirement, that at
	least 500 blocks must be written before the next progress report
	line is output.

	The first version of the patch was critisized on -arch for doing
	things a signal handler is not allowed to do. This version simply
	alters the scheduled time of the next report to ensure it happens
	after the next block is being written.

>How-To-Repeat:

>Fix:

	Please, commit this, or agree to become my mentor for the src
	tree -- I'll be glad to commit this myself :-)

cvs server: Diffing .
Index: dump.8
===================================================================
RCS file: /home/ncvs/src/sbin/dump/dump.8,v
retrieving revision 1.39
diff -U2 -r1.39 dump.8
--- dump.8	15 Jul 2001 14:00:19 -0000	1.39
+++ dump.8	20 Nov 2001 16:49:14 -0000
@@ -320,5 +320,6 @@
 .Pp
 .Nm Dump
-tells the operator what is going on at periodic intervals,
+tells the operator what is going on at periodic intervals --
+every 5 minutes, or promptly after receiving SIGINFO --
 including usually low estimates of the number of blocks to write,
 the number of tapes it will take, the time to completion, and
Index: dump.h
===================================================================
RCS file: /home/ncvs/src/sbin/dump/dump.h,v
retrieving revision 1.11
diff -U2 -r1.11 dump.h
--- dump.h	17 Nov 2001 00:06:55 -0000	1.11
+++ dump.h	20 Nov 2001 16:49:14 -0000
@@ -101,6 +101,7 @@
 int	query __P((char *question));
 void	quit __P((const char *fmt, ...)) __printflike(1, 2);
-void	timeest __P((void));
+void	timeest __P((int)); /* accepts the signal number */
 time_t	unctime __P((char *str));
+void	title __P((void));
 
 /* mapping rouintes */
Index: optr.c
===================================================================
RCS file: /home/ncvs/src/sbin/dump/optr.c,v
retrieving revision 1.16
diff -U2 -r1.16 optr.c
--- optr.c	17 Nov 2001 00:06:55 -0000	1.16
+++ optr.c	20 Nov 2001 16:49:14 -0000
@@ -52,4 +52,5 @@
 #include <string.h>
 #include <stdarg.h>
+#include <signal.h>
 #include <unistd.h>
 #include <utmp.h>
@@ -191,14 +192,26 @@
 
 void
-timeest()
+timeest(signal)
 {
 	time_t	tnow;
 	int deltat;
 
-	(void) time((time_t *) &tnow);
+	if (signal != 0) {
+		/*
+		 * We might be called to handle SIGINFO. Re-schedule
+		 * the reporting to occur the next time we are called
+		 * regularly and bail out -- don't do reporting as a
+		 * signal handler -- it involves malloc-ing and other
+		 * things signal handler are not supposed to do.
+		 */
+		/*
+		 * 300 seconds is a constant only used in this function
+		 */
+		tschedule -= 300;
+		return;
+	}
+	(void) time(&tnow);
 	if (tnow >= tschedule) {
 		tschedule = tnow + 300;
-		if (blockswritten < 500)
-			return;
 		deltat = tstart_writing - tnow +
 			(1.0 * (tnow - tstart_writing))
@@ -207,4 +220,5 @@
 			(blockswritten * 100.0) / tapesize,
 			deltat / 3600, (deltat % 3600) / 60);
+		title();
 	}
 }
@@ -235,4 +249,31 @@
 	(void) vsnprintf(lastmsg, sizeof(lastmsg), fmt, ap);
 	va_end(ap);
+}
+
+/*
+ * This function can be called to place, what msg() above pushed to
+ * stderr, into the process title, viewable with the ps-command.
+ * A side effect of this function, is it replaces the final '\n' (if any)
+ * with the '\0' in the global variable lastmsg -- to avoid the literal
+ * "\n" being put into the proctitle.
+ * So, if the lastmsg needs to be output elsewhere, that should happen
+ * before calling title().
+ */
+void title()
+{
+	int lastlen;
+
+	lastlen = strlen(lastmsg);
+	if (lastmsg[lastlen-1] == '\n')
+		lastmsg[lastlen-1] = '\0';
+
+	/*
+	 * It would be unwise to run multiple dumps of same disk
+	 * at  the  same time.  So  ``disk''  is sufficient  for
+	 * identifying, to  which family of dump  processes this
+	 * one belongs  -- the other processes  continue to have
+	 * the original titles.
+	 */
+	setproctitle("%s: %s", disk, lastmsg);
 }
 
Index: tape.c
===================================================================
RCS file: /home/ncvs/src/sbin/dump/tape.c,v
retrieving revision 1.14
diff -U2 -r1.14 tape.c
--- tape.c	17 Nov 2001 00:06:55 -0000	1.14
+++ tape.c	20 Nov 2001 16:49:15 -0000
@@ -309,5 +309,5 @@
 		startnewtape(0);
 	}
-	timeest();
+	timeest(0);
 }
 
@@ -522,4 +522,5 @@
 	 *	All signals are inherited...
 	 */
+	setproctitle(NULL); /* restore the proctitle modified by title() */
 	childpid = fork();
 	if (childpid < 0) {
@@ -612,4 +613,5 @@
 
 		enslave();  /* Share open tape file descriptor with slaves */
+		signal(SIGINFO, timeest); /* report progress on SIGINFO */
 
 		asize = 0;
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111201651.fAKGp7s38773>