From: <asf...@us...> - 2010-06-05 02:41:21
|
Revision: 51209 http://firebird.svn.sourceforge.net/firebird/?rev=51209&view=rev Author: asfernandes Date: 2010-06-05 02:41:14 +0000 (Sat, 05 Jun 2010) Log Message: ----------- Port CVS changes (includes CORE-2993, CORE-3010, CORE-3011, CORE-3015, CORE-3016, CORE-3017 and CORE-3021) Modified Paths: -------------- firebird/branches/B2_5_Release/builds/install/arch-specific/linux/misc/firebird.init.d.gentoo.in firebird/branches/B2_5_Release/doc/WhatsNew firebird/branches/B2_5_Release/src/common/classes/alloc.cpp firebird/branches/B2_5_Release/src/jrd/Database.h firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp firebird/branches/B2_5_Release/src/jrd/build_no.h firebird/branches/B2_5_Release/src/jrd/cch.cpp firebird/branches/B2_5_Release/src/jrd/isc.h firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp firebird/branches/B2_5_Release/src/jrd/isc_version.h firebird/branches/B2_5_Release/src/jrd/jrd.cpp firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp firebird/branches/B2_5_Release/src/misc/writeBuildNum.sh Modified: firebird/branches/B2_5_Release/builds/install/arch-specific/linux/misc/firebird.init.d.gentoo.in =================================================================== --- firebird/branches/B2_5_Release/builds/install/arch-specific/linux/misc/firebird.init.d.gentoo.in 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/builds/install/arch-specific/linux/misc/firebird.init.d.gentoo.in 2010-06-05 02:41:14 UTC (rev 51209) @@ -6,9 +6,6 @@ # on system startup and shutdown to start the background # Firebird database server daemon -# Source function library. -. /etc/init.d/functions.sh - # To run more instances of firebird: # Copy @prefix@ somewhere # Copy this script under a new name @@ -49,19 +46,19 @@ GUARDIAN=@FB_SBINDIR@/fbguard fi -start(){ +start() { ebegin "Starting $FULLNAME" start-stop-daemon --oknodo --start --pidfile $pidfile --chuid $FBRunUser --startas $GUARDIAN -- $FB_OPTS eend $? } -stop(){ +stop() { ebegin "Stopping $FULLNAME" start-stop-daemon --stop --pidfile $pidfile --oknodo eend $? } -restart(){ +restart() { svc_stop sleep 1 svc_start Modified: firebird/branches/B2_5_Release/doc/WhatsNew =================================================================== --- firebird/branches/B2_5_Release/doc/WhatsNew 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/doc/WhatsNew 2010-06-05 02:41:14 UTC (rev 51209) @@ -2,6 +2,39 @@ * v2.5 Release Candidate 3 ************************** + * Bugfix CORE-3021 + Segfault in DEV_BUILD + Contributor(s): + Alex Peshkov <peshkoff at mail.ru> + + * Bugfix CORE-3017 + Files left at Firebird's lock directory + Contributor(s): + Vlad Khorsun <hvlad at users.sourceforge.net> + Alex Peshkov <peshkoff at mail.ru> + + * Bugfix CORE-3016 + On disconnect it is possible to see "Fatal lock manager error: invalid lock id (0), errno: 0" + in firebird.log + Contributor(s): + Vlad Khorsun <hvlad at users.sourceforge.net> + + * Bugfix CORE-3015 + Various "Cannot initialize the shared memory region" errors + Contributor(s): + Vlad Khorsun <hvlad at users.sourceforge.net> + + * Bugfix CORE-3011 + Server hangs or crashes while monitoring connections repeatedly attaching and detaching + Contributor(s): + Dmitry Yemanov <dimitr at firebirdsql.org> + + * Bugfix CORE-3010 + First connect to any database shows MON$MEMORY_USED = 4Gb + Contributor(s): + Dmitry Yemanov <dimitr at firebirdsql.org> + Vlad Khorsun <hvlad at users.sourceforge.net> + * Bugfix CORE-3006 /tmp/firebird and files in it may get 'root' (i.e. GID == 0) group Contributor(s): Modified: firebird/branches/B2_5_Release/src/common/classes/alloc.cpp =================================================================== --- firebird/branches/B2_5_Release/src/common/classes/alloc.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/common/classes/alloc.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -1371,6 +1371,9 @@ MemoryExtent* extent = pool->extents_parent; while (extent) { MemoryExtent* next = extent->mxt_next; + + MemoryBlock* blk = ptrToBlock(extent); + parent->increment_usage(blk->mbk_small.mbk_length); parent->deallocate(extent); extent = next; } @@ -1731,6 +1734,7 @@ } else { + parent->increment_usage(ext_size); parent->deallocate(extent); } } Modified: firebird/branches/B2_5_Release/src/jrd/Database.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/Database.h 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/Database.h 2010-06-05 02:41:14 UTC (rev 51209) @@ -107,6 +107,7 @@ const ULONG DBB_gc_background = 0x40000L; // background garbage collection by gc_thread const ULONG DBB_no_fs_cache = 0x80000L; // Not using file system cache const ULONG DBB_destroying = 0x100000L; // database destructor is called +const ULONG DBB_monitor_locking = 0x200000L; // monitoring lock is being acquired // // dbb_ast_flags Modified: firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/DatabaseSnapshot.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -101,6 +101,9 @@ { // scope DumpGuard guard(this); cleanup(); + + if (base->used == sizeof(Header)) + ISC_remove_map_file(&handle); } #ifdef WIN_NT @@ -387,8 +390,13 @@ } } - // Release the lock and mark dbb as requesting a new one - LCK_release(tdbb, lock); + // Release the lock, if feasible + if (!(dbb->dbb_flags & DBB_monitor_locking)) + { + LCK_release(tdbb, lock); + } + + // Mark dbb as requesting a new lock dbb->dbb_ast_flags |= DBB_monitor_off; } } Modified: firebird/branches/B2_5_Release/src/jrd/build_no.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/build_no.h 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/build_no.h 2010-06-05 02:41:14 UTC (rev 51209) @@ -3,16 +3,16 @@ *** DO NOT EDIT *** TO CHANGE ANY INFORMATION IN HERE PLEASE EDIT src/misc/writeBuildNum.sh - FORMAL BUILD NUMBER:26024 + FORMAL BUILD NUMBER:26038 */ -#define PRODUCT_VER_STRING "2.5.0.26024" -#define FILE_VER_STRING "WI-V2.5.0.26024" -#define LICENSE_VER_STRING "WI-V2.5.0.26024" -#define FILE_VER_NUMBER 2, 5, 0, 26024 +#define PRODUCT_VER_STRING "2.5.0.26038" +#define FILE_VER_STRING "WI-V2.5.0.26038" +#define LICENSE_VER_STRING "WI-V2.5.0.26038" +#define FILE_VER_NUMBER 2, 5, 0, 26038 #define FB_MAJOR_VER "2" #define FB_MINOR_VER "5" #define FB_REV_NO "0" -#define FB_BUILD_NO "26024" +#define FB_BUILD_NO "26038" #define FB_BUILD_TYPE "V" #define FB_BUILD_SUFFIX "Firebird 2.5 Release Candidate 3" Modified: firebird/branches/B2_5_Release/src/jrd/cch.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/cch.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/cch.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -374,6 +374,9 @@ { Database::SyncGuard dsGuard(dbb, true); + if (dbb->dbb_flags & DBB_not_in_use) + return 0; + Lock* const lock = dbb->dbb_lock; // Since this routine will be called asynchronously, Modified: firebird/branches/B2_5_Release/src/jrd/isc.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc.h 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/isc.h 2010-06-05 02:41:14 UTC (rev 51209) @@ -38,11 +38,19 @@ #endif #ifdef LINUX + // This hack fixes CORE-2896 - embedded connections fail on linux. // Looks like a lot of linux kernels are buggy when working with PRIO_INHERIT mutexes. #undef HAVE_PTHREAD_MUTEXATTR_SETPROTOCOL + +#if (SIZEOF_VOID_P < 8) && defined(DEV_BUILD) +// This hack fixes CORE-3021 - segfault in DEV_BUILD. +// Release build does not cause visible problems. +#undef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP #endif +#endif //LINUX + #ifdef UNIX #if defined(USE_POSIX_THREADS) @@ -105,6 +113,7 @@ UCHAR *sh_mem_address; ULONG sh_mem_length_mapped; SLONG sh_mem_handle; + TEXT sh_mem_name[MAXPATHLEN]; }; #endif // UNIX Modified: firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/isc_s_proto.h 2010-06-05 02:41:14 UTC (rev 51209) @@ -72,5 +72,6 @@ void ISC_unmap_file(ISC_STATUS*, struct sh_mem*); void ISC_remove_map_file(const TEXT* filename); +void ISC_remove_map_file(const struct sh_mem*); #endif // JRD_ISC_S_PROTO_H Modified: firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/isc_sync.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -1679,14 +1679,21 @@ void ISC_remove_map_file(const TEXT* filename) { +#ifndef WIN_NT TEXT expanded_filename[MAXPATHLEN]; gds__prefix_lock(expanded_filename, filename); // We can't do much (specially in dtors) when it fails // therefore do not check for errors - at least it's just /tmp. unlink(expanded_filename); +#endif // WIN_NT } +void ISC_remove_map_file(const struct sh_mem* shmem_data) +{ + ISC_remove_map_file(shmem_data->sh_mem_name); +} + #ifdef UNIX UCHAR* ISC_map_file(ISC_STATUS* status_vector, @@ -1822,6 +1829,7 @@ shmem_data->sh_mem_address = address; shmem_data->sh_mem_length_mapped = length; shmem_data->sh_mem_handle = fd; + strcpy(shmem_data->sh_mem_name, filename); #ifdef USE_SYS5SEMAPHORE // register mapped file @@ -1924,20 +1932,23 @@ * routine (if given) or punt (leaving the file unmapped). * **************************************/ - HANDLE file_handle, event_handle; + HANDLE file_handle; + HANDLE event_handle = 0; int retry_count = 0; TEXT expanded_filename[MAXPATHLEN]; gds__prefix_lock(expanded_filename, filename); const bool trunc_flag = (length != 0); + bool init_flag = false; /* retry to attach to mmapped file if the process initializing * dies during initialization. */ retry: - retry_count++; + if (retry_count++ > 0) + THREAD_SLEEP(10); file_handle = CreateFile(expanded_filename, GENERIC_READ | GENERIC_WRITE, @@ -1946,15 +1957,19 @@ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + DWORD err = GetLastError(); if (file_handle == INVALID_HANDLE_VALUE) { - error(status_vector, "CreateFile", GetLastError()); + if (err == ERROR_SHARING_VIOLATION) + goto retry; + + error(status_vector, "CreateFile", err); return NULL; } // Check if file already exists - const bool file_exists = (GetLastError() == ERROR_ALREADY_EXISTS); + const bool file_exists = (err == ERROR_ALREADY_EXISTS); // Create an event that can be used to determine if someone has already // initialized shared memory. @@ -1967,22 +1982,25 @@ return NULL; } - event_handle = CreateEvent(ISC_get_security_desc(), TRUE, FALSE, object_name); - if (!event_handle) + if (!init_flag) { - error(status_vector, "CreateEvent", GetLastError()); - CloseHandle(file_handle); - return NULL; - } + event_handle = CreateEvent(ISC_get_security_desc(), TRUE, FALSE, object_name); + if (!event_handle) + { + error(status_vector, "CreateEvent", GetLastError()); + CloseHandle(file_handle); + return NULL; + } - const bool init_flag = (GetLastError() != ERROR_ALREADY_EXISTS); + init_flag = (GetLastError() != ERROR_ALREADY_EXISTS); - if (init_flag && !init_routine) - { - CloseHandle(event_handle); - CloseHandle(file_handle); - Arg::Gds(isc_unavailable).copyTo(status_vector); - return NULL; + if (init_flag && !init_routine) + { + CloseHandle(event_handle); + CloseHandle(file_handle); + Arg::Gds(isc_unavailable).copyTo(status_vector); + return NULL; + } } if (length == 0) @@ -2022,7 +2040,7 @@ CloseHandle(event_handle); if (retry_count > 10) { - error(status_vector, "WaitForSingleObject", GetLastError()); + error(status_vector, "WaitForSingleObject", 0); return NULL; } goto retry; @@ -2046,6 +2064,14 @@ { const DWORD err = GetLastError(); + if ((err == ERROR_SHARING_VIOLATION) || (err == ERROR_FILE_NOT_FOUND && fdw_create == TRUNCATE_EXISTING)) + { + if (!init_flag) { + CloseHandle(event_handle); + } + goto retry; + } + if (err == ERROR_USER_MAPPED_FILE && init_flag && file_exists && trunc_flag) Arg::Gds(isc_instance_conflict).copyTo(status_vector); else @@ -3403,11 +3429,18 @@ TEXT expanded_filename[MAXPATHLEN]; gds__prefix_lock(expanded_filename, shmem_data->sh_mem_name); - if (!DeleteFile(expanded_filename)) - { - error(status_vector, "DeleteFile", GetLastError()); - return; - } + + // Delete file only if it is not used by anyone else + HANDLE hFile = CreateFile(expanded_filename, + DELETE, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, + NULL); + + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle(hFile); } #endif Modified: firebird/branches/B2_5_Release/src/jrd/isc_version.h =================================================================== --- firebird/branches/B2_5_Release/src/jrd/isc_version.h 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/isc_version.h 2010-06-05 02:41:14 UTC (rev 51209) @@ -17,7 +17,7 @@ * Contributor(s): ______________________________________. */ -#define ISC_FILE_VER_STRING "WI-T6.3.4.26024" -#define ISC_FILE_VER_NUMBER 6, 3, 4, 26024 +#define ISC_FILE_VER_STRING "WI-T6.3.4.26038" +#define ISC_FILE_VER_NUMBER 6, 3, 4, 26038 #define ISC_MAJOR_VER "6" #define ISC_MINOR_VER "3" Modified: firebird/branches/B2_5_Release/src/jrd/jrd.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/jrd.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/jrd.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -525,7 +525,8 @@ static bool drop_files(const jrd_file*); static void find_intl_charset(thread_db*, Attachment*, const DatabaseOptions*); static jrd_tra* find_transaction(thread_db*, ISC_STATUS); -static void init_database_locks(thread_db*); +static void init_database_lock(thread_db*); +static void init_monitoring_lock(thread_db*); static ISC_STATUS handle_error(ISC_STATUS*, ISC_STATUS); static void run_commit_triggers(thread_db* tdbb, jrd_tra* transaction); static void verify_request_synchronization(jrd_req*& request, SSHORT level); @@ -1000,8 +1001,8 @@ LCK_init(tdbb, LCK_OWNER_attachment); attachment->att_flags |= ATT_lck_init_done; - // Initialize locks - init_database_locks(tdbb); + // Initialize the database lock + init_database_lock(tdbb); INI_init(tdbb); SHUT_init(tdbb); @@ -1032,6 +1033,9 @@ // initialize shadowing as soon as the database is ready for it // but before any real work is done SDW_init(tdbb, options.dpb_activate_shadow, options.dpb_delete_shadow); + + // Turn monitoring on + init_monitoring_lock(tdbb); } else { @@ -2040,8 +2044,8 @@ LCK_init(tdbb, LCK_OWNER_attachment); attachment->att_flags |= ATT_lck_init_done; - // Initialize locks - init_database_locks(tdbb); + // Initialize the database lock + init_database_lock(tdbb); INI_init(tdbb); PAG_init(tdbb); @@ -2116,6 +2120,9 @@ VIO_init(tdbb); #endif + // Turn monitoring on + init_monitoring_lock(tdbb); + if (options.dpb_set_db_readonly) { if (!CCH_exclusive (tdbb, LCK_EX, WAIT_PERIOD)) @@ -4103,7 +4110,9 @@ if (dbb->dbb_ast_flags & DBB_monitor_off) { dbb->dbb_ast_flags &= ~DBB_monitor_off; + dbb->dbb_flags |= DBB_monitor_locking; LCK_lock(tdbb, dbb->dbb_monitor_lock, LCK_SR, LCK_WAIT); + dbb->dbb_flags &= ~DBB_monitor_locking; // While waiting for return from LCK_lock call above the blocking AST (see // DatabaseSnapshot::blockingAst) was called and set DBB_monitor_off flag @@ -4219,7 +4228,9 @@ if (dbb->dbb_ast_flags & DBB_monitor_off) { dbb->dbb_ast_flags &= ~DBB_monitor_off; + dbb->dbb_flags |= DBB_monitor_locking; LCK_lock(tdbb, dbb->dbb_monitor_lock, LCK_SR, LCK_WAIT); + dbb->dbb_flags &= ~DBB_monitor_locking; if (dbb->dbb_ast_flags & DBB_monitor_off) LCK_release(tdbb, dbb->dbb_monitor_lock); @@ -4915,16 +4926,16 @@ } -static void init_database_locks(thread_db* tdbb) +static void init_database_lock(thread_db* tdbb) { /************************************** * - * i n i t _ d a t a b a s e _ l o c k s + * i n i t _ d a t a b a s e _ l o c k * ************************************** * * Functional description - * Initialize database locks. + * Initialize the database lock. * **************************************/ SET_TDBB(tdbb); @@ -4977,11 +4988,27 @@ } } } +} +static void init_monitoring_lock(thread_db* tdbb) +{ +/************************************** + * + * i n i t _ m o n i t o r i n g _ l o c k + * + ************************************** + * + * Functional description + * Initialize the monitoring lock. + * + **************************************/ + SET_TDBB(tdbb); + Database* const dbb = tdbb->getDatabase(); + // Lock shared by all dbb owners, used to signal other processes // to dump their monitoring data and synchronize operations - lock = FB_NEW_RPT(*dbb->dbb_permanent, sizeof(SLONG)) Lock(); + Lock* const lock = FB_NEW_RPT(*dbb->dbb_permanent, sizeof(SLONG)) Lock(); dbb->dbb_monitor_lock = lock; lock->lck_type = LCK_monitor; lock->lck_owner_handle = LCK_get_owner_handle(tdbb, lock->lck_type); Modified: firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/jrd/trace/TraceConfigStorage.cpp 2010-06-05 02:41:14 UTC (rev 51209) @@ -150,6 +150,8 @@ { unlink(m_base->cfg_file_name); memset(m_base->cfg_file_name, 0, sizeof(m_base->cfg_file_name)); + + ISC_remove_map_file(&m_handle); } } Modified: firebird/branches/B2_5_Release/src/misc/writeBuildNum.sh =================================================================== --- firebird/branches/B2_5_Release/src/misc/writeBuildNum.sh 2010-06-05 01:54:52 UTC (rev 51208) +++ firebird/branches/B2_5_Release/src/misc/writeBuildNum.sh 2010-06-05 02:41:14 UTC (rev 51209) @@ -3,13 +3,13 @@ # This file is used both to rebuild the header file and to set the # environment variables on the config call -BuildVersion="$Id: writeBuildNum.sh,v 1.25898.2.18 2010-05-21 05:19:49 dimitr Exp $" +BuildVersion="$Id: writeBuildNum.sh,v 1.25898.2.19 2010/05/28 14:38:22 alexpeshkoff Exp $" BuildType=V MajorVer=2 MinorVer=5 RevNo=0 -BuildNum=26024 +BuildNum=26038 if [ "$SPECIAL_BUILD_SUFFIX" = "" ]; then # Normal builds This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |