List:Commits« Previous MessageNext Message »
From:Olav Sandstaa Date:August 19 2008 9:49am
Subject:Re: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843
View as plain text  
Hi Vlad,

The patch looks good and I have verified that it fixes the problem I had 
when running the mysql-test Falcon suite on Solaris.
Thanks for fixing this.

OK to push.

..olav


Vladislav Vaintroub wrote:
> #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();
>
>
>   

Thread
bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Vladislav Vaintroub18 Aug
  • Re: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Lars-Erik Bjørk19 Aug
  • Re: bzr commit into mysql-6.0-falcon branch (vvaintroub:2788) Bug#38843Olav Sandstaa19 Aug