Below is the list of changes that have just been committed into a local
6.0 repository of vvaintroub. When vvaintroub does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2008-02-24 16:48:01+01:00, vvaintroub@wva. +2 -0
Bug#34085 - create table on falcon hangs if it cannot allocate pagecache
In this case, pagecache size was too big, initialization failed and user
was confronted with incomprehensible error message from CREATE TABLE.
Solution : now Falcon will be initialized at database startup. Plugin
will not be loaded on failed allocation and this will make configuration
issues more obvious to DBA.
storage/falcon/StorageHandler.cpp@stripped, 2008-02-24 16:47:58+01:00, vvaintroub@wva. +16
-23
(re)throw exceptions in storageHandler::initialize() - they
will be caught later in falcon_init()
storage/falcon/ha_falcon.cpp@stripped, 2008-02-24 16:47:59+01:00, vvaintroub@wva. +29 -15
Initialize falcon at database startup. Return error to plugin API
if initialization fails.
diff -Nrup a/storage/falcon/StorageHandler.cpp b/storage/falcon/StorageHandler.cpp
--- a/storage/falcon/StorageHandler.cpp 2008-01-31 20:25:44 +01:00
+++ b/storage/falcon/StorageHandler.cpp 2008-02-24 16:47:58 +01:00
@@ -921,31 +921,24 @@ void StorageHandler::initialize(void)
// lead to "recreate" and data loss.
int err = e.getSqlcode();
if(err == OUT_OF_MEMORY_ERROR || err == FILE_ACCESS_ERROR)
- return;
- try
- {
- defaultDatabase->createDatabase();
- IO::deleteFile(FALCON_USER);
- IO::deleteFile(FALCON_TEMPORARY);
- dictionaryConnection = defaultDatabase->getOpenConnection();
- Statement *statement = dictionaryConnection->createStatement();
+ throw;
+ defaultDatabase->createDatabase();
+ IO::deleteFile(FALCON_USER);
+ IO::deleteFile(FALCON_TEMPORARY);
+ dictionaryConnection = defaultDatabase->getOpenConnection();
+ Statement *statement = dictionaryConnection->createStatement();
- JString createTableSpace;
- createTableSpace.Format(
- "create tablespace " DEFAULT_TABLESPACE " filename '" FALCON_USER "' allocation "
I64FORMAT,
- falcon_initial_allocation);
- statement->executeUpdate(createTableSpace);
+ JString createTableSpace;
+ createTableSpace.Format(
+ "create tablespace " DEFAULT_TABLESPACE " filename '" FALCON_USER "' allocation "
I64FORMAT,
+ falcon_initial_allocation);
+ statement->executeUpdate(createTableSpace);
- for (const char **ddl = falconSchema; *ddl; ++ddl)
- statement->executeUpdate(*ddl);
-
- statement->close();
- dictionaryConnection->commit();
- }
- catch(...)
- {
- return;
- }
+ for (const char **ddl = falconSchema; *ddl; ++ddl)
+ statement->executeUpdate(*ddl);
+
+ statement->close();
+ dictionaryConnection->commit();
}
}
diff -Nrup a/storage/falcon/ha_falcon.cpp b/storage/falcon/ha_falcon.cpp
--- a/storage/falcon/ha_falcon.cpp 2008-02-06 18:38:23 +01:00
+++ b/storage/falcon/ha_falcon.cpp 2008-02-24 16:47:59 +01:00
@@ -148,6 +148,7 @@ int StorageInterface::falcon_init(void *
{
DBUG_ENTER("falcon_init");
falcon_hton = (handlerton *)p;
+ my_bool error = false;
if (!storageHandler)
storageHandler = getFalconStorageHandler(sizeof(THR_LOCK));
@@ -203,11 +204,30 @@ int StorageInterface::falcon_init(void *
if (falcon_debug_server)
storageHandler->startNfsServer();
- //TimeTest timeTest;
- //timeTest.testScaled(16, 2, 100000);
+ try
+ {
+ storageHandler->initialize();
+ }
+ catch(SQLException &e)
+ {
+ sql_print_error("Falcon : exception '%s'during initialization",
+ e.getText());
+ error = true;
+ }
+ catch(...)
+ {
+ sql_print_error(" Falcon : general exception in initialization");
+ error = true;
+ }
- //pluginHandler = new NfsPluginHandler;
+ if (error)
+ {
+ // Cleanup after error
+ delete storageHandler;
+ storageHandler = 0;
+ DBUG_RETURN(1);
+ }
DBUG_RETURN(0);
}
@@ -225,7 +245,7 @@ int falcon_strnxfrm (void *cs,
{
CHARSET_INFO *charset = (CHARSET_INFO*) cs;
- return charset->coll->strnxfrm(charset, (uchar *) dst, dstlen, nweights,
+ return (int)charset->coll->strnxfrm(charset, (uchar *) dst, dstlen, nweights,
(uchar *) src, srclen, 0);
}
@@ -3080,25 +3100,19 @@ void StorageInterface::updateConsistentR
void StorageInterface::updateRecordMemoryMax(MYSQL_THD thd, struct st_mysql_sys_var*
variable, void* var_ptr, void* save)
{
falcon_record_memory_max = *(ulonglong*) save;
-
- if (storageHandler)
- storageHandler->setRecordMemoryMax(falcon_record_memory_max);
+ storageHandler->setRecordMemoryMax(falcon_record_memory_max);
}
void StorageInterface::updateRecordScavengeThreshold(MYSQL_THD thd, struct
st_mysql_sys_var* variable, void* var_ptr, void* save)
{
- falcon_record_scavenge_threshold = *(int*) save;
-
- if (storageHandler)
- storageHandler->setRecordScavengeThreshold(falcon_record_scavenge_threshold);
+ falcon_record_scavenge_threshold = *(uint*) save;
+ storageHandler->setRecordScavengeThreshold(falcon_record_scavenge_threshold);
}
void StorageInterface::updateRecordScavengeFloor(MYSQL_THD thd, struct st_mysql_sys_var*
variable, void* var_ptr, void* save)
{
- falcon_record_scavenge_floor = *(int*) save;
-
- if (storageHandler)
- storageHandler->setRecordScavengeFloor(falcon_record_scavenge_floor);
+ falcon_record_scavenge_floor = *(uint*) save;
+ storageHandler->setRecordScavengeFloor(falcon_record_scavenge_floor);
}