docs: int walkHash(HashtableAction action, int retrieveMode, int index, int length)
                      throws IOException,
                      EOFException,
                      FileManagerException,
                      ClassNotFoundException,
                      HashtableOnDiskException {
          iterationLock.p();
  
          int tindex = -1;
  
          int tableSize = header.tablesize();
          //System.out.println("*** table size= " + tableSize + " index=" + index  + " length=" + length);
  
          try {
              for (int i = index, j = 0; i < tableSize; i++) {
                  //
                  // We want to drop the lock between each iteration so that other
                  // threads can continue to work
                  //
                  boolean result = true;
                  synchronized (this) {
                      long location = getHtindex(i, header.currentTableId());
                      long previous = 0;
                      long next = 0;
                      int hash = 0;
                      initReadBuffer(location);
                      next = headerin.readLong();
                      hash = headerin.readInt();
  
                      while (location != 0) {
                          HashtableEntry e = readEntry2(location, next, hash, previous, retrieveMode, !CHECK_EXPIRED, header.currentTableId(), null, null);
                          if (e != null) {
                              j++;
                              try {
                                  Object id = e.getKey();
                                  result = action.execute(e);
                                  // if result is false, do not continue
                                  if (result == false) { // LI4337-17
                                      traceDebug("walkHash()", "cacheName=" + this.htoddc.cacheName + " id=" + id + " action.execute() returns false.");
                                      break;
                                  }
                              } catch (Exception xcp) {
                                  throw new HashtableOnDiskException("HashtableAction: " + xcp.toString());
                              }
                              previous = location;
                              location = next;
                              if (location != 0) {
                                  initReadBuffer(location);
                                  next = headerin.readLong();
                                  hash = headerin.readInt();
                              }
                          }
                      }
                      // if result is false, do not continue
                      if (result == false) { // LI4337-17
                          break;
                      }
                      if (j >= length) {
                          tindex = i + 1;
                          break;
                      }
                  }
              }
          } finally {
              iterationLock.v();
          }
          if (tindex == -1) {
              tindex = tableSize;
          }
          //System.out.println("*** HTOD return index=" + tindex + " tableSize=" + tableSize);
          return tindex;
      }