From 88ca3be9544f6061e1bdab0cc38f300b19e90919 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Mon, 26 Oct 2009 14:47:06 +0000 Subject: [PATCH] flush cache statements during create index and drop table/index --- include/DatabaseManager.h | 1 + include/DatabaseManagerImpl.h | 1 + include/SqlConnection.h | 6 ++++++ include/os.h | 1 + src/sql/DdlStatement.cxx | 3 +++ src/sql/SqlStatement.cxx | 30 ++++++++++++++++++++++-------- src/storage/DatabaseManagerImpl.cxx | 9 +++++++++ src/tools/cachetable.cxx | 2 +- src/tools/catalog.cxx | 1 + src/tools/csqldump.cxx | 2 ++ 10 files changed, 47 insertions(+), 9 deletions(-) diff --git a/include/DatabaseManager.h b/include/DatabaseManager.h index 81e4c336..29191877 100644 --- a/include/DatabaseManager.h +++ b/include/DatabaseManager.h @@ -79,6 +79,7 @@ class DatabaseManager virtual DbRetVal recover()=0; virtual DbRetVal createForeignKey(char *fkName,ForeignKeyInfo *info)=0; virtual DbRetVal dropForeignKey(void *ctpr,bool trylock)=0; + virtual void sendSignal(int sig)=0; virtual ~DatabaseManager(){ } }; diff --git a/include/DatabaseManagerImpl.h b/include/DatabaseManagerImpl.h index fe077de3..2af8138f 100644 --- a/include/DatabaseManagerImpl.h +++ b/include/DatabaseManagerImpl.h @@ -116,6 +116,7 @@ class DatabaseManagerImpl : public DatabaseManager DbRetVal createForeignKey(char *kfName,ForeignKeyInfo *info); DbRetVal dropForeignKey(void *ctptr,bool trylock); List getAllTableNames(int *rv=NULL); + void sendSignal(int signal); DbRetVal registerThread(); DbRetVal deregisterThread(); diff --git a/include/SqlConnection.h b/include/SqlConnection.h index 40045311..5e11189a 100644 --- a/include/SqlConnection.h +++ b/include/SqlConnection.h @@ -37,6 +37,9 @@ class SqlConnection : public AbsSqlConnection Connection conn; bool isConnOpen; public: + static List connList; + static bool isInit; + void initialize(); List cachedStmts; SqlConnection(){ innerConn = NULL; isConnOpen = false; } ~SqlConnection(); @@ -49,6 +52,8 @@ class SqlConnection : public AbsSqlConnection DbRetVal connect (char *user, char * pass) { DbRetVal ret = conn.open(user, pass); if (ret == OK) isConnOpen = true; + if (!isInit) initialize(); + connList.append(this); return ret; } @@ -58,6 +63,7 @@ class SqlConnection : public AbsSqlConnection DbRetVal disconnect () { DbRetVal ret = conn.close(); if (ret == OK) isConnOpen = false; + connList.remove(this); return ret; } diff --git a/include/os.h b/include/os.h index 80c14631..5187644c 100644 --- a/include/os.h +++ b/include/os.h @@ -113,6 +113,7 @@ enum MapMode #define MAX_FILE_PATH_LEN 1024 #define CHUNK_NAME_LEN 64 #define LOG_ROLLOVER_SIZE 20*1024*1024 +#define SIGCSQL1 SIGUSR1 #define BIT(x) (1 << (x)) #define SETBITS(x,y) ((x) |= (y)) diff --git a/src/sql/DdlStatement.cxx b/src/sql/DdlStatement.cxx index ba890762..718669c3 100644 --- a/src/sql/DdlStatement.cxx +++ b/src/sql/DdlStatement.cxx @@ -261,6 +261,7 @@ DbRetVal CreateIdxStatement::execute(int &rowsAffected) rv = dbMgr->createIndex(parsedData->getIndexName(), idxInfo); delete idxInfo; } + if (rv == OK) dbMgr->sendSignal(SIGCSQL1); return rv; } @@ -324,6 +325,7 @@ DbRetVal DropTblStatement::execute(int &rowsAffected) } #endif rv = dbMgr->dropTable(parsedData->getTableName()); + if (rv == OK) dbMgr->sendSignal(SIGCSQL1); return rv; } @@ -331,6 +333,7 @@ DbRetVal DropIdxStatement::execute(int &rowsAffected) { DbRetVal rv = OK; rv = dbMgr->dropIndex(parsedData->getIndexName()); + if (rv == OK) dbMgr->sendSignal(SIGCSQL1); return rv; } diff --git a/src/sql/SqlStatement.cxx b/src/sql/SqlStatement.cxx index 737e57f8..34f566d2 100644 --- a/src/sql/SqlStatement.cxx +++ b/src/sql/SqlStatement.cxx @@ -24,6 +24,9 @@ char *lexInput; extern ParsedData *parsedData; +bool SqlConnection::isInit = false; +List SqlConnection::connList; + int yyparse (); @@ -113,7 +116,6 @@ DbRetVal SqlStatement::prepare(char *stmtstr) { free(); parsedData = NULL; - //yyrestart(yyin); sysdb->releasePrepareStmtMutex(); return ErrSyntaxError; } @@ -139,30 +141,26 @@ DbRetVal SqlStatement::prepare(char *stmtstr) { free(); parsedData = NULL; - //yyrestart(yyin); sysdb->releasePrepareStmtMutex(); return rv; } - parsedData = NULL; - //yyrestart(yyin); - sysdb->releasePrepareStmtMutex(); isPrepd = true; if (Conf::config.getStmtCacheSize()) { if (stmt->noOfParamFields() > 0) { isCachedStmt = true; sqlCon->addToCache(this, stmtstr); - return OK; } - if (Conf::config.useCacheNoParam()) + else if (Conf::config.useCacheNoParam()) { if (parsedData->getCacheWorthy()) { isCachedStmt = true; sqlCon->addToCache(this, stmtstr); - return OK; } } } + parsedData = NULL; + sysdb->releasePrepareStmtMutex(); return OK; } @@ -684,4 +682,20 @@ SqlConnection::~SqlConnection() flushCacheStmt(); if (isConnOpen) disconnect(); } +static void sigUsr1Handler(int sig) +{ + ListIterator iter= SqlConnection::connList.getIterator(); + SqlConnection *conn = NULL; + while (iter.hasElement()) + { + conn = (SqlConnection*) iter.nextElement(); + conn->flushCacheStmt(); + } + return; +} +void SqlConnection::initialize() +{ + os::signal(SIGCSQL1, sigUsr1Handler); + isInit = true; +} diff --git a/src/storage/DatabaseManagerImpl.cxx b/src/storage/DatabaseManagerImpl.cxx index b20eb51c..d0051f51 100644 --- a/src/storage/DatabaseManagerImpl.cxx +++ b/src/storage/DatabaseManagerImpl.cxx @@ -1766,4 +1766,13 @@ DbRetVal DatabaseManagerImpl::recover() rv = sysDb()->recoverSystemDB(); return rv; } +void DatabaseManagerImpl::sendSignal(int signal) +{ + ThreadInfo* pInfo = sysDb()->getThreadInfo(0); + for (int i=0; i < Conf::config.getMaxProcs(); i++) + { + if (pInfo->pid_ !=0) os::kill(pInfo->pid_, signal); + pInfo++; + } +} diff --git a/src/tools/cachetable.cxx b/src/tools/cachetable.cxx index 56b38af0..1267a001 100644 --- a/src/tools/cachetable.cxx +++ b/src/tools/cachetable.cxx @@ -53,7 +53,7 @@ int main(int argc, char **argv) Connection conn; rv = conn.open(I_USER, I_PASS); if (rv != OK) return 1; - + os::signal(SIGCSQL1, SIG_IGN); if (!Conf::config.useCache()) { printf("CACHE_TABLE is set to FALSE in csql.conf file.\n"); diff --git a/src/tools/catalog.cxx b/src/tools/catalog.cxx index ce5c32f1..2019b6a8 100644 --- a/src/tools/catalog.cxx +++ b/src/tools/catalog.cxx @@ -83,6 +83,7 @@ int main(int argc, char **argv) Connection conn; DbRetVal rv = conn.open(username, password); if (rv != OK) return 1; + os::signal(SIGCSQL1, SIG_IGN); DatabaseManagerImpl *dbMgr = (DatabaseManagerImpl*) conn.getDatabaseManager(); if (dbMgr == NULL) { printf("Auth failed\n"); return 2;} List tableList = dbMgr->getAllTableNames(); diff --git a/src/tools/csqldump.cxx b/src/tools/csqldump.cxx index adab2142..7be46810 100644 --- a/src/tools/csqldump.cxx +++ b/src/tools/csqldump.cxx @@ -105,6 +105,7 @@ int main(int argc, char **argv) delete stmt; return 1; } + os::signal(SIGCSQL1, SIG_IGN); DatabaseManagerImpl *dbMgr = (DatabaseManagerImpl*) conn.getDatabaseManager(); if (dbMgr == NULL) { printf("Unable to retrive db manager\n"); @@ -232,6 +233,7 @@ int main(int argc, char **argv) delete stmt; return 1; } + os::signal(SIGCSQL1, SIG_IGN); DatabaseManagerImpl *dbMgr = (DatabaseManagerImpl*) conn.getDatabaseManager(); if (dbMgr == NULL) { printf("Auth failed\n"); return 2;} Table *table = dbMgr->openTable(tblName); -- 2.11.4.GIT