From 23962a2be97b144ec3e2f1071bc5c878d2277773 Mon Sep 17 00:00:00 2001 From: prabatuty Date: Wed, 7 Nov 2007 19:54:24 +0000 Subject: [PATCH] Procmgmt second patch: Test script is at threadtest1.c. The first thread which registers will open and attach the shared memory segment and rest all will just access the shared memory segment. The last thread in the process will detach the shared memory segment. --- csql.kdevelop.pcs | Bin 453868 -> 452810 bytes csql.kdevses | 24 +++---- include/Database.h | 4 +- include/Globals.h | 2 +- include/Process.h | 9 ++- src/server/Database.cxx | 10 +-- src/server/DatabaseManagerImpl.cxx | 104 +++++++++++++++++------------ src/server/Mutex.cxx | 1 + src/server/Process.cxx | 126 ++++++++++-------------------------- src/server/SessionImpl.cxx | 22 +++---- test/dbapi/Connection/threadtest1.c | 11 ++-- 11 files changed, 139 insertions(+), 174 deletions(-) diff --git a/csql.kdevelop.pcs b/csql.kdevelop.pcs index c9b5fc201480b24889a68c68e2d1e97859489f63..9722749bfb48be4adb073d2f1e7ebd07caeed3a1 100644 GIT binary patch delta 7324 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 delta 7364 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 j - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/include/Database.h b/include/Database.h index 17d73081..1bab46e0 100644 --- a/include/Database.h +++ b/include/Database.h @@ -86,8 +86,8 @@ class Database Chunk* getSystemDatabaseChunk(int id); Transaction* getSystemDatabaseTrans(int slot); - ProcInfo* getProcInfo(int pidSlot); - ThreadInfo* getThreadInfo(int pidSlot, int thrSlot); + ThreadInfo* getThreadInfo(int slot); + //ThreadInfo* getThreadInfo(int pidSlot, int thrSlot); bool isLastThread(); void createAllCatalogTables(); diff --git a/include/Globals.h b/include/Globals.h index 82c73953..f36f2996 100644 --- a/include/Globals.h +++ b/include/Globals.h @@ -17,6 +17,6 @@ #define GLOBAL_H #ifndef APP_PID #define APP_PID -pid_t appPid = 0; + #endif #endif diff --git a/include/Process.h b/include/Process.h index 6f4a61eb..f9d85415 100644 --- a/include/Process.h +++ b/include/Process.h @@ -18,6 +18,7 @@ #include #include +#include class ProcInfo { @@ -48,12 +49,14 @@ class ProcessManager { public: static int noThreads; + static Mutex mutex; static caddr_t sysAddr; static caddr_t usrAddr; Database *systemDatabase; - ProcInfo *procInfo; - ThreadInfo *thrInfo; - ProcessManager(Database *sysdb) { systemDatabase = sysdb; procInfo = NULL; thrInfo = NULL; } + //ProcInfo *procInfo; + //ThreadInfo *thrInfo; + ProcessManager(Database *sysdb) { systemDatabase = sysdb; //procInfo = NULL; thrInfo = NULL; + } DbRetVal registerThread(); DbRetVal deregisterThread(); }; diff --git a/src/server/Database.cxx b/src/server/Database.cxx index b11c1fda..6d015c02 100644 --- a/src/server/Database.cxx +++ b/src/server/Database.cxx @@ -21,7 +21,6 @@ #include #include #include -extern pid_t appPid; const char* Database::getName() { @@ -397,14 +396,15 @@ Transaction* Database::getSystemDatabaseTrans(int slot) } //used in case of system database -ProcInfo* Database::getProcInfo(int pidSlot) +ThreadInfo* Database::getThreadInfo(int slot) { size_t offset = os::alignLong(sizeof (DatabaseMetaData)); offset = offset + os::alignLong( MAX_CHUNKS * sizeof (Chunk)); offset = offset + os::alignLong( Conf::config.getMaxTrans() * sizeof(Transaction)); - offset = offset + pidSlot * sizeof (ProcInfo); - return (ProcInfo*)(((char*) metaData_) + offset); + offset = offset + slot * sizeof (ThreadInfo); + return (ThreadInfo*)(((char*) metaData_) + offset); } +/* //used in case of system database ThreadInfo* Database::getThreadInfo(int pidSlot, int thrSlot) { @@ -437,7 +437,7 @@ bool Database::isLastThread() if (regThr < 1) return true; return false; } - +*/ bool Database::isValidAddress(void* addr) { diff --git a/src/server/DatabaseManagerImpl.cxx b/src/server/DatabaseManagerImpl.cxx index 01a18be3..ef36cd92 100644 --- a/src/server/DatabaseManagerImpl.cxx +++ b/src/server/DatabaseManagerImpl.cxx @@ -136,9 +136,9 @@ DbRetVal DatabaseManagerImpl::createDatabase(const char *name, size_t size) { offset = offset + os::alignLong( MAX_CHUNKS * sizeof (Chunk)); offset = offset + os::alignLong( Conf::config.getMaxTrans() * sizeof(Transaction)); - offset = offset + os::alignLong( Conf::config.getMaxProcs() * sizeof(ProcInfo)); - offset = offset + os::alignLong( Conf::config.getMaxProcs() * - Conf::config.getMaxThreads() * sizeof(ThreadInfo)); + offset = offset + os::alignLong( Conf::config.getMaxProcs() * sizeof(ThreadInfo)); + //offset = offset + os::alignLong( Conf::config.getMaxProcs() * + // Conf::config.getMaxThreads() * sizeof(ThreadInfo)); } int multiple = os::floor(offset / PAGE_SIZE); char *curPage = (((char*)rtnAddr) + ((multiple + 1) * PAGE_SIZE)); @@ -212,49 +212,63 @@ DbRetVal DatabaseManagerImpl::openDatabase(const char *name) else attAddr = ProcessManager::usrAddr; - if (ProcessManager::noThreads == 0) - { - //system db should be opened before user database files - caddr_t rtnAddr = (caddr_t) NULL; + //system db should be opened before user database files + caddr_t rtnAddr = (caddr_t) NULL; + + shared_memory_id shm_id = 0; + shared_memory_key key = 0; - shared_memory_id shm_id = 0; - shared_memory_key key = 0; + if (0 == strcmp(name, SYSTEMDB)) + key = Conf::config.getSysDbKey(); + else + key = Conf::config.getUserDbKey(); + + int ret = ProcessManager::mutex.tryLock(); + //If you are not getting lock ret !=0, it means somebody else is there. + //he will close the database. + if (ret != 0) + { + printError(ErrSysInternal, "Another thread calling open:Wait and then Retry\n"); + return ErrSysInternal; + } + void *shm_ptr = NULL; + if (ProcessManager::noThreads == 0 ) { + shm_id = os::shm_open(key, size, 0666); + if (shm_id == -1 ) + { + printError(ErrOS, "Shared memory open failed"); + return ErrOS; + } + shm_ptr = os::shm_attach(shm_id, startaddr, SHM_RND); if (0 == strcmp(name, SYSTEMDB)) - key = Conf::config.getSysDbKey(); + ProcessManager::sysAddr = (char*) shm_ptr; else - key = Conf::config.getUserDbKey(); - shm_id = os::shm_open(key, size, 0666); - if (shm_id == -1 ) - { - printError(ErrOS, "Shared memory open failed"); - return ErrOS; - } + ProcessManager::usrAddr = (char*) shm_ptr; + } else { + if (0 == strcmp(name, SYSTEMDB)) + shm_ptr = ProcessManager::sysAddr; + else + shm_ptr = ProcessManager::usrAddr; + } + ProcessManager::mutex.releaseLock(); - void *shm_ptr = os::shm_attach(shm_id, startaddr, SHM_RND); - rtnAddr = (caddr_t) shm_ptr; + rtnAddr = (caddr_t) shm_ptr; - if (rtnAddr < 0 || shm_ptr == (char*)0xffffffff) - { - printError(ErrOS, "Shared memory attach returned -ve value %x %d", shm_ptr, errno); - return ErrOS; - } - else - { - db_ = new Database(); - db_->setMetaDataPtr((DatabaseMetaData*)rtnAddr); - if (0 == strcmp(name, SYSTEMDB)) - ProcessManager::sysAddr = rtnAddr; - else - ProcessManager::usrAddr = rtnAddr; - - printDebug(DM_Database, "Opening database: %s", name); - logFinest(logger, "Opened database %s" , name); - return OK; - } + if (rtnAddr < 0 || shm_ptr == (char*)0xffffffff) + { + printError(ErrOS, "Shared memory attach returned -ve value %x %d", shm_ptr, errno); + return ErrOS; + } + else + { + db_ = new Database(); + db_->setMetaDataPtr((DatabaseMetaData*)rtnAddr); + printDebug(DM_Database, "Opening database: %s", name); + logFinest(logger, "Opened database %s" , name); + return OK; } - db_ = new Database(); printDebug(DM_Database, "Opening database: %s", name); db_->setMetaDataPtr((DatabaseMetaData*)attAddr); @@ -264,18 +278,22 @@ DbRetVal DatabaseManagerImpl::openDatabase(const char *name) DbRetVal DatabaseManagerImpl::closeDatabase() { - printDebug(DM_Database, "Closing database: %s",(char*)db_->getName()); - logFinest(logger, "Closed database"); + if (NULL == db_) { printError(ErrAlready, "Database is already closed\n"); return ErrAlready; } + printDebug(DM_Database, "Closing database: %s",(char*)db_->getName()); //check if this is the last thread to be deregistered - //if (ProcessManager::noThreads == 1) - { + int ret = ProcessManager::mutex.getLock(); + //If you are not getting lock ret !=0, it means somebody else is there. + //he will close the database. + if (ret == 0 && ProcessManager::noThreads == 0) os::shm_detach((char*)db_->getMetaDataPtr()); - } + ProcessManager::mutex.releaseLock(); + logFinest(logger, "Closed database"); + delete db_; db_ = NULL; } diff --git a/src/server/Mutex.cxx b/src/server/Mutex.cxx index e8958dda..d52582d4 100644 --- a/src/server/Mutex.cxx +++ b/src/server/Mutex.cxx @@ -105,6 +105,7 @@ int Mutex::tryLock() struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 1; + //TODO::Mutex timeout should come from csql.conf while (tries < 5) { diff --git a/src/server/Process.cxx b/src/server/Process.cxx index 5d884a35..a19dd42c 100644 --- a/src/server/Process.cxx +++ b/src/server/Process.cxx @@ -19,17 +19,19 @@ #include #include #include +#include int ProcessManager::noThreads=0; +Mutex ProcessManager::mutex; caddr_t ProcessManager::sysAddr=0; caddr_t ProcessManager::usrAddr=0; //It does not check for re registering as well as deregistering unregistered threads. //as it is handled in the connection class open and close methods. DbRetVal ProcessManager::registerThread() { -#ifdef LINUX + mutex.getLock(); noThreads++; -#else + mutex.releaseLock(); DbRetVal rv = systemDatabase->getProcessTableMutex(); if (OK != rv) { @@ -37,128 +39,70 @@ DbRetVal ProcessManager::registerThread() return rv; } pid_t pid; - if (appPid == 0) - { - //first thread to register - pid = os::getpid(); - appPid = pid; - } else - { - pid = appPid; - } + pid = os::getpid(); pthread_t thrid = os::getthrid(); - ProcInfo* pInfo = systemDatabase->getProcInfo(0); + + + ThreadInfo* pInfo = systemDatabase->getThreadInfo(0); int i=0; - ProcInfo* freeSlot = NULL; + ThreadInfo* freeSlot = NULL; int freeSlotPos =0; bool freeSlotSelected = false; - for (; i < config.getMaxProcs(); i++) + for (; i < Conf::config.getMaxProcs(); i++) { - if (pInfo->pid_ == pid ) break; - if (!freeSlotSelected && 0 == pInfo->pid_) - { - freeSlot = pInfo; - freeSlotPos = i; - freeSlotSelected=true; - } + if (pInfo->pid_ == 0 ) break; pInfo++; } - if (i == config.getMaxProcs()) - { - //First thread to register. - ThreadInfo *tInfo =systemDatabase->getThreadInfo(freeSlotPos, 0); - tInfo->thrid_ = thrid; - tInfo->pid_ = pid; - freeSlot->pid_ = pid; - freeSlot->numThreads_ = 1; - } else + if ( i == Conf::config.getMaxProcs()) { - ThreadInfo *tInfo = systemDatabase->getThreadInfo(i, 0); - int j =0; - for (; j < config.getMaxThreads(); j++) - { - - if (0 == tInfo->thrid_) - { - tInfo->thrid_ = thrid; - tInfo->pid_ = pid; - break; - } - tInfo++; - } - if ( j == config.getMaxThreads()) - { - systemDatabase->releaseProcessTableMutex(); - printError(ErrNoResource, "No free thread slot. Limit reached"); - return ErrNoResource; - } - - pInfo->numThreads_++; + systemDatabase->releaseProcessTableMutex(); + printError(ErrNoResource, "No free thread slot. Limit reached"); + return ErrNoResource; } + //printf("Process slot used %d %x\n", i, pInfo); + //TODO::make the above debug message + //TODO:print it to the trace file + + pInfo->pid_ = pid; + pInfo->thrid_ = thrid; systemDatabase->releaseProcessTableMutex(); -#endif return OK; } DbRetVal ProcessManager::deregisterThread() { -#ifdef LINUX - noThreads--; -#else + mutex.getLock(); + noThreads++; + mutex.releaseLock(); DbRetVal rv = systemDatabase->getProcessTableMutex(); if (OK != rv) { printError(rv,"Unable to get process table mutex"); return rv; } - if (appPid == 0) - { - systemDatabase->releaseProcessTableMutex(); - printError(ErrSysInternal, "Process not registered\n"); - return ErrSysInternal; - } - pid_t pid = appPid; + pid_t pid = os::getpid(); pthread_t thrid = os::getthrid(); - ProcInfo* pInfo = systemDatabase->getProcInfo(0); + ThreadInfo* pInfo = systemDatabase->getThreadInfo(0); int i=0; - for (; i < config.getMaxProcs(); i++) + for (; i < Conf::config.getMaxProcs(); i++) { - if (pInfo->pid_ == pid ) break; + if (pInfo->pid_ == pid && pInfo->thrid_ == thrid) break; pInfo++; } - if (i == config.getMaxProcs()) + if (i == Conf::config.getMaxProcs()) { systemDatabase->releaseProcessTableMutex(); printError(ErrSysFatal, "Degistering process %d is not registered with csql", pid); return ErrNoResource; } - ThreadInfo *tInfo = systemDatabase->getThreadInfo(i, 0); - - i=0; - for (; i < config.getMaxThreads(); i++) - { - if (thrid == tInfo->thrid_) - { - tInfo->thrid_ = 0; - tInfo->pid_ = 0; - tInfo->want_ = NULL; - tInfo->has_ = NULL; - break; - } - tInfo++; - } - if ( i == config.getMaxThreads()) - { - systemDatabase->releaseProcessTableMutex(); - printError(ErrSysFatal, "Degistering Pid %d Thread %d is not registered with csql", pid, thrid); - return ErrNoResource; - } - pInfo->numThreads_--; - - if (0 == pInfo->numThreads_) pInfo->pid_ = 0; + pInfo->thrid_ = 0; + pInfo->pid_ = 0; + pInfo->want_ = NULL; + pInfo->has_ = NULL; + //TODO::check if wants_ is empty, if not report error + //TODO::check if has_ is empty.If not report that and release all the mutexes in has_ systemDatabase->releaseProcessTableMutex(); -#endif return OK; } diff --git a/src/server/SessionImpl.cxx b/src/server/SessionImpl.cxx index eada85b8..4718cdcc 100644 --- a/src/server/SessionImpl.cxx +++ b/src/server/SessionImpl.cxx @@ -23,6 +23,7 @@ #include #include #include +#include //Before calling this method, application is required to call readConfigValues DbRetVal SessionImpl::initSystemDatabase() @@ -51,10 +52,6 @@ DbRetVal SessionImpl::initSystemDatabase() dbMgr = new DatabaseManagerImpl(); - //TODO:Size of system database 100 MB ->config parameter - - //TODO:No of chunks of system database->config parameter - //This limits the total number of catalog tables system shall support. rv = dbMgr->createDatabase(SYSTEMDB, Conf::config.getMaxSysDbSize()); if (OK != rv) return rv; dbMgr->setSysDb(dbMgr->db()); @@ -119,6 +116,7 @@ DbRetVal SessionImpl::open(const char *username, const char *password) printError(ErrSysFatal, "Configuration file read failed\n"); return ErrSysFatal; } + if ( NULL == dbMgr) { dbMgr = new DatabaseManagerImpl(); @@ -130,7 +128,6 @@ DbRetVal SessionImpl::open(const char *username, const char *password) return rv; } - rv = dbMgr->sysDb()->getDatabaseMutex(); if (OK != rv) { @@ -145,7 +142,6 @@ DbRetVal SessionImpl::open(const char *username, const char *password) dbMgr->sysDb()->releaseDatabaseMutex(); if (!isAuthenticated) { - dbMgr->deregisterThread(); dbMgr->closeSystemDatabase(); delete dbMgr; dbMgr = NULL; @@ -155,8 +151,10 @@ DbRetVal SessionImpl::open(const char *username, const char *password) dbMgr->createTransactionManager(); dbMgr->createLockManager(); - rv = dbMgr->openDatabase("praba"); - if (OK != rv) return rv; + rv = dbMgr->openDatabase("praba"); + if (OK != rv) { + return rv; + } rv = dbMgr->registerThread(); if (OK != rv) @@ -172,12 +170,12 @@ DbRetVal SessionImpl::close() DbRetVal rv = OK; if (dbMgr) { + rv = dbMgr->deregisterThread(); + if (rv != OK) { return ErrBadCall; } rv = dbMgr->closeDatabase(); - if (rv != OK) return ErrBadCall; + if (rv != OK) { return ErrBadCall; } rv = dbMgr->closeSystemDatabase(); - if (rv != OK) return ErrBadCall; - rv = dbMgr->deregisterThread(); - if (rv != OK) return ErrBadCall; + if (rv != OK) { return ErrBadCall; } delete dbMgr; dbMgr = NULL; } diff --git a/test/dbapi/Connection/threadtest1.c b/test/dbapi/Connection/threadtest1.c index bd65dc41..e75a00ee 100644 --- a/test/dbapi/Connection/threadtest1.c +++ b/test/dbapi/Connection/threadtest1.c @@ -9,7 +9,7 @@ int main (int argc, char **argv) { Connection conn; DbRetVal rv = conn.open("praba","manager"); - printf ("Main open Returned %d\n", rv); + if (rv != 0) return 1; pthread_t thread1, thread2; char *message1 = "Thread 1"; char *message2 = "Thread 2"; @@ -23,7 +23,7 @@ int main (int argc, char **argv) pthread_join(thread1, (void **)&status); pthread_join(thread2, (void **)&status); rv = conn.close(); - printf ("Main Returned %d\n", rv); + if (rv != 0) return 1; exit (0); } @@ -33,10 +33,10 @@ void* print_message_function(void *ptr) if (flag == 0) {flag =1; sleep(2); } Connection conn; DbRetVal rv=conn.open("praba","manager"); - printf("Thread Return value of open %d %d\n", rv, getpid()); if(rv!=OK) { - return NULL; + printf("Thread Return value of open %d %d\n", rv, getpid()); + return NULL; } DatabaseManager *dbMgr = conn.getDatabaseManager(); if (dbMgr == NULL) { printf("Auth failed\n"); return NULL;} @@ -50,5 +50,6 @@ void* print_message_function(void *ptr) printf("Table created\n"); rv = conn.close(); - printf("Thread Return value of close %d %d\n", rv, getpid()); + if (rv != OK) { printf("Thread Return value of close %d %d\n", rv, getpid()); } + return NULL; } -- 2.11.4.GIT