Re: [PATCH v3] gc: save log from daemonized gc --auto and print it next time

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH v3] gc: save log from daemonized gc --auto and print it next time

From: Junio C Hamano <hidden>
Date: 2016-06-15 23:06:18

Nguyễn Thái Ngọc Duy  [off-list ref] writes:
While commit 9f673f9 (gc: config option for running --auto in
background - 2014-02-08) helps reduce some complaints about 'gc
--auto' hogging the terminal, it creates another set of problems.

The latest in this set is, as the result of daemonizing, stderr is
closed and all warnings are lost. This warning at the end of cmd_gc()
is particularly important because it tells the user how to avoid "gc
--auto" running repeatedly. Because stderr is closed, the user does
not know, naturally they complain about 'gc --auto' wasting CPU.

Daemonized gc now saves stderr to $GIT_DIR/gc.log. Following gc runs
will not be daemonized and gc.log printed out until the user removes
gc.log.

Signed-off-by: Nguyễn Thái Ngọc Duy <redacted>
---
 Let's try again. Compared to v2 [1], this version does not delete
 gc.log automatically any more. The user needs to take action, then
 delete gc.log to bring it background again.
Sounds a bit more sensible, but I wonder if it is a good idea to
keep going in the first place.  If the last gc run reported an
issue, would it make it likely that we would hit the same issue?

An alternative design I have in mind is to exit "gc --auto" with
success without doing anything, after giving the new warning
message.  What would be the pros-and-cons between this patch and
that alternative design?


quoted hunk
 [1] http://thread.gmane.org/gmane.comp.version-control.git/266182/focus=266320

 builtin/gc.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/builtin/gc.c b/builtin/gc.c
index bcc75d9..00a83e1 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -43,9 +43,20 @@ static struct argv_array prune_worktrees = ARGV_ARRAY_INIT;
 static struct argv_array rerere = ARGV_ARRAY_INIT;
 
 static char *pidfile;
+static struct strbuf log_filename = STRBUF_INIT;
+static int daemonized;
 
 static void remove_pidfile(void)
 {
+	if (daemonized && log_filename.len) {
+		struct stat st;
+
+		close(2);
+		if (stat(log_filename.buf, &st) ||
+		    !st.st_size ||
+		    rename(log_filename.buf, git_path("gc.log")))
+			unlink(log_filename.buf);
+	}
 	if (pidfile)
 		unlink(pidfile);
 }
@@ -330,13 +341,24 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 			fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n"));
 		}
 		if (detach_auto) {
+			struct strbuf sb = STRBUF_INIT;
+			if (strbuf_read_file(&sb, git_path("gc.log"), 0) > 0) {
+				warning(_("last gc run reported:\n"
+					  "%s\n"
+					  "running in foreground until %s is removed"),
+					sb.buf, git_path("gc.log"));
+				detach_auto = 0;
+			}
+			strbuf_release(&sb);
+		}
+		if (detach_auto) {
 			if (gc_before_repack())
 				return -1;
 			/*
 			 * failure to daemonize is ok, we'll continue
 			 * in foreground
 			 */
-			daemonize();
+			daemonized = !daemonize();
 		}
 	} else
 		add_repack_all_option();
@@ -349,6 +371,18 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 		    name, (uintmax_t)pid);
 	}
 
+	if (daemonized) {
+		int fd;
+
+		strbuf_addstr(&log_filename, git_path("gc.log_XXXXXX"));
+		fd = xmkstemp(log_filename.buf);
+		if (fd >= 0) {
+			dup2(fd, 2);
+			close(fd);
+		} else
+			strbuf_release(&log_filename);
+	}
+
 	if (gc_before_repack())
 		return -1;

Re: [PATCH v3] gc: save log from daemonized gc --auto and print it next time

From: Duy Nguyen <hidden>
Date: 2016-06-15 23:06:21

On Wed, Aug 26, 2015 at 12:49 AM, Junio C Hamano [off-list ref] wrote:
Nguyễn Thái Ngọc Duy  [off-list ref] writes:
quoted
While commit 9f673f9 (gc: config option for running --auto in
background - 2014-02-08) helps reduce some complaints about 'gc
--auto' hogging the terminal, it creates another set of problems.

The latest in this set is, as the result of daemonizing, stderr is
closed and all warnings are lost. This warning at the end of cmd_gc()
is particularly important because it tells the user how to avoid "gc
--auto" running repeatedly. Because stderr is closed, the user does
not know, naturally they complain about 'gc --auto' wasting CPU.

Daemonized gc now saves stderr to $GIT_DIR/gc.log. Following gc runs
will not be daemonized and gc.log printed out until the user removes
gc.log.

Signed-off-by: Nguyễn Thái Ngọc Duy <redacted>
---
 Let's try again. Compared to v2 [1], this version does not delete
 gc.log automatically any more. The user needs to take action, then
 delete gc.log to bring it background again.
Sounds a bit more sensible, but I wonder if it is a good idea to
keep going in the first place.  If the last gc run reported an
issue, would it make it likely that we would hit the same issue?

An alternative design I have in mind is to exit "gc --auto" with
success without doing anything, after giving the new warning
message.  What would be the pros-and-cons between this patch and
that alternative design?
I think the alt. design is better. If anything, keep runing may
produce more output and probably distract the user from the real
warning. We only want to keep doing something again if it can gain us
something. If we succeed at steps A and B, then fail at C. Doing A and
B again next time might be worth something in general, but given the
context of git-gc I don't think it is.
-- 
Duy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help