You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Barrett Oglesby (Jira)" <ji...@apache.org> on 2019/09/26 19:23:00 UTC

[jira] [Created] (GEODE-7247) Export data shouldn't deserialize the value

Barrett Oglesby created GEODE-7247:
--------------------------------------

             Summary: Export data shouldn't deserialize the value
                 Key: GEODE-7247
                 URL: https://issues.apache.org/jira/browse/GEODE-7247
             Project: Geode
          Issue Type: Bug
          Components: snapshot
            Reporter: Barrett Oglesby


Currently RegionSnapshotService save attempts to deserialize the value before writing it to the snapshot file.
{noformat}
org.apache.geode.SerializationException: An IOException was thrown while deserializing
	at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1915)
	at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1904)
	at org.apache.geode.internal.cache.VMCachedDeserializable.getDeserializedValue(VMCachedDeserializable.java:134)
	at org.apache.geode.internal.cache.EntrySnapshot.getRawValue(EntrySnapshot.java:113)
	at org.apache.geode.internal.cache.EntrySnapshot.getRawValue(EntrySnapshot.java:101)
	at org.apache.geode.internal.cache.EntrySnapshot.getValue(EntrySnapshot.java:130)
	at org.apache.geode.internal.cache.snapshot.SnapshotPacket$SnapshotRecord.<init>(SnapshotPacket.java:79)
	at org.apache.geode.internal.cache.snapshot.LocalExporter.export(LocalExporter.java:46)
	at org.apache.geode.internal.cache.snapshot.RegionSnapshotServiceImpl.exportOnMember(RegionSnapshotServiceImpl.java:322)
	at org.apache.geode.internal.cache.snapshot.RegionSnapshotServiceImpl.save(RegionSnapshotServiceImpl.java:150)
	at org.apache.geode.internal.cache.snapshot.RegionSnapshotServiceImpl.save(RegionSnapshotServiceImpl.java:133)
Caused by: java.io.IOException: Unknown header byte: -3
	at org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2876)
	at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2961)
	at org.apache.geode.internal.util.BlobHelper.deserializeBlob(BlobHelper.java:99)
	at org.apache.geode.internal.cache.EntryEventImpl.deserialize(EntryEventImpl.java:1911)
{noformat}
Instead it should just take the serialized bytes and write them to the file.

The SnapshotRecord constructor calls entry.getValue() which deserializes the value here:
{noformat}
public <K, V> SnapshotRecord(LocalRegion region, Entry<K, V> entry) throws IOException {
  key = BlobHelper.serializeToBlob(entry.getKey());
  if (entry instanceof NonTXEntry && region != null) {
    @Released
    Object v =
        ((NonTXEntry) entry).getRegionEntry().getValueOffHeapOrDiskWithoutFaultIn(region);
    try {
      value = convertToBytes(v);
    } finally {
      OffHeapHelper.release(v);
    }
  } else {
->   value = convertToBytes(entry.getValue());
  }
}
{noformat}
Code like this gets the CachedDeserializable instead:
{noformat}
value = convertToBytes(((EntrySnapshot) entry).getRegionEntry().getValue(null));
{noformat}
which when passed to convertToBytes gets the bytes instead:
{noformat}
byte[] bytes = ((CachedDeserializable) val).getSerializedValue();
{noformat}
Currently, export can fail with serialization exceptions on corrupted records. Not deserializing the value would hide corrupted data and propagate it via import into the new system. Any access will cause the SerializationException.




--
This message was sent by Atlassian Jira
(v8.3.4#803005)