[SERVER-7362] With Boost::filesystem v3 on Windows, we need to work with canonical file paths Created: 15/Oct/12  Updated: 11/Jul/16  Resolved: 15/Oct/12

Status: Closed
Project: Core Server
Component/s: Internal Code
Affects Version/s: None
Fix Version/s: 2.3.0

Type: Bug Priority: Major - P3
Reporter: Tad Marshall Assignee: Andy Schwerin
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Windows


Operating System: ALL
Participants:

 Description   

We use string comparisons internally to match file specifications in several places, but users can provide any legal combination of slash and backslash in specifying paths (dbpath, etc.). Moreover, Boost::filesystem v3's string() function prefers "native" path separator characters (so backslash on Windows).

We need to convert path characters to a common format (e.g. Unix-style "/") and use Boost::filesystem v3's generic_string() (or similar) so that string comparisons work as expected.

Buildbot failures:
http://buildlogs.mongodb.org/Windows%2064-bit%20DEBUG/builds/257/test/disk/repair.js

m31000| Mon Oct 15 12:16:47 [conn1] opening db: /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0 jstests_disk_repair
 m31000| Mon Oct 15 12:16:47 [conn1] info PageFaultRetryableSection will not yield, already locked upon reaching
 m31000| Mon Oct 15 12:16:47 [FileAllocator] allocating new datafile /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.ns, filling with zeroes...
 m31000| Mon Oct 15 12:16:47 [FileAllocator] creating directory /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\_tmp
 m31000| Mon Oct 15 12:16:48 [FileAllocator] done allocating datafile /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.ns, size: 16MB,  took 0.132 secs
 m31000| Mon Oct 15 12:16:48 [FileAllocator] allocating new datafile /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.0, filling with zeroes...
 m31000| Mon Oct 15 12:16:48 [FileAllocator] done allocating datafile /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.0, size: 64MB,  took 0.548 secs
 m31000| Mon Oct 15 12:16:48 [conn1] datafileheader::init initializing /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.0 n:0
 m31000| Mon Oct 15 12:16:48 [FileAllocator] allocating new datafile /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.1, filling with zeroes...
 m31000| Mon Oct 15 12:16:48 [conn1] build index jstests_disk_repair.jstests_disk_repair { _id: 1 }
 m31000| Mon Oct 15 12:16:48 [conn1] 	 fastBuildIndex dupsToDrop:0
 m31000| Mon Oct 15 12:16:48 [conn1] build index done.  scanned 1 total records. 0.001 secs
 m31000| Mon Oct 15 12:16:49 [conn1] journal error applying writes, file /data/db/jstests_disk_repair\repairDir/backup_repairDatabase_0\jstests_disk_repair.ns is not open
 m31000| Mon Oct 15 12:16:49 [conn1]   Assertion failure false src\mongo\db\dur_recover.cpp 244
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\util\stacktrace.cpp(161)         mongo::printStackTrace+0x5b
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\util\log.cpp(435)                mongo::logContext+0x72
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\util\assert_util.cpp(109)        mongo::verifyFailed+0x190
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_recover.cpp(244)          mongo::dur::RecoveryJob::Last::newEntry+0x236
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_recover.cpp(264)          mongo::dur::RecoveryJob::write+0x108
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_recover.cpp(295)          mongo::dur::RecoveryJob::applyEntry+0x3b5
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_recover.cpp(348)          mongo::dur::RecoveryJob::applyEntries+0x1a3
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_recover.cpp(415)          mongo::dur::RecoveryJob::processSection+0x5c5
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_writetodatafiles.cpp(33)  mongo::dur::WRITETODATAFILES_Impl1+0xdb
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur_writetodatafiles.cpp(87)  mongo::dur::WRITETODATAFILES+0x45
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(664)                  mongo::dur::_groupCommit+0x15c
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(713)                  mongo::dur::groupCommit+0x4f
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(207)                  mongo::dur::DurableImpl::commitNow+0x3b
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(302)                  mongo::dur::DurableImpl::_aCommitIsNeeded+0x341
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(330)                  mongo::dur::DurableImpl::commitIfNeeded+0x7f
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\dur.cpp(766)                  mongo::dur::closingFileNotification+0x4a
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\mongommf.cpp(229)             mongo::MongoMMF::close+0x149
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe  ...\src\mongo\db\mongommf.cpp(209)             mongo::MongoMMF::~MongoMMF+0x40
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe                                                 mongo::MongoDataFile::~MongoDataFile+0x28
 m31000| Mon Oct 15 12:16:49 [conn1] mongod.exe                                                 mongo::MongoDataFile::`scalar deleting destructor'+0x2c
 

If you compare the file specifications in line 5 and 13 above, you can see the problem:

line  5 = /data/db/jstests_disk_repair/repairDir/backup_repairDatabase_0\jstests_disk_repair.ns
                                      |
line 13 = /data/db/jstests_disk_repair\repairDir/backup_repairDatabase_0\jstests_disk_repair.ns

At the "pipe" character (|), the directory separators are not the same.



 Comments   
Comment by auto [ 15/Oct/12 ]

Author:

{u'date': u'2012-10-15T11:21:48-07:00', u'name': u'Andy Schwerin', u'email': u'schwerin@10gen.com'}

Message: SERVER-7362 Store a canonical form of file path in pathToFile in mmap.cpp.

It is important to use a canonical, absolute form to avoid finding the wrong file
or no file when accessing the map from the MongoFileFinder, etc.
Branch: master
https://github.com/mongodb/mongo/commit/732f351f4699758ed30d0a2c7e74969b03004d1a

Generated at Thu Feb 08 03:14:19 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.