mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 18:03:04 +01:00
Fixed CORE-4631: Lock manager "out of room" error hides the real cause of this problem.
This commit is contained in:
parent
5faf9b4b74
commit
aa2711626f
@ -541,9 +541,8 @@ SRQ_PTR LockManager::enqueue(Attachment* attachment,
|
|||||||
if (SRQ_EMPTY(m_sharedMemory->getHeader()->lhb_free_requests))
|
if (SRQ_EMPTY(m_sharedMemory->getHeader()->lhb_free_requests))
|
||||||
{
|
{
|
||||||
if (!(request = (lrq*) alloc(sizeof(lrq), &statusVector)))
|
if (!(request = (lrq*) alloc(sizeof(lrq), &statusVector)))
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
owner = (own*) SRQ_ABS_PTR(owner_offset);
|
owner = (own*) SRQ_ABS_PTR(owner_offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1093,6 +1092,7 @@ void LockManager::acquire_shmem(SRQ_PTR owner_offset)
|
|||||||
* Acquire the lock file. If it's busy, wait for it.
|
* Acquire the lock file. If it's busy, wait for it.
|
||||||
*
|
*
|
||||||
**************************************/
|
**************************************/
|
||||||
|
Arg::StatusVector localStatus;
|
||||||
|
|
||||||
// Perform a spin wait on the lock table mutex. This should only
|
// Perform a spin wait on the lock table mutex. This should only
|
||||||
// be used on SMP machines; it doesn't make much sense otherwise.
|
// be used on SMP machines; it doesn't make much sense otherwise.
|
||||||
@ -1122,8 +1122,6 @@ void LockManager::acquire_shmem(SRQ_PTR owner_offset)
|
|||||||
{
|
{
|
||||||
if (!m_sharedFileCreated)
|
if (!m_sharedFileCreated)
|
||||||
{
|
{
|
||||||
Arg::StatusVector localStatus;
|
|
||||||
|
|
||||||
// Someone is going to delete shared file? Reattach.
|
// Someone is going to delete shared file? Reattach.
|
||||||
m_sharedMemory->mutexUnlock();
|
m_sharedMemory->mutexUnlock();
|
||||||
detach_shared_file(localStatus);
|
detach_shared_file(localStatus);
|
||||||
@ -1131,7 +1129,7 @@ void LockManager::acquire_shmem(SRQ_PTR owner_offset)
|
|||||||
Thread::yield();
|
Thread::yield();
|
||||||
|
|
||||||
if (!attach_shared_file(localStatus))
|
if (!attach_shared_file(localStatus))
|
||||||
bug(&localStatus, "ISC_map_file failed (reattach shared file)");
|
bug(NULL, "ISC_map_file failed (reattach shared file)");
|
||||||
|
|
||||||
m_sharedMemory->mutexLock();
|
m_sharedMemory->mutexLock();
|
||||||
}
|
}
|
||||||
@ -1176,7 +1174,7 @@ void LockManager::acquire_shmem(SRQ_PTR owner_offset)
|
|||||||
#ifdef USE_SHMEM_EXT
|
#ifdef USE_SHMEM_EXT
|
||||||
while (m_sharedMemory->getHeader()->lhb_length > getTotalMapped())
|
while (m_sharedMemory->getHeader()->lhb_length > getTotalMapped())
|
||||||
{
|
{
|
||||||
if (!createExtent())
|
if (!createExtent(localStatus))
|
||||||
{
|
{
|
||||||
bug(NULL, "map of lock file extent failed");
|
bug(NULL, "map of lock file extent failed");
|
||||||
}
|
}
|
||||||
@ -1197,8 +1195,7 @@ void LockManager::acquire_shmem(SRQ_PTR owner_offset)
|
|||||||
// Post remapping notifications
|
// Post remapping notifications
|
||||||
remap_local_owners();
|
remap_local_owners();
|
||||||
// Remap the shared memory region
|
// Remap the shared memory region
|
||||||
Arg::StatusVector statusVector;
|
if (!m_sharedMemory->remapFile(localStatus, new_length, false))
|
||||||
if (!m_sharedMemory->remapFile(statusVector, new_length, false))
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
bug(NULL, "remap failed");
|
bug(NULL, "remap failed");
|
||||||
@ -1247,15 +1244,14 @@ bool LockManager::Extent::initialize(bool)
|
|||||||
void LockManager::Extent::mutexBug(int, const char*)
|
void LockManager::Extent::mutexBug(int, const char*)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
bool LockManager::createExtent()
|
bool LockManager::createExtent(Arg::StatusVector& statusVector)
|
||||||
{
|
{
|
||||||
Firebird::PathName name;
|
Firebird::PathName name;
|
||||||
get_shared_file_name(name, (ULONG) m_extents.getCount());
|
get_shared_file_name(name, (ULONG) m_extents.getCount());
|
||||||
Arg::StatusVector local_status;
|
|
||||||
|
|
||||||
Extent& extent = m_extents.add();
|
Extent& extent = m_extents.add();
|
||||||
|
|
||||||
if (!extent.mapFile(local_status, name.c_str(), m_memorySize))
|
if (!extent.mapFile(statusVector, name.c_str(), m_memorySize))
|
||||||
{
|
{
|
||||||
m_extents.pop();
|
m_extents.pop();
|
||||||
logError("LockManager::createExtent() mapFile", local_status);
|
logError("LockManager::createExtent() mapFile", local_status);
|
||||||
@ -1279,6 +1275,11 @@ UCHAR* LockManager::alloc(USHORT size, Arg::StatusVector* statusVector)
|
|||||||
* Allocate a block of given size.
|
* Allocate a block of given size.
|
||||||
*
|
*
|
||||||
**************************************/
|
**************************************/
|
||||||
|
Arg::StatusVector localStatus;
|
||||||
|
|
||||||
|
if (!statusVector)
|
||||||
|
statusVector = &localStatus;
|
||||||
|
|
||||||
size = FB_ALIGN(size, FB_ALIGNMENT);
|
size = FB_ALIGN(size, FB_ALIGNMENT);
|
||||||
ASSERT_ACQUIRED;
|
ASSERT_ACQUIRED;
|
||||||
ULONG block = m_sharedMemory->getHeader()->lhb_used;
|
ULONG block = m_sharedMemory->getHeader()->lhb_used;
|
||||||
@ -1290,7 +1291,7 @@ UCHAR* LockManager::alloc(USHORT size, Arg::StatusVector* statusVector)
|
|||||||
#ifdef USE_SHMEM_EXT
|
#ifdef USE_SHMEM_EXT
|
||||||
// round up so next object starts at beginning of next extent
|
// round up so next object starts at beginning of next extent
|
||||||
block = m_sharedMemory->getHeader()->lhb_used = m_sharedMemory->getHeader()->lhb_length;
|
block = m_sharedMemory->getHeader()->lhb_used = m_sharedMemory->getHeader()->lhb_length;
|
||||||
if (createExtent())
|
if (createExtent(*statusVector))
|
||||||
{
|
{
|
||||||
m_sharedMemory->getHeader()->lhb_length += m_memorySize;
|
m_sharedMemory->getHeader()->lhb_length += m_memorySize;
|
||||||
}
|
}
|
||||||
@ -1312,8 +1313,9 @@ UCHAR* LockManager::alloc(USHORT size, Arg::StatusVector* statusVector)
|
|||||||
// Do not do abort in case if there is not enough room -- just
|
// Do not do abort in case if there is not enough room -- just
|
||||||
// return an error
|
// return an error
|
||||||
|
|
||||||
if (statusVector)
|
Arg::Gds prefix(isc_lockmanerr);
|
||||||
*statusVector << Arg::Gds(isc_random) << "lock manager out of room";
|
prefix << Arg::Gds(isc_random) << Arg::Str("lock manager out of room");
|
||||||
|
statusVector->prepend(prefix);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1639,7 +1641,10 @@ void LockManager::bug(Arg::StatusVector* statusVector, const TEXT* string)
|
|||||||
|
|
||||||
if (statusVector)
|
if (statusVector)
|
||||||
{
|
{
|
||||||
*statusVector << Arg::Gds(isc_lockmanerr) << Arg::Gds(isc_random) << string;
|
Arg::Gds prefix(isc_lockmanerr);
|
||||||
|
prefix << Arg::Gds(isc_random) << Arg::Str(string);
|
||||||
|
statusVector->prepend(prefix);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1689,10 +1694,8 @@ SRQ_PTR LockManager::create_owner(Arg::StatusVector& statusVector,
|
|||||||
if (!m_processOffset)
|
if (!m_processOffset)
|
||||||
{
|
{
|
||||||
if (!create_process(statusVector))
|
if (!create_process(statusVector))
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Look for a previous instance of owner. If we find one, get rid of it.
|
// Look for a previous instance of owner. If we find one, get rid of it.
|
||||||
|
|
||||||
@ -1713,10 +1716,8 @@ SRQ_PTR LockManager::create_owner(Arg::StatusVector& statusVector,
|
|||||||
if (SRQ_EMPTY(m_sharedMemory->getHeader()->lhb_free_owners))
|
if (SRQ_EMPTY(m_sharedMemory->getHeader()->lhb_free_owners))
|
||||||
{
|
{
|
||||||
if (!(owner = (own*) alloc(sizeof(own), &statusVector)))
|
if (!(owner = (own*) alloc(sizeof(own), &statusVector)))
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
owner = (own*) ((UCHAR*) SRQ_NEXT(m_sharedMemory->getHeader()->lhb_free_owners) -
|
owner = (own*) ((UCHAR*) SRQ_NEXT(m_sharedMemory->getHeader()->lhb_free_owners) -
|
||||||
@ -1725,9 +1726,7 @@ SRQ_PTR LockManager::create_owner(Arg::StatusVector& statusVector,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!init_owner_block(statusVector, owner, owner_type, owner_id))
|
if (!init_owner_block(statusVector, owner, owner_type, owner_id))
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
insert_tail(&m_sharedMemory->getHeader()->lhb_owners, &owner->own_lhb_owners);
|
insert_tail(&m_sharedMemory->getHeader()->lhb_owners, &owner->own_lhb_owners);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user