Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-4055

Space may not be reclaimed if row locks are not available after three retries

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 10.1.3.1, 10.2.2.0, 10.3.3.0, 10.4.2.0, 10.5.1.1
    • Fix Version/s: None
    • Component/s: Store
    • Urgency:
      Normal
    • Issue & fix info:
      High Value Fix, Workaround attached

      Description

      In a multithreaded clob update where the same row is being updated, space will not be reclaimed. The offending code is in ReclaimSpaceHelper:

      RecordHandle headRecord = work.getHeadRowHandle();

      if (!container_rlock.lockRecordForWrite(
      tran, headRecord, false /* not insert /, false / nowait */))
      {
      // cannot get the row lock, retry
      tran.abort();
      if (work.incrAttempts() < 3)

      { return Serviceable.REQUEUE; }
      else
      {
      // If code gets here, the space will be lost forever, and
      // can only be reclaimed by a full offline compress of the
      // table/index.

      if (SanityManager.DEBUG)
      {
      if (SanityManager.DEBUG_ON(DaemonService.DaemonTrace))
      { SanityManager.DEBUG( DaemonService.DaemonTrace, " gave up after 3 tries to get row lock " + work); }
      }
      return Serviceable.DONE;
      }
      }


      If we cannot get the lock after three tries we give up. The reproduction for this issue is in the test store.ClobReclamationTest.xtestMultiThreadUpdateSingleRow().


      This issue also used to reference the code below and has some references to trying to get a reproduction for that issue, but that work has moved to DERBY-4054. Please see DERBY-4054 for work on the container lock issue.

      ContainerHandle containerHdl =
      openContainerNW(tran, container_rlock, work.getContainerId());

      if (containerHdl == null)
      {
      tran.abort();

      if (SanityManager.DEBUG)
      {
      if (SanityManager.DEBUG_ON(DaemonService.DaemonTrace))
      { SanityManager.DEBUG( DaemonService.DaemonTrace, " aborted " + work + " because container is locked or dropped"); }
      }

      if (work.incrAttempts() < 3) // retry this for serveral times
      { return Serviceable.REQUEUE; }

      else
      {
      // If code gets here, the space will be lost forever, and
      // can only be reclaimed by a full offline compress of the
      // table/index.

      if (SanityManager.DEBUG)
      {
      if (SanityManager.DEBUG_ON(DaemonService.DaemonTrace))

      { SanityManager.DEBUG( DaemonService.DaemonTrace, " gave up after 3 tries to get container lock " + work); }

      }

      return Serviceable.DONE;
      }
      }

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                kmarsden Kathey Marsden
              • Votes:
                1 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated: