docs: public void acknowledgePages(long sequenceId)
      {
          checkArgument(sequenceId >= 0, "Invalid sequence id");
  
          List<SerializedPageReference> removedPages = new ArrayList<>();
          synchronized (this) {
              if (destroyed.get()) {
                  return;
              }
  
              // if pages have already been acknowledged, just ignore this
              long oldCurrentSequenceId = currentSequenceId.get();
              if (sequenceId < oldCurrentSequenceId) {
                  return;
              }
  
              int pagesToRemove = toIntExact(sequenceId - oldCurrentSequenceId);
              checkArgument(pagesToRemove <= pages.size(), "Invalid sequence id");
  
              long bytesRemoved = 0;
              for (int i = 0; i < pagesToRemove; i++) {
                  SerializedPageReference removedPage = pages.removeFirst();
                  removedPages.add(removedPage);
                  bytesRemoved += removedPage.getRetainedSizeInBytes();
              }
  
              // update current sequence id
              verify(currentSequenceId.compareAndSet(oldCurrentSequenceId, oldCurrentSequenceId + pagesToRemove));
  
              // update memory tracking
              verify(bufferedBytes.addAndGet(-bytesRemoved) >= 0);
          }
  
          // dereference outside of synchronized to avoid making a callback while holding a lock
          removedPages.forEach(SerializedPageReference::dereferencePage);
      }