code: public T reserve(final Txn<T> txn, final T key, final int size,
                     final PutFlags... op) {
      if (SHOULD_CHECK) {
        requireNonNull(txn);
        requireNonNull(key);
        txn.checkReady();
        txn.checkWritesAllowed();
      }
      txn.kv().keyIn(key);
      txn.kv().valIn(size);
      final int flags = mask(op) | MDB_RESERVE.getMask();
      checkRc(LIB.mdb_put(txn.pointer(), ptr, txn.kv().pointerKey(), txn.kv()
                          .pointerVal(), flags));
      txn.kv().valOut(); // marked as in,out in LMDB C docs
      return txn.val();
    }
docs: Reserve space for data of the given size, but don't copy the given val.
  Instead, return a pointer to the reserved space, which the caller can fill
  in later - before the next update operation or the transaction ends. This
  saves an extra memcpy if the data is being generated later. LMDB does
  nothing else with this memory, the caller is expected to modify all of the
  space requested.
  
  <p>
  This flag must not be specified if the database was opened with MDB_DUPSORT
  
  @param txn  transaction handle (not null; not committed; must be R-W)
  @param key  key to store in the database (not null)
  @param size size of the value to be stored in the database
  @param op   options for this operation
  @return a buffer that can be used to modify the value