@Override
    public void fromData(DataInput in,
        DeserializationContext context) throws IOException, ClassNotFoundException {
      short bits = in.readShort();
      short extBits = in.readShort();
      flags = bits;
      setFlags(bits, in);
      regionPath = DataSerializer.readString(in);
      op = Operation.fromOrdinal(in.readByte());
      // TODO dirack There's really no reason to send this flag across the wire
      // anymore
      directAck = (bits & DIRECT_ACK_MASK) != 0;
      possibleDuplicate = (bits & POSSIBLE_DUPLICATE_MASK) != 0;
      if ((bits & CALLBACK_ARG_MASK) != 0) {
        callbackArg = DataSerializer.readObject(in);
      }
      hasDelta = (bits & DELTA_MASK) != 0;
      hasOldValue = (bits & OLD_VALUE_MASK) != 0;
      if (hasOldValue) {
        byte b = in.readByte();
        if (b == 0) {
          oldValueIsSerialized = false;
        } else if (b == 1) {
          oldValueIsSerialized = true;
        } else {
          throw new IllegalStateException("expected 0 or 1");
        }
        oldValue = DataSerializer.readByteArray(in);
      }
      boolean hasFilterInfo = (bits & FILTER_INFO_MASK) != 0;
      needsRouting = (bits & NEEDS_ROUTING_MASK) != 0;
      if (hasFilterInfo) {
        filterRouting = new FilterRoutingInfo();
        InternalDataSerializer.invokeFromData(filterRouting, in);
      }
      if ((bits & VERSION_TAG_MASK) != 0) {
        boolean persistentTag = (bits & PERSISTENT_TAG_MASK) != 0;
        versionTag = VersionTag.create(persistentTag, in);
      }
      if ((extBits & INHIBIT_NOTIFICATIONS_MASK) != 0) {
        inhibitAllNotifications = true;
      }
    }
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