git-p4: test with limited p4 server results
[git] / lockfile.c
1 /*
2  * Copyright (c) 2005, Junio C Hamano
3  */
4 #include "cache.h"
5 #include "lockfile.h"
6 #include "sigchain.h"
7
8 static struct lock_file *volatile lock_file_list;
9
10 static void remove_lock_files(int skip_fclose)
11 {
12         pid_t me = getpid();
13
14         while (lock_file_list) {
15                 if (lock_file_list->owner == me) {
16                         /* fclose() is not safe to call in a signal handler */
17                         if (skip_fclose)
18                                 lock_file_list->fp = NULL;
19                         rollback_lock_file(lock_file_list);
20                 }
21                 lock_file_list = lock_file_list->next;
22         }
23 }
24
25 static void remove_lock_files_on_exit(void)
26 {
27         remove_lock_files(0);
28 }
29
30 static void remove_lock_files_on_signal(int signo)
31 {
32         remove_lock_files(1);
33         sigchain_pop(signo);
34         raise(signo);
35 }
36
37 /*
38  * path = absolute or relative path name
39  *
40  * Remove the last path name element from path (leaving the preceding
41  * "/", if any).  If path is empty or the root directory ("/"), set
42  * path to the empty string.
43  */
44 static void trim_last_path_component(struct strbuf *path)
45 {
46         int i = path->len;
47
48         /* back up past trailing slashes, if any */
49         while (i && path->buf[i - 1] == '/')
50                 i--;
51
52         /*
53          * then go backwards until a slash, or the beginning of the
54          * string
55          */
56         while (i && path->buf[i - 1] != '/')
57                 i--;
58
59         strbuf_setlen(path, i);
60 }
61
62
63 /* We allow "recursive" symbolic links. Only within reason, though */
64 #define MAXDEPTH 5
65
66 /*
67  * path contains a path that might be a symlink.
68  *
69  * If path is a symlink, attempt to overwrite it with a path to the
70  * real file or directory (which may or may not exist), following a
71  * chain of symlinks if necessary.  Otherwise, leave path unmodified.
72  *
73  * This is a best-effort routine.  If an error occurs, path will
74  * either be left unmodified or will name a different symlink in a
75  * symlink chain that started with the original path.
76  */
77 static void resolve_symlink(struct strbuf *path)
78 {
79         int depth = MAXDEPTH;
80         static struct strbuf link = STRBUF_INIT;
81
82         while (depth--) {
83                 if (strbuf_readlink(&link, path->buf, path->len) < 0)
84                         break;
85
86                 if (is_absolute_path(link.buf))
87                         /* absolute path simply replaces p */
88                         strbuf_reset(path);
89                 else
90                         /*
91                          * link is a relative path, so replace the
92                          * last element of p with it.
93                          */
94                         trim_last_path_component(path);
95
96                 strbuf_addbuf(path, &link);
97         }
98         strbuf_reset(&link);
99 }
100
101 /* Make sure errno contains a meaningful value on error */
102 static int lock_file(struct lock_file *lk, const char *path, int flags)
103 {
104         size_t pathlen = strlen(path);
105
106         if (!lock_file_list) {
107                 /* One-time initialization */
108                 sigchain_push_common(remove_lock_files_on_signal);
109                 atexit(remove_lock_files_on_exit);
110         }
111
112         if (lk->active)
113                 die("BUG: cannot lock_file(\"%s\") using active struct lock_file",
114                     path);
115         if (!lk->on_list) {
116                 /* Initialize *lk and add it to lock_file_list: */
117                 lk->fd = -1;
118                 lk->fp = NULL;
119                 lk->active = 0;
120                 lk->owner = 0;
121                 strbuf_init(&lk->filename, pathlen + LOCK_SUFFIX_LEN);
122                 lk->next = lock_file_list;
123                 lock_file_list = lk;
124                 lk->on_list = 1;
125         } else if (lk->filename.len) {
126                 /* This shouldn't happen, but better safe than sorry. */
127                 die("BUG: lock_file(\"%s\") called with improperly-reset lock_file object",
128                     path);
129         }
130
131         if (flags & LOCK_NO_DEREF) {
132                 strbuf_add_absolute_path(&lk->filename, path);
133         } else {
134                 struct strbuf resolved_path = STRBUF_INIT;
135
136                 strbuf_add(&resolved_path, path, pathlen);
137                 resolve_symlink(&resolved_path);
138                 strbuf_add_absolute_path(&lk->filename, resolved_path.buf);
139                 strbuf_release(&resolved_path);
140         }
141
142         strbuf_addstr(&lk->filename, LOCK_SUFFIX);
143         lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
144         if (lk->fd < 0) {
145                 strbuf_reset(&lk->filename);
146                 return -1;
147         }
148         lk->owner = getpid();
149         lk->active = 1;
150         if (adjust_shared_perm(lk->filename.buf)) {
151                 int save_errno = errno;
152                 error("cannot fix permission bits on %s", lk->filename.buf);
153                 rollback_lock_file(lk);
154                 errno = save_errno;
155                 return -1;
156         }
157         return lk->fd;
158 }
159
160 static int sleep_microseconds(long us)
161 {
162         struct timeval tv;
163         tv.tv_sec = 0;
164         tv.tv_usec = us;
165         return select(0, NULL, NULL, NULL, &tv);
166 }
167
168 /*
169  * Constants defining the gaps between attempts to lock a file. The
170  * first backoff period is approximately INITIAL_BACKOFF_MS
171  * milliseconds. The longest backoff period is approximately
172  * (BACKOFF_MAX_MULTIPLIER * INITIAL_BACKOFF_MS) milliseconds.
173  */
174 #define INITIAL_BACKOFF_MS 1L
175 #define BACKOFF_MAX_MULTIPLIER 1000
176
177 /*
178  * Try locking path, retrying with quadratic backoff for at least
179  * timeout_ms milliseconds. If timeout_ms is 0, try locking the file
180  * exactly once. If timeout_ms is -1, try indefinitely.
181  */
182 static int lock_file_timeout(struct lock_file *lk, const char *path,
183                              int flags, long timeout_ms)
184 {
185         int n = 1;
186         int multiplier = 1;
187         long remaining_us = 0;
188         static int random_initialized = 0;
189
190         if (timeout_ms == 0)
191                 return lock_file(lk, path, flags);
192
193         if (!random_initialized) {
194                 srandom((unsigned int)getpid());
195                 random_initialized = 1;
196         }
197
198         if (timeout_ms > 0) {
199                 /* avoid overflow */
200                 if (timeout_ms <= LONG_MAX / 1000)
201                         remaining_us = timeout_ms * 1000;
202                 else
203                         remaining_us = LONG_MAX;
204         }
205
206         while (1) {
207                 long backoff_ms, wait_us;
208                 int fd;
209
210                 fd = lock_file(lk, path, flags);
211
212                 if (fd >= 0)
213                         return fd; /* success */
214                 else if (errno != EEXIST)
215                         return -1; /* failure other than lock held */
216                 else if (timeout_ms > 0 && remaining_us <= 0)
217                         return -1; /* failure due to timeout */
218
219                 backoff_ms = multiplier * INITIAL_BACKOFF_MS;
220                 /* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
221                 wait_us = (750 + random() % 500) * backoff_ms;
222                 sleep_microseconds(wait_us);
223                 remaining_us -= wait_us;
224
225                 /* Recursion: (n+1)^2 = n^2 + 2n + 1 */
226                 multiplier += 2*n + 1;
227                 if (multiplier > BACKOFF_MAX_MULTIPLIER)
228                         multiplier = BACKOFF_MAX_MULTIPLIER;
229                 else
230                         n++;
231         }
232 }
233
234 void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
235 {
236         if (err == EEXIST) {
237                 strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
238                     "If no other git process is currently running, this probably means a\n"
239                     "git process crashed in this repository earlier. Make sure no other git\n"
240                     "process is running and remove the file manually to continue.",
241                             absolute_path(path), strerror(err));
242         } else
243                 strbuf_addf(buf, "Unable to create '%s.lock': %s",
244                             absolute_path(path), strerror(err));
245 }
246
247 NORETURN void unable_to_lock_die(const char *path, int err)
248 {
249         struct strbuf buf = STRBUF_INIT;
250
251         unable_to_lock_message(path, err, &buf);
252         die("%s", buf.buf);
253 }
254
255 /* This should return a meaningful errno on failure */
256 int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
257                                       int flags, long timeout_ms)
258 {
259         int fd = lock_file_timeout(lk, path, flags, timeout_ms);
260         if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
261                 unable_to_lock_die(path, errno);
262         return fd;
263 }
264
265 int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags)
266 {
267         int fd, orig_fd;
268
269         fd = lock_file(lk, path, flags);
270         if (fd < 0) {
271                 if (flags & LOCK_DIE_ON_ERROR)
272                         unable_to_lock_die(path, errno);
273                 return fd;
274         }
275
276         orig_fd = open(path, O_RDONLY);
277         if (orig_fd < 0) {
278                 if (errno != ENOENT) {
279                         int save_errno = errno;
280
281                         if (flags & LOCK_DIE_ON_ERROR)
282                                 die("cannot open '%s' for copying", path);
283                         rollback_lock_file(lk);
284                         error("cannot open '%s' for copying", path);
285                         errno = save_errno;
286                         return -1;
287                 }
288         } else if (copy_fd(orig_fd, fd)) {
289                 int save_errno = errno;
290
291                 if (flags & LOCK_DIE_ON_ERROR)
292                         die("failed to prepare '%s' for appending", path);
293                 close(orig_fd);
294                 rollback_lock_file(lk);
295                 errno = save_errno;
296                 return -1;
297         } else {
298                 close(orig_fd);
299         }
300         return fd;
301 }
302
303 FILE *fdopen_lock_file(struct lock_file *lk, const char *mode)
304 {
305         if (!lk->active)
306                 die("BUG: fdopen_lock_file() called for unlocked object");
307         if (lk->fp)
308                 die("BUG: fdopen_lock_file() called twice for file '%s'", lk->filename.buf);
309
310         lk->fp = fdopen(lk->fd, mode);
311         return lk->fp;
312 }
313
314 char *get_locked_file_path(struct lock_file *lk)
315 {
316         if (!lk->active)
317                 die("BUG: get_locked_file_path() called for unlocked object");
318         if (lk->filename.len <= LOCK_SUFFIX_LEN)
319                 die("BUG: get_locked_file_path() called for malformed lock object");
320         return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN);
321 }
322
323 int close_lock_file(struct lock_file *lk)
324 {
325         int fd = lk->fd;
326         FILE *fp = lk->fp;
327         int err;
328
329         if (fd < 0)
330                 return 0;
331
332         lk->fd = -1;
333         if (fp) {
334                 lk->fp = NULL;
335
336                 /*
337                  * Note: no short-circuiting here; we want to fclose()
338                  * in any case!
339                  */
340                 err = ferror(fp) | fclose(fp);
341         } else {
342                 err = close(fd);
343         }
344
345         if (err) {
346                 int save_errno = errno;
347                 rollback_lock_file(lk);
348                 errno = save_errno;
349                 return -1;
350         }
351
352         return 0;
353 }
354
355 int reopen_lock_file(struct lock_file *lk)
356 {
357         if (0 <= lk->fd)
358                 die(_("BUG: reopen a lockfile that is still open"));
359         if (!lk->active)
360                 die(_("BUG: reopen a lockfile that has been committed"));
361         lk->fd = open(lk->filename.buf, O_WRONLY);
362         return lk->fd;
363 }
364
365 int commit_lock_file_to(struct lock_file *lk, const char *path)
366 {
367         if (!lk->active)
368                 die("BUG: attempt to commit unlocked object to \"%s\"", path);
369
370         if (close_lock_file(lk))
371                 return -1;
372
373         if (rename(lk->filename.buf, path)) {
374                 int save_errno = errno;
375                 rollback_lock_file(lk);
376                 errno = save_errno;
377                 return -1;
378         }
379
380         lk->active = 0;
381         strbuf_reset(&lk->filename);
382         return 0;
383 }
384
385 int commit_lock_file(struct lock_file *lk)
386 {
387         static struct strbuf result_file = STRBUF_INIT;
388         int err;
389
390         if (!lk->active)
391                 die("BUG: attempt to commit unlocked object");
392
393         if (lk->filename.len <= LOCK_SUFFIX_LEN ||
394             strcmp(lk->filename.buf + lk->filename.len - LOCK_SUFFIX_LEN, LOCK_SUFFIX))
395                 die("BUG: lockfile filename corrupt");
396
397         /* remove ".lock": */
398         strbuf_add(&result_file, lk->filename.buf,
399                    lk->filename.len - LOCK_SUFFIX_LEN);
400         err = commit_lock_file_to(lk, result_file.buf);
401         strbuf_reset(&result_file);
402         return err;
403 }
404
405 void rollback_lock_file(struct lock_file *lk)
406 {
407         if (!lk->active)
408                 return;
409
410         if (!close_lock_file(lk)) {
411                 unlink_or_warn(lk->filename.buf);
412                 lk->active = 0;
413                 strbuf_reset(&lk->filename);
414         }
415 }