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