From: Seth Kurtzberg <seth@cql.com>
To: Wayne Davison <wayned@users.sourceforge.net>
Cc: zsh-users@sunsite.dk
Subject: Re: History corruption (over NFS)
Date: Mon, 14 Feb 2005 14:06:12 -0700 [thread overview]
Message-ID: <421112C4.50002@cql.com> (raw)
In-Reply-To: <20050214185705.GC6444@blorf.net>
Wayne Davison wrote:
>On Mon, Feb 14, 2005 at 04:56:30PM +0100, Vincent Lefevre wrote:
>
>
>>Then the current zsh instances went on writing to the history file
>>without noticing that it had been truncated, hence the null bytes.
>>
>>
>
>I think this is an NFS problem, since the zsh instances do not keep the
>history file open -- they just open the file for appending, and add an
>item to the end. When the file is rewritten, it is opened for writing
>with O_TRUNC, and the new contents output.
>
>A little while ago I wrote a patch that caused zsh to change its
>rewriting strategy to use a HISTORY_FILE.new file and then rename it
>into place. The purpose of this patch is to avoid losing any history if
>zsh gets interrupted during the writing of the new history file.
>However, it should also be a friendlier update strategy for NFS dirs
>because the inode of the file changes. The downside is that it can undo
>some user's use of symlinks, hardlinks, or special group permissions on
>their history file (because it is replacing the history file instead of
>rewriting it in-place). Perhaps this algorithm should be made optional?
>
>
Won't this cause problems in the mode where history is shared, and
history is written for every command, not just once when the shell
terminates?
>I've attached a diff in case you want to try it out.
>
>..wayne..
>
>
>!DSPAM:4210f8a3201492089188992!
>
>
>------------------------------------------------------------------------
>
>--- orig/hist.c 2005-01-28 02:16:20 -0800
>+++ hist.c 2004-10-18 15:21:54 -0700
>@@ -2004,7 +2004,7 @@
> void
> savehistfile(char *fn, int err, int writeflags)
> {
>- char *t, *start = NULL;
>+ char *t, *tmpfile, *start = NULL;
> FILE *out;
> Histent he;
> zlong xcurhist = curhist - !!(histactive & HA_ACTIVE);
>@@ -2041,12 +2041,14 @@
> extended_history = 1;
> }
> if (writeflags & HFILE_APPEND) {
>+ tmpfile = NULL;
> out = fdopen(open(unmeta(fn),
> O_CREAT | O_WRONLY | O_APPEND | O_NOCTTY, 0600), "a");
> }
> else {
>- out = fdopen(open(unmeta(fn),
>- O_CREAT | O_WRONLY | O_TRUNC | O_NOCTTY, 0600), "w");
>+ tmpfile = bicat(unmeta(fn), ".new");
>+ unlink(tmpfile);
>+ out = fdopen(open(tmpfile, O_WRONLY | O_CREAT | O_EXCL, 0600), "w");
> }
> if (out) {
> for (; he && he->histnum <= xcurhist; he = down_histent(he)) {
>@@ -2091,6 +2093,11 @@
> lasthist.text = ztrdup(start);
> }
> fclose(out);
>+ if (tmpfile) {
>+ if (rename(tmpfile, unmeta(fn)) < 0)
>+ zerr("can't rename %s.new to $HISTFILE", fn, 0);
>+ free(tmpfile);
>+ }
>
> if (writeflags & HFILE_SKIPOLD
> && !(writeflags & (HFILE_FAST | HFILE_NO_REWRITE))) {
>@@ -2110,8 +2117,13 @@
> pophiststack();
> histactive = remember_histactive;
> }
>- } else if (err)
>- zerr("can't write history file %s", fn, 0);
>+ } else if (err) {
>+ if (tmpfile) {
>+ zerr("can't write history file %s.new", fn, 0);
>+ free(tmpfile);
>+ } else
>+ zerr("can't write history file %s", fn, 0);
>+ }
>
> unlockhistfile(fn);
> }
>
>
next prev parent reply other threads:[~2005-02-14 21:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-02-10 16:54 Vincent Lefevre
2005-02-10 18:41 ` Bart Schaefer
2005-02-10 23:54 ` Vincent Lefevre
2005-02-14 15:56 ` Vincent Lefevre
2005-02-14 16:24 ` Bart Schaefer
2005-02-15 9:50 ` Vincent Lefevre
2005-02-15 16:15 ` Bart Schaefer
2005-02-14 18:57 ` Wayne Davison
2005-02-14 21:06 ` Seth Kurtzberg [this message]
2005-02-14 22:33 ` Wayne Davison
2005-02-15 9:58 ` Vincent Lefevre
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=421112C4.50002@cql.com \
--to=seth@cql.com \
--cc=wayned@users.sourceforge.net \
--cc=zsh-users@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).