aboutsummaryrefslogtreecommitdiff
path: root/db2/db/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/db/db.c')
-rw-r--r--db2/db/db.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/db2/db/db.c b/db2/db/db.c
index df3a9d2d21..8dad5febe8 100644
--- a/db2/db/db.c
+++ b/db2/db/db.c
@@ -44,7 +44,7 @@
#include "config.h"
#ifndef lint
-static const char sccsid[] = "@(#)db.c 10.37 (Sleepycat) 8/23/97";
+static const char sccsid[] = "@(#)db.c 10.38 (Sleepycat) 9/2/97";
#endif /* not lint */
#ifndef NO_SYSTEM_INCLUDES
@@ -248,9 +248,6 @@ db_open(fname, type, flags, mode, dbenv, dbinfo, dbpp)
* that fail, we simply retry without the O_CREAT flag, which
* will require that the meta-data page exist.
*/
-#undef OKFLAGS
-#define OKFLAGS \
- DB_CREATE | DB_NOMMAP | DB_RDONLY | DB_THREAD | DB_TRUNCATE
retry_cnt = 0;
open_retry: if (LF_ISSET(DB_CREATE)) {
if ((ret = __db_fdopen(real_name, flags | DB_EXCL,
@@ -308,13 +305,20 @@ open_retry: if (LF_ISSET(DB_CREATE)) {
}
/*
* The only way we can reach here with the DB_CREATE
- * flag set is if we created the file. If we didn't
- * create the file, there's a chance that someone else
- * is busily doing so. Sleep and give them a chance,
- * because we need the metadata page their going to
- * write.
+ * flag set is if we created the file. If that's not
+ * the case, then a) someone else created the file
+ * but has not yet written out the meta-data page, or
+ * b) we truncated the file (DB_TRUNCATE) leaving it
+ * zero-length. In the case of a), we want to sleep
+ * and give the file creator some time to write the
+ * metadata page. In the case of b), charge forward.
+ * Note, there is a race in the case of two processes
+ * opening the file with the DB_TRUNCATE flag set at
+ * roughly the same time, and they could theoretically
+ * hurt each other, although it's pretty unlikely.
*/
- if (!LF_ISSET(DB_CREATE) && retry_cnt++ < 3) {
+ if (retry_cnt++ < 3 &&
+ !LF_ISSET(DB_CREATE | DB_TRUNCATE)) {
__db_sleep(1, 0);
goto open_retry;
}