@Override
    public void toData(DataOutput out,
        SerializationContext context) throws IOException {
      short bits = 0;
      short extendedBits = 0;
      bits = computeCompressedShort(bits);
      extendedBits = computeCompressedExtBits(extendedBits);
      out.writeShort(bits);
      out.writeShort(extendedBits);
      if (processorId > 0) {
        out.writeInt(processorId);
      }

      DataSerializer.writeString(regionPath, out);
      out.writeByte(op.ordinal);
      if (callbackArg != null) {
        DataSerializer.writeObject(callbackArg, out);
      }
      if (hasOldValue) {
        out.writeByte(oldValueIsSerialized ? 1 : 0);
        // the receiving side expects that the old value will have been serialized
        // as a byte array
        final byte policy = valueIsToDeserializationPolicy(oldValueIsSerialized);
        final Object vObj;
        final byte[] vBytes;
        if (!oldValueIsSerialized && oldValue instanceof byte[]) {
          vObj = null;
          vBytes = (byte[]) oldValue;
        } else {
          vObj = oldValue;
          vBytes = null;
        }
        writeValue(policy, vObj, vBytes, out);
      }
      if (filterRouting != null) {
        InternalDataSerializer.invokeToData(filterRouting, out);
      }
      if (versionTag != null) {
        InternalDataSerializer.invokeToData(versionTag, out);
      }
    }
When an event is discarded because of an attempt to overwrite a more recent change we still
need to deliver that event to clients. Clients can then perform their own concurrency checks
on the event.
geode-core/src/main/java/org/apache/geode/internal/cache/DistributedCacheOperation.java