Consultor Eletrônico



Kbase 17946: bklok:inconsistent pointers, ptbl <val> oldbktbl <val>(1041)
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   06/10/2005
Status: Unverified

SYMPTOM(s):

SYSTEM ERROR: bklok: inconsistent pointers, ptbl <val> oldbktbl <val> (1041)

Missing keyword DESCRIPTOR after EXEC SQL GET. (2636)

FIX:

This circumstance should never occur. There are two data structures (the "buffer header" structure and the "block buffer" structure) which are each supposed to have a pointer to the other. But one is pointing to the wrong place. These pointers are set during startup and never changed thereafter. The bkloc module is the one that locks the first two database blocks into reserved buffers and returns a pointer to the first one. It is up to other routines to locate the block,take it off the lru chain, but bkloc in particular does the locking of the block into memory. Once removed from the LRU chain, these blocks should stay locked in memory and should not get replaced.

The main program that is calling bkloc is bksteal. Bksteal is the program that takes a buffer and reads the block we want into that buffer. If this block is modified, it is written out before the new block is read into memory. We have seen this before in another error known as SYSTEM ERROR: bksteal: Attempt to read block <block-num>above high water mark <block-num2>. (3636) It is rather self explanatory that we should never lose our place at any point in this process, and
if we do we have a very unusual situation.

Now for the exact point in this process where the error occurs. We are in bksteal and are attempting to find a block to read into a buffer. If there are not enough buffers in the buffer pool at this point then we should see an "increase your -B" type error. If we get beyond that point we are then looking for the most recently used buffer that has not been modified. When we find that buffer and try to lock the desired block into it, the pointers established by bkloc are verified. If the pointer to the block is not consistent for some reason, then we
see the SYSTEM ERROR: bklok: inconsistent pointers, ptbl <val>oldbktbl <val> (1041).

Now the big question. Why would we ever see this error? When other errors appear due to block inconsistencies within the buffer pool, some have suggested there are too few buffers available creating a contention situation hence the errors. The workaround of increasing the buffer pool has gotten some customers around the error, however,it is not really addressing the root cause of the problem. Progress should NEVER be lost in the database or the bi buffer pool, and if we
are it is either due to a memory problem or bug. If one of these errors shows up on your database after memory has been reinitialized, then we either have a physical problem with the block we are reading or a bug, and it should be reported.

So, possible causes are:

1. Too few buffers, as mentioned above.
2. Memory hardware error.
3. Disk error on the swap device.
4. Erroneous third party code writing to wrong memory address.
5. Progress bug.

This is often a very hard and time consuming error to track down because it is quite rare and not able to be reproduced at will.

Due to this error possibly being a Progress bug, we have introduced a new feature in Version 8.3D. This feature will cause the blocks containing the pointers to be dumped to the log file for analysis by development. If you receive the error and have the dumped data, please contact your local Technical Support Centre and provide them with this data for analysis.

Please note that the data that was dumped and provided to Progress may not determine the cause of the error and should only be viewed as an 'attempt' to find the cause of the error.