lockfile.c 9.6 KB
Newer Older
1 2 3 4
/*
 * Copyright (c) 2005, Junio C Hamano
 */
#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 13
	pid_t me = getpid();

14
	while (lock_file_list) {
15 16 17 18
		if (lock_file_list->owner == me) {
			/* fclose() is not safe to call in a signal handler */
			if (skip_fclose)
				lock_file_list->fp = NULL;
19
			rollback_lock_file(lock_file_list);
20
		}
21 22 23 24
		lock_file_list = lock_file_list->next;
	}
}

25 26 27 28 29
static void remove_lock_files_on_exit(void)
{
	remove_lock_files(0);
}

30
static void remove_lock_files_on_signal(int signo)
31
{
32
	remove_lock_files(1);
33
	sigchain_pop(signo);
34 35 36
	raise(signo);
}

37
/*
38
 * path = absolute or relative path name
39
 *
40 41 42
 * Remove the last path name element from path (leaving the preceding
 * "/", if any).  If path is empty or the root directory ("/"), set
 * 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 50
	while (i && path->buf[i - 1] == '/')
		i--;
51 52

	/*
53 54
	 * then go backwards until a slash, or the beginning of the
	 * string
55
	 */
56 57 58 59
	while (i && path->buf[i - 1] != '/')
		i--;

	strbuf_setlen(path, i);
60 61 62 63 64 65 66
}


/* We allow "recursive" symbolic links. Only within reason, though */
#define MAXDEPTH 5

/*
67
 * path contains a path that might be a symlink.
68
 *
69 70 71
 * If path is a symlink, attempt to overwrite it with a path to the
 * real file or directory (which may or may not exist), following a
 * chain of symlinks if necessary.  Otherwise, leave path unmodified.
72
 *
73 74 75
 * This is a best-effort routine.  If an error occurs, path will
 * either be left unmodified or will name a different symlink in a
 * 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 93
			 * last element of p with it.
			 */
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 107
	if (!lock_file_list) {
		/* One-time initialization */
108
		sigchain_push_common(remove_lock_files_on_signal);
109
		atexit(remove_lock_files_on_exit);
110 111
	}

112 113 114
	if (lk->active)
		die("BUG: cannot lock_file(\"%s\") using active struct lock_file",
		    path);
115 116 117
	if (!lk->on_list) {
		/* Initialize *lk and add it to lock_file_list: */
		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 123 124
		lk->next = lock_file_list;
		lock_file_list = lk;
		lk->on_list = 1;
125 126 127 128
	} else if (lk->filename.len) {
		/* This shouldn't happen, but better safe than sorry. */
		die("BUG: lock_file(\"%s\") called with improperly-reset lock_file object",
		    path);
129 130
	}

131 132 133 134 135 136 137 138 139 140 141
	if (flags & LOCK_NO_DEREF) {
		strbuf_add_absolute_path(&lk->filename, path);
	} else {
		struct strbuf resolved_path = STRBUF_INIT;

		strbuf_add(&resolved_path, path, pathlen);
		resolve_symlink(&resolved_path);
		strbuf_add_absolute_path(&lk->filename, resolved_path.buf);
		strbuf_release(&resolved_path);
	}

142 143
	strbuf_addstr(&lk->filename, LOCK_SUFFIX);
	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 154 155
		rollback_lock_file(lk);
		errno = save_errno;
		return -1;
156
	}
157
	return lk->fd;
158 159
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
static int sleep_microseconds(long us)
{
	struct timeval tv;
	tv.tv_sec = 0;
	tv.tv_usec = us;
	return select(0, NULL, NULL, NULL, &tv);
}

/*
 * Constants defining the gaps between attempts to lock a file. The
 * first backoff period is approximately INITIAL_BACKOFF_MS
 * milliseconds. The longest backoff period is approximately
 * (BACKOFF_MAX_MULTIPLIER * INITIAL_BACKOFF_MS) milliseconds.
 */
#define INITIAL_BACKOFF_MS 1L
#define BACKOFF_MAX_MULTIPLIER 1000

/*
 * Try locking path, retrying with quadratic backoff for at least
 * timeout_ms milliseconds. If timeout_ms is 0, try locking the file
 * exactly once. If timeout_ms is -1, try indefinitely.
 */
static int lock_file_timeout(struct lock_file *lk, const char *path,
			     int flags, long timeout_ms)
{
	int n = 1;
	int multiplier = 1;
187
	long remaining_ms = 0;
188 189 190 191 192 193
	static int random_initialized = 0;

	if (timeout_ms == 0)
		return lock_file(lk, path, flags);

	if (!random_initialized) {
194
		srand((unsigned int)getpid());
195 196 197
		random_initialized = 1;
	}

198 199
	if (timeout_ms > 0)
		remaining_ms = timeout_ms;
200 201

	while (1) {
202
		long backoff_ms, wait_ms;
203 204 205 206 207 208 209 210
		int fd;

		fd = lock_file(lk, path, flags);

		if (fd >= 0)
			return fd; /* success */
		else if (errno != EEXIST)
			return -1; /* failure other than lock held */
211
		else if (timeout_ms > 0 && remaining_ms <= 0)
212 213 214 215
			return -1; /* failure due to timeout */

		backoff_ms = multiplier * INITIAL_BACKOFF_MS;
		/* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
216 217 218
		wait_ms = (750 + rand() % 500) * backoff_ms / 1000;
		sleep_microseconds(wait_ms*1000);
		remaining_ms -= wait_ms;
219 220 221 222 223 224 225 226 227 228

		/* Recursion: (n+1)^2 = n^2 + 2n + 1 */
		multiplier += 2*n + 1;
		if (multiplier > BACKOFF_MAX_MULTIPLIER)
			multiplier = BACKOFF_MAX_MULTIPLIER;
		else
			n++;
	}
}

229
void unable_to_lock_message(const char *path, int err, struct strbuf *buf)
230
{
231
	if (err == EEXIST) {
232
		strbuf_addf(buf, "Unable to create '%s.lock': %s.\n\n"
233 234 235
		    "If no other git process is currently running, this probably means a\n"
		    "git process crashed in this repository earlier. Make sure no other git\n"
		    "process is running and remove the file manually to continue.",
236
			    absolute_path(path), strerror(err));
237
	} else
238
		strbuf_addf(buf, "Unable to create '%s.lock': %s",
239
			    absolute_path(path), strerror(err));
240 241
}

242
NORETURN void unable_to_lock_die(const char *path, int err)
243
{
244 245 246 247
	struct strbuf buf = STRBUF_INIT;

	unable_to_lock_message(path, err, &buf);
	die("%s", buf.buf);
248 249
}

250
/* This should return a meaningful errno on failure */
251 252
int hold_lock_file_for_update_timeout(struct lock_file *lk, const char *path,
				      int flags, long timeout_ms)
253
{
254
	int fd = lock_file_timeout(lk, path, flags, timeout_ms);
255
	if (fd < 0 && (flags & LOCK_DIE_ON_ERROR))
256
		unable_to_lock_die(path, errno);
257 258 259
	return fd;
}

260
int hold_lock_file_for_append(struct lock_file *lk, const char *path, int flags)
261 262 263
{
	int fd, orig_fd;

264
	fd = lock_file(lk, path, flags);
265
	if (fd < 0) {
266
		if (flags & LOCK_DIE_ON_ERROR)
267
			unable_to_lock_die(path, errno);
268 269 270 271 272 273
		return fd;
	}

	orig_fd = open(path, O_RDONLY);
	if (orig_fd < 0) {
		if (errno != ENOENT) {
274 275
			int save_errno = errno;

276
			if (flags & LOCK_DIE_ON_ERROR)
277
				die("cannot open '%s' for copying", path);
278
			rollback_lock_file(lk);
279 280 281
			error("cannot open '%s' for copying", path);
			errno = save_errno;
			return -1;
282 283
		}
	} else if (copy_fd(orig_fd, fd)) {
284 285
		int save_errno = errno;

286
		if (flags & LOCK_DIE_ON_ERROR)
287
			exit(128);
288
		close(orig_fd);
289
		rollback_lock_file(lk);
290
		errno = save_errno;
291
		return -1;
292 293
	} else {
		close(orig_fd);
294 295 296 297
	}
	return fd;
}

298 299 300 301 302 303 304 305 306 307 308
FILE *fdopen_lock_file(struct lock_file *lk, const char *mode)
{
	if (!lk->active)
		die("BUG: fdopen_lock_file() called for unlocked object");
	if (lk->fp)
		die("BUG: fdopen_lock_file() called twice for file '%s'", lk->filename.buf);

	lk->fp = fdopen(lk->fd, mode);
	return lk->fp;
}

309 310 311 312 313 314 315 316 317
char *get_locked_file_path(struct lock_file *lk)
{
	if (!lk->active)
		die("BUG: get_locked_file_path() called for unlocked object");
	if (lk->filename.len <= LOCK_SUFFIX_LEN)
		die("BUG: get_locked_file_path() called for malformed lock object");
	return xmemdupz(lk->filename.buf, lk->filename.len - LOCK_SUFFIX_LEN);
}

318 319 320
int close_lock_file(struct lock_file *lk)
{
	int fd = lk->fd;
321 322
	FILE *fp = lk->fp;
	int err;
323 324 325 326

	if (fd < 0)
		return 0;

327
	lk->fd = -1;
328 329 330 331 332 333 334 335 336 337 338 339 340
	if (fp) {
		lk->fp = NULL;

		/*
		 * Note: no short-circuiting here; we want to fclose()
		 * in any case!
		 */
		err = ferror(fp) | fclose(fp);
	} else {
		err = close(fd);
	}

	if (err) {
341 342 343 344 345
		int save_errno = errno;
		rollback_lock_file(lk);
		errno = save_errno;
		return -1;
	}
346

347
	return 0;
348 349
}

350 351 352 353
int reopen_lock_file(struct lock_file *lk)
{
	if (0 <= lk->fd)
		die(_("BUG: reopen a lockfile that is still open"));
354
	if (!lk->active)
355
		die(_("BUG: reopen a lockfile that has been committed"));
356
	lk->fd = open(lk->filename.buf, O_WRONLY);
357 358 359
	return lk->fd;
}

360
int commit_lock_file_to(struct lock_file *lk, const char *path)
361
{
362
	if (!lk->active)
363
		die("BUG: attempt to commit unlocked object to \"%s\"", path);
364

365
	if (close_lock_file(lk))
366
		return -1;
367

368
	if (rename(lk->filename.buf, path)) {
369 370 371
		int save_errno = errno;
		rollback_lock_file(lk);
		errno = save_errno;
372
		return -1;
373 374
	}

375
	lk->active = 0;
376
	strbuf_reset(&lk->filename);
377
	return 0;
378 379
}

380
int commit_lock_file(struct lock_file *lk)
381
{
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
	static struct strbuf result_file = STRBUF_INIT;
	int err;

	if (!lk->active)
		die("BUG: attempt to commit unlocked object");

	if (lk->filename.len <= LOCK_SUFFIX_LEN ||
	    strcmp(lk->filename.buf + lk->filename.len - LOCK_SUFFIX_LEN, LOCK_SUFFIX))
		die("BUG: lockfile filename corrupt");

	/* remove ".lock": */
	strbuf_add(&result_file, lk->filename.buf,
		   lk->filename.len - LOCK_SUFFIX_LEN);
	err = commit_lock_file_to(lk, result_file.buf);
	strbuf_reset(&result_file);
	return err;
398 399
}

400 401
void rollback_lock_file(struct lock_file *lk)
{
402
	if (!lk->active)
403 404
		return;

405
	if (!close_lock_file(lk)) {
406
		unlink_or_warn(lk->filename.buf);
407
		lk->active = 0;
408
		strbuf_reset(&lk->filename);
409
	}
410
}