@@ -136,11 +136,13 @@ Database::Implementation::~Implementation() {
136
136
137
137
std::shared_ptr<Database::Implementation>
138
138
Database::Implementation::create (StringRef path, bool readonly, Optional<size_t > initialDBSize, std::string &error) {
139
+ fputs (" CP 8.2.2.2.1.5.1\n " , stderr);
139
140
SmallString<10 > versionStr;
140
141
llvm::raw_svector_ostream (versionStr) << ' v' << Database::DATABASE_FORMAT_VERSION;
141
142
SmallString<128 > versionPath = path;
142
143
llvm::sys::path::append (versionPath, versionStr);
143
144
145
+ fputs (" CP 8.2.2.2.1.5.2\n " , stderr);
144
146
SmallString<128 > savedPathBuf = versionPath;
145
147
llvm::sys::path::append (savedPathBuf, " saved" );
146
148
SmallString<128 > prefixPathBuf = versionPath;
@@ -153,6 +155,7 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
153
155
SmallString<128 > uniqueDirPath;
154
156
155
157
bool existingDB = true ;
158
+ fputs (" CP 8.2.2.2.1.5.3\n " , stderr);
156
159
157
160
auto createDirectoriesOrError = [&error](SmallVectorImpl<char > &path) {
158
161
if (std::error_code ec = llvm::sys::fs::create_directories (path)) {
@@ -170,8 +173,10 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
170
173
return false ;
171
174
};
172
175
176
+ fputs (" CP 8.2.2.2.1.5.4\n " , stderr);
173
177
StringRef dbPath;
174
178
if (!readonly) {
179
+ fputs (" CP 8.2.2.2.1.5.5a\n " , stderr);
175
180
if (createDirectoriesOrError (versionPath))
176
181
return nullptr ;
177
182
@@ -189,25 +194,30 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
189
194
}
190
195
dbPath = uniqueDirPath;
191
196
} else {
197
+ fputs (" CP 8.2.2.2.1.5.5b\n " , stderr);
192
198
dbPath = savedPathBuf;
193
199
}
194
200
195
201
retry:
202
+ fputs (" CP 8.2.2.2.1.5.6\n " , stderr);
196
203
try {
204
+ fputs (" CP 8.2.2.2.1.5.7\n " , stderr);
197
205
auto db = std::make_shared<Database::Implementation>();
198
206
db->IsReadOnly = readonly;
199
207
db->VersionedPath = versionPath.str ();
200
208
db->SavedPath = savedPathBuf.str ();
201
209
db->UniquePath = uniqueDirPath.str ();
202
210
db->DBEnv = lmdb::env::create ();
203
211
db->DBEnv .set_max_dbs (14 );
212
+ fputs (" CP 8.2.2.2.1.5.8\n " , stderr);
204
213
205
214
uint64_t dbFileSize = 0 ;
206
215
if (existingDB) {
207
216
if (std::error_code ec = llvm::sys::fs::file_size (dbPath + " /data.mdb" , dbFileSize)) {
208
217
LOG_WARN_FUNC (" failed reading database file size " << dbPath << " /data.mdb: " << ec.message ());
209
218
}
210
219
}
220
+ fputs (" CP 8.2.2.2.1.5.9\n " , stderr);
211
221
// Start with 64MB.
212
222
uint64_t initialSize = initialDBSize.getValueOr (64ULL *1024ULL *1024ULL );
213
223
@@ -219,11 +229,14 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
219
229
openflags |= MDB_RDONLY;
220
230
db->DBEnv .open (dbPath, openflags);
221
231
db->MaxKeySize = lmdb::env_get_max_keysize (db->DBEnv );
232
+ fputs (" CP 8.2.2.2.1.5.10\n " , stderr);
222
233
223
234
unsigned txnflags = lmdb::txn::default_flags;
224
235
if (readonly)
225
236
txnflags |= MDB_RDONLY;
237
+ fputs (" CP 8.2.2.2.1.5.11\n " , stderr);
226
238
auto txn = lmdb::txn::begin (db->DBEnv , /* parent=*/ nullptr , txnflags);
239
+ fputs (" CP 8.2.2.2.1.5.12\n " , stderr);
227
240
db->DBISymbolProvidersByUSR = lmdb::dbi::open (txn, " usrs" , MDB_INTEGERKEY|MDB_DUPSORT|MDB_DUPFIXED|MDB_CREATE);
228
241
db->DBISymbolProvidersByUSR .set_dupsort (txn, providersForUSR_compare);
229
242
db->DBISymbolProviderNameByCode = lmdb::dbi::open (txn, " providers" , MDB_INTEGERKEY|MDB_CREATE);
@@ -240,14 +253,19 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
240
253
db->DBIUnitByUnitDependency = lmdb::dbi::open (txn, " unit-by-unit" , MDB_INTEGERKEY|MDB_DUPSORT|MDB_DUPFIXED|MDB_INTEGERDUP|MDB_CREATE);
241
254
db->DBITargetNameByCode = lmdb::dbi::open (txn, " target-names" , MDB_INTEGERKEY|MDB_CREATE);
242
255
db->DBIModuleNameByCode = lmdb::dbi::open (txn, " module-names" , MDB_INTEGERKEY|MDB_CREATE);
256
+ fputs (" CP 8.2.2.2.1.5.13\n " , stderr);
243
257
txn.commit ();
258
+ fputs (" CP 8.2.2.2.1.5.14\n " , stderr);
244
259
245
260
db->cleanupDiscardedDBs ();
261
+ fputs (" CP 8.2.2.2.1.5.15\n " , stderr);
246
262
247
263
return db;
248
264
249
265
} catch (lmdb::error err) {
266
+ fputs (" CP 8.2.2.2.1.5.c.1\n " , stderr);
250
267
if (existingDB) {
268
+ fputs (" CP 8.2.2.2.1.5.c.2\n " , stderr);
251
269
// If opening an existing database fails, create a new database. This
252
270
// prevents a corrupted database from preventing all progress.
253
271
@@ -260,13 +278,16 @@ Database::Implementation::create(StringRef path, bool readonly, Optional<size_t>
260
278
LOG_WARN_FUNC (" failed opening database: " << err.description () << " \n "
261
279
" corrupted database saved at '" << corruptedPathBuf << " '\n "
262
280
" creating new database..." );
281
+ fputs (" CP 8.2.2.2.1.5.c.3\n " , stderr);
263
282
264
283
// Recreate the unique database path for the next attempt.
265
284
if (!readonly && createUniqueDirOrError ())
266
285
return nullptr ;
286
+ fputs (" CP 8.2.2.2.1.5.c.3\n " , stderr);
267
287
existingDB = false ;
268
288
goto retry;
269
289
}
290
+ fputs (" CP 8.2.2.2.1.5.16\n " , stderr);
270
291
llvm::raw_string_ostream (error) << " failed opening database: " << err.description ();
271
292
return nullptr ;
272
293
}
@@ -436,29 +457,37 @@ void Database::Implementation::printStats(raw_ostream &OS) {
436
457
// had the chance to close it.
437
458
static std::shared_ptr<Database::Implementation>
438
459
getLMDBDatabaseRefForPath (StringRef dbPath, bool readonly, Optional<size_t > initialDBSize, std::string &error) {
460
+ fputs (" CP 8.2.2.2.1.1\n " , stderr);
439
461
static llvm::sys::Mutex processDatabasesMtx;
440
462
static llvm::StringMap<std::weak_ptr<Database::Implementation>> databasesByPath;
441
463
442
464
// Note that canonicalization of the path may result in different paths, if the
443
465
// path doesn't exist yet vs the path exists. Use the path as given by the client.
444
466
467
+ fputs (" CP 8.2.2.2.1.2\n " , stderr);
445
468
llvm::sys::ScopedLock L (processDatabasesMtx);
469
+ fputs (" CP 8.2.2.2.1.3\n " , stderr);
446
470
std::weak_ptr<Database::Implementation> &dbWeakRef = databasesByPath[dbPath];
471
+ fputs (" CP 8.2.2.2.1.4\n " , stderr);
447
472
if (auto dbRef = dbWeakRef.lock ()) {
448
473
return dbRef;
449
474
}
475
+ fputs (" CP 8.2.2.2.1.5\n " , stderr);
450
476
auto dbRef = Database::Implementation::create (dbPath, readonly, initialDBSize, error);
477
+ fputs (" CP 8.2.2.2.1.6\n " , stderr);
451
478
if (!dbRef)
452
479
return nullptr ;
453
480
dbWeakRef = dbRef;
454
481
return dbRef;
455
482
}
456
483
457
484
DatabaseRef Database::create (StringRef dbPath, bool readonly, Optional<size_t > initialDBSize, std::string &error) {
485
+ fputs (" CP 8.2.2.2.1\n " , stderr);
458
486
auto impl = getLMDBDatabaseRefForPath (dbPath, readonly, initialDBSize, error);
459
487
if (!impl)
460
488
return nullptr ;
461
489
490
+ fputs (" CP 8.2.2.2.2\n " , stderr);
462
491
auto db = std::make_shared<Database>();
463
492
db->Impl = std::move (impl);
464
493
return db;
0 commit comments