• Topic
  • Discussion
  • UdaWikiWeb.NumberOfPrivateSlots(Last) -- Owiki? , 2016-08-19 15:00:36 Edit owiki 2016-08-19 15:00:36

    Error Messages (N)

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z #

    Number of private slots in segment table exhausted (1083)

    PROGRESS uses shared memory for database access. Each process that
    uses shared memory must attach to it. If the PROGRESS client could
    only attach to 1 database, then when the broker created the shared
    memory segment, it would be created in such a way that all the
    processes connecting to the shared memory segments would be connected
    at the same address so all the pointer locations inside shared memory
    would have the same address regardless of which process was looking at them.

    Since version 6 when a PROGRESS client was made capable of connecting
    to multiple databases a new scheme needed to be invented for looking
    at data in shared memory. No longer was it the case that all processes
    would connect to shared memory at the same address. For Example:

    A Process could look at a place in shared memory and it's address
    would be 10752 because it's attach address to the shared memory
    segment was 10000.
    A different process connects to the same shared memory, but attaches
    at address 20000 instead of 10000. The same data for this process will
    have address 20752.

    To solve this problem, PROGRESS came up with Position Independent
    Pointers (PIP). The rule being any pointer which is stored in shared
    memory *MUST* be a PIP pointer. The implementation for PIP pointers
    is to only store offsets from the beginning of the shared memory
    segment. In addition, a table is created to keep track of attach addresses.
    In this way, the above example would look like:

    The value in question would have a PIP address of Segment 1, offset 752.
    Process 1 would look at the Attach address of Segment 1 (10000) and add
    752 to get it real pointer relative to that process (10752).
    Process 2 would do the same, Segment 1 (20000) and 752 = 20752} for a real
    pointer.

    With this all said and done, now back to the error message:
    SYSTEM ERROR: Number of private slots in segment table exhausted (1083)

    The Database Manager code is not always sure if a data structure is to
    reside in shared memory or not. To that end, PROGRESS reserves a few
    (10) table entries for pointers that get converted to PIP pointers when
    the pointers were not in shared memory, but rather private memory. These
    reserved table entries are called "Private Slots". Each slot can address
    up to 16MB (which is the largest shared memory segment size PROGRESS uses,
    128 MB on IBM). When a pointer is getting converted to a PIP pointer,
    PROGRESS looks for the shared memory segment that would contain the
    pointer. If it can't find it, then the pointer *must* reside in private
    memory. It will then look to see if this pointer is within any of the
    already existing private slots made up of 16 MB each, if not then we'll
    create a new virtual private segment by taking up a table entry (slot).
    Once all these slots are consumed, then upon creation of the next virtual
    private slot, you would get the above message.


    So, how does this happen. Maybe the client process is taking up too
    much memory performing it's operation. Maybe the processes heap is
    split up into 2 segments, below and above shared memory swo that the
    pointers more than 16MB away from each other (not likely).
    Maybe the clients -hs setting is too high. Most likely it's a bug
    in PROGRESS that needs investigating.


    Referenced by...