From: Date: August 18 2008 10:17pm Subject: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843 List-Archive: http://lists.mysql.com/commits/51893 X-Bug: 38843 Message-Id: <200808182017.m7IKHhTP018069@mail.mysql.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///C:/bzr/mysql-6.0-falcon-team/ 2788 Vladislav Vaintroub 2008-08-18 Bug#38843 Falcon does not start if datadir is located on home directory on Solaris Problem Falcon tries to create all directories recursively before creating a file While trying to create a directory structure, IO::createPath runs onto Solaris bug. mkdir returns ENOSYS instead of EEXIST on an existing path, if if it happens to be NFS automounted root dir. Fix: 1) IO::createPath - Workaround the bug by handling ENOSYS like EEXIST. We do not expect any other OS to return ENOSYS(not supported) for mkdir(). 2) As Falcon can always rely on datadir to exist, enclose all current occurences of IO::createPath() into #ifndef FALCONDB. It is possibly needed for Netfrastructure, so the change is safe. modified: storage/falcon/BackLog.cpp storage/falcon/IO.cpp storage/falcon/RepositoryVolume.cpp storage/falcon/StorageDatabase.cpp storage/falcon/TableSpace.cpp per-file messages: storage/falcon/BackLog.cpp Falcon should not create any directoies storage/falcon/IO.cpp Workaround a Solaris bug : ENOSYS is not what we think is of it. In case of mkdir() ENOSYS means "EEXIST on automounted NFS root directory". storage/falcon/RepositoryVolume.cpp Falcon should not create any directories storage/falcon/StorageDatabase.cpp Falcon should not create any directories storage/falcon/TableSpace.cpp Falcon should not create any directories. === modified file 'storage/falcon/BackLog.cpp' --- a/storage/falcon/BackLog.cpp 2008-07-17 13:52:17 +0000 +++ b/storage/falcon/BackLog.cpp 2008-08-18 20:17:15 +0000 @@ -37,7 +37,9 @@ BackLog::BackLog(Database *db, const cha { database = db; dbb = new Dbb(database->dbb, 0); +#ifndef FALCONDB dbb->createPath(fileName); +#endif dbb->create(fileName, dbb->pageSize, 0, HdrTableSpace, 0, NULL); dbb->noLog = true; dbb->tableSpaceId = -1; === modified file 'storage/falcon/IO.cpp' --- a/storage/falcon/IO.cpp 2008-08-14 16:34:43 +0000 +++ b/storage/falcon/IO.cpp 2008-08-18 20:17:15 +0000 @@ -411,13 +411,17 @@ void IO::declareFatalError() fatalError = true; } + +#ifndef ENOSYS +#define ENOSYS EEXIST +#endif + +// Make sure parent directories for file exist void IO::createPath(const char *fileName) { - // First, better make sure directories exists JString fname = getPath(fileName); char directory [256], *q = directory; - for (const char *p = fname.getString(); *p;) { char c = *p++; @@ -427,9 +431,14 @@ void IO::createPath(const char *fileName *q = 0; if (q > directory && q [-1] != ':') - if (MKDIR (directory) && errno != EEXIST) + { + if (MKDIR (directory) && errno != EEXIST && errno != ENOSYS) + // ENOSYS is a Solaris speficic workaround, mkdir returns it + // on existing automounted NFS directories, instead + // of EEXIST. throw SQLError (IO_ERROR, "can't create directory \"%s\"\n", directory); + } } *q++ = c; } === modified file 'storage/falcon/RepositoryVolume.cpp' --- a/storage/falcon/RepositoryVolume.cpp 2008-07-24 08:45:03 +0000 +++ b/storage/falcon/RepositoryVolume.cpp 2008-08-18 20:17:15 +0000 @@ -232,7 +232,9 @@ void RepositoryVolume::makeWritable() void RepositoryVolume::create() { +#ifndef FALCONDB IO::createPath (fileName); +#endif dbb->create(fileName, dbb->pageSize, 0, HdrRepositoryFile, 0, NULL); Sync syncDDL(&database->syncSysDDL, "RepositoryVolume::create"); Transaction *transaction = database->getSystemTransaction(); === modified file 'storage/falcon/StorageDatabase.cpp' --- a/storage/falcon/StorageDatabase.cpp 2008-08-18 05:45:29 +0000 +++ b/storage/falcon/StorageDatabase.cpp 2008-08-18 20:17:15 +0000 @@ -156,7 +156,9 @@ Connection* StorageDatabase::createDatab try { masterConnection = getConnection(); +#ifndef FALCONDB IO::createPath(filename); +#endif masterConnection->createDatabase(name, filename, ACCOUNT, PASSWORD, threads); Statement *statement = masterConnection->createStatement(); === modified file 'storage/falcon/TableSpace.cpp' --- a/storage/falcon/TableSpace.cpp 2008-07-17 13:52:17 +0000 +++ b/storage/falcon/TableSpace.cpp 2008-08-18 20:17:15 +0000 @@ -123,7 +123,9 @@ void TableSpace::open() void TableSpace::create() { +#ifndef FALCONDB dbb->createPath(filename); +#endif dbb->create(filename, dbb->pageSize, 0, HdrTableSpace, 0, NULL); active = true; dbb->flush();