docs: private void read_block_sizes_from_disk(boolean coalesce_blocks)
      throws IOException
      {
          long addr = FIRST_TAIL;
          int length;
          long new_tail = tail_ptr;
  
          while (addr < tail_ptr) {
              seek(addr);
              if (coalesce_blocks) {
                  length = combine_blocks(addr);
              } else {
                  length = readInt();
              }
              if (length > 0) {
                  if ((length + addr >= tail_ptr) && (!readOnly)) {
                      // add last block to tail
                      new_tail = addr;
                  } else {
                      add_to_freelist(addr, length);
                  }
              } else {
                  length = - length;
                  allocated_blocks++;
                  allocated_words += length;
              }
              addr = addr + length;
          }
          if ((new_tail != tail_ptr) && (!readOnly)) {
              tail_ptr = new_tail;
              seek(TAIL_DPTR);
              writeLong(tail_ptr);
          }
  
      }