@Override public void write(DataOutputView out) throws IOException { super.write(out); TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience(out, nestedSerializersAndConfigs); }
@Override protected void writeKeyAndNamespaceSerializers(DataOutputView out) throws IOException { // write key / namespace serializers, and their configuration snapshots TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( Tuple2.of(timersSnapshot.getKeySerializer(), timersSnapshot.getKeySerializerConfigSnapshot()), Tuple2.of(timersSnapshot.getNamespaceSerializer(), timersSnapshot.getNamespaceSerializerConfigSnapshot()))); } }
/** * Verifies resilience to serializer deserialization failures when writing and reading * serializer and config snapshot pairs. */ @Test public void testSerializerAndConfigPairsSerializationWithSerializerDeserializationFailures() throws Exception { TestIntSerializer serializer = new TestIntSerializer(); List<Tuple2<TypeSerializer<?>, TypeSerializerSnapshot<?>>> serializersAndConfigs = Arrays.asList( new Tuple2<TypeSerializer<?>, TypeSerializerSnapshot<?>>( serializer, serializer.snapshotConfiguration())); byte[] serializedSerializersAndConfigs; try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( new DataOutputViewStreamWrapper(out), serializersAndConfigs); serializedSerializersAndConfigs = out.toByteArray(); } Set<String> cnfThrowingClassnames = new HashSet<>(); cnfThrowingClassnames.add(TestIntSerializer.class.getName()); List<Tuple2<TypeSerializer<?>, TypeSerializerSnapshot<?>>> restored; try (ByteArrayInputStream in = new ByteArrayInputStream(serializedSerializersAndConfigs)) { restored = TypeSerializerSerializationUtil.readSerializersAndConfigsWithResilience( new DataInputViewStreamWrapper(in), new ArtificialCNFExceptionThrowingClassLoader( Thread.currentThread().getContextClassLoader(), cnfThrowingClassnames)); } Assert.assertEquals(1, restored.size()); Assert.assertTrue(restored.get(0).f0 instanceof UnloadableDummyTypeSerializer); Assert.assertThat(restored.get(0).f1, Matchers.instanceOf(SimpleTypeSerializerSnapshot.class)); }
@Override public void write(DataOutputView out) throws IOException { super.write(out); TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience(out, nestedSerializersAndConfigs); }
@Override public void write(DataOutputView out) throws IOException { super.write(out); TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience(out, nestedSerializersAndConfigs); }
@Override public void write(DataOutputView out) throws IOException { super.write(out); // write in a way to be fault tolerant of read failures when deserializing the key serializer TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Collections.singletonList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>(keySerializer, keySerializerConfigSnapshot))); // write individual registered keyed state metainfos out.writeShort(stateMetaInfoSnapshots.size()); for (RegisteredKeyedBackendStateMetaInfo.Snapshot<?, ?> metaInfo : stateMetaInfoSnapshots) { KeyedBackendStateMetaInfoSnapshotReaderWriters .getWriterForVersion(VERSION, metaInfo) .writeStateMetaInfo(out); } }
@Override protected void writeKeyAndNamespaceSerializers(DataOutputView out) throws IOException { // write key / namespace serializers, and their configuration snapshots TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( Tuple2.of(timersSnapshot.getKeySerializer(), timersSnapshot.getKeySerializerConfigSnapshot()), Tuple2.of(timersSnapshot.getNamespaceSerializer(), timersSnapshot.getNamespaceSerializerConfigSnapshot()))); } }
@Override protected void writeKeyAndNamespaceSerializers(DataOutputView out) throws IOException { // write key / namespace serializers, and their configuration snapshots TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( Tuple2.of(timersSnapshot.getKeySerializer(), timersSnapshot.getKeySerializerConfigSnapshot()), Tuple2.of(timersSnapshot.getNamespaceSerializer(), timersSnapshot.getNamespaceSerializerConfigSnapshot()))); } }
@Override public void write(DataOutputView out) throws IOException { super.write(out); // write the compression format used to write each key-group out.writeBoolean(usingKeyGroupCompression); // write in a way to be fault tolerant of read failures when deserializing the key serializer TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Collections.singletonList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>(keySerializer, keySerializerConfigSnapshot))); // write individual registered keyed state metainfos out.writeShort(stateMetaInfoSnapshots.size()); for (RegisteredKeyedBackendStateMetaInfo.Snapshot<?, ?> metaInfo : stateMetaInfoSnapshots) { KeyedBackendStateMetaInfoSnapshotReaderWriters .getWriterForVersion(VERSION, metaInfo) .writeStateMetaInfo(out); } }
@Override public void writeOperatorStateMetaInfo(DataOutputView out) throws IOException { out.writeUTF(stateMetaInfo.getName()); out.writeByte(stateMetaInfo.getAssignmentMode().ordinal()); // write in a way that allows us to be fault-tolerant and skip blocks in the case of java serialization failures TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Collections.singletonList(new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getPartitionStateSerializer(), stateMetaInfo.getPartitionStateSerializerConfigSnapshot()))); } }
@Override public void writeStateMetaInfo(DataOutputView out) throws IOException { out.writeUTF(stateMetaInfo.getName()); out.writeByte(stateMetaInfo.getAssignmentMode().ordinal()); // write in a way that allows us to be fault-tolerant and skip blocks in the case of java serialization failures TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Collections.singletonList(new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getPartitionStateSerializer(), stateMetaInfo.getPartitionStateSerializerConfigSnapshot()))); } }
@Override public void writeStateMetaInfo(DataOutputView out) throws IOException { out.writeInt(stateMetaInfo.getStateType().ordinal()); out.writeUTF(stateMetaInfo.getName()); // write in a way that allows us to be fault-tolerant and skip blocks in the case of java serialization failures TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getNamespaceSerializer(), stateMetaInfo.getNamespaceSerializerConfigSnapshot()), new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getStateSerializer(), stateMetaInfo.getStateSerializerConfigSnapshot()))); } }
@Override public void writeStateMetaInfo(DataOutputView out) throws IOException { out.writeInt(stateMetaInfo.getStateType().ordinal()); out.writeUTF(stateMetaInfo.getName()); // write in a way that allows us to be fault-tolerant and skip blocks in the case of java serialization failures TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getNamespaceSerializer(), stateMetaInfo.getNamespaceSerializerConfigSnapshot()), new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfo.getStateSerializer(), stateMetaInfo.getStateSerializerConfigSnapshot()))); } }
private void writeStateMetaInfoSnapshot(DataOutputView out, List<StateMetaInfoSnapshot> stateMetaInfoSnapshots, boolean isKeyedState) throws IOException { out.writeShort(stateMetaInfoSnapshots.size()); for (StateMetaInfoSnapshot stateMetaInfoSnapshot : stateMetaInfoSnapshots) { out.writeInt(stateMetaInfoSnapshot.getStateType().ordinal()); out.writeUTF(stateMetaInfoSnapshot.getName()); if (isKeyedState) { TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfoSnapshot.getKeySerializer(), stateMetaInfoSnapshot.getKeySerializerConfigSnapshot()), new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfoSnapshot.getValueSerializer(), stateMetaInfoSnapshot.getValueSerializerConfigSnapshot()))); } else { TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfoSnapshot.getKeySerializer(), stateMetaInfoSnapshot.getKeySerializerConfigSnapshot()), new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfoSnapshot.getValueSerializer(), stateMetaInfoSnapshot.getValueSerializerConfigSnapshot()), new Tuple2<TypeSerializer<?>, TypeSerializerConfigSnapshot>( stateMetaInfoSnapshot.getNamespaceSerializer(), stateMetaInfoSnapshot.getNamespaceSerializerConfigSnapshot()))); } } }
@Override public void writeBroadcastStateMetaInfo(final DataOutputView out) throws IOException { out.writeUTF(broadcastStateMetaInfo.getName()); out.writeByte(broadcastStateMetaInfo.getAssignmentMode().ordinal()); // write in a way that allows us to be fault-tolerant and skip blocks in the case of java serialization failures TypeSerializerSerializationUtil.writeSerializersAndConfigsWithResilience( out, Arrays.asList( Tuple2.of( broadcastStateMetaInfo.getKeySerializer(), broadcastStateMetaInfo.getKeySerializerConfigSnapshot() ), Tuple2.of( broadcastStateMetaInfo.getValueSerializer(), broadcastStateMetaInfo.getValueSerializerConfigSnapshot() ) ) ); } }