docs: @Override
      public synchronized LogCursor recoverableUnits(FailureScope failureScope) throws LogClosedException /* @MD19706C */
      {
          if (tc.isEntryEnabled())
              Tr.entry(tc, "recoverableUnits", new Object[] { failureScope, this });
  
          // Check that the log is actually open
          if (_closesRequired == 0) {
              if (tc.isEntryEnabled())
                  Tr.exit(tc, "recoverableUnits", "LogClosedException");
              throw new LogClosedException(null);
          }
  
          final List<SQLRecoverableUnitImpl> recoverableUnits = new ArrayList<SQLRecoverableUnitImpl>();
  
          // No need to access this inside a sync block as the caller is required to
          // hold off from changing the underlying structures whilst the cursor is open.
          final Iterator iterator = _recoverableUnits.values().iterator();
  
          while (iterator.hasNext()) {
              final SQLRecoverableUnitImpl recoverableUnit = (SQLRecoverableUnitImpl) iterator.next();
  
              if (_bypassContainmentCheck || (recoverableUnit.failureScope().isContainedBy(failureScope))) {
                  recoverableUnits.add(recoverableUnit);
              }
          }
  
          final LogCursor cursor = new LogCursorImpl((Lock) null, recoverableUnits, true, this);
  
          if (tc.isEntryEnabled())
              Tr.exit(tc, "recoverableUnits", cursor);
  
          return cursor;
      }