DSF ID Loader
To be Reviewed By: October 8, 2021
Authors: Jens Deppe
Status: Draft | Discussion | Active | Dropped | Superseded
...
To use DSFIDs, a class needs to register itself so that it is known by the serialization framework. Many core classes register in DSFIDFactory
. The modules, mentioned before, register during their service loader discovery and initialization phase. Under some situations, however, Geode will require knowledge of the DSFID very early on during member startup. If a member receives a message with an unknown DSFID it will throw a DSFIDNotFoundException
. Without introducing module circular dependencies, there is no way for a module to register its required DSFIDs early enough to avoid this issue.
Anti-Goals
N/ANone identified.
Solution
The proposed solution includes introducing a Service Loader interface - DSFIDLoader
- which will allow DSFIDs to be automatically discovered and will be initialized as part of the static class initialization already existing in InternalDataSerializer
.has 2 parts:
Currently, the DSFIDSerializer
interface exposes a registerDSFID(int dsfid, Class<?> dsfidClass)
method. This method will be moved into a new interface ( DataSerializerFixedIdRegistrant
) and DSFIDSerialzer
will extend this interface:
Code Block | ||||
---|---|---|---|---|
| ||||
interface DataSerializeableFixedIdRegistry {
register(int id, Class<? extends DataSerializableFixedId> clazz);
} |
This will reduce the API surface area required by the following new service provider interface which would perform the actual Fixed Id registration:
Code Block | ||||
---|---|---|---|---|
| ||||
public interface DSFIDLoaderDataSerializeableFixedIdRegistrant { void registerDSFIDsregister(DSFIDSerializerDataSerializableFixedIdRegistry serializerregistry); } |
This SPI will be initialized as part of the static class initialization already existing in InternalDataSerializer
.
In order to use this, a module will need to:
- Include a provider configuration resource file:
resources/META-INF/services/org.apache.geode.internal.serialization.DataSerializabledFixedIdRegistrant
- This file will contain one or more fully qualified class names which implement the above interface
The result will be that DSFIDs will be registered and available when the core serialization framework is instantiated.
Error Conditions
Currently, an IllegalArgumentException
is thrown, during registration, if the given class does not have a zero-argument constructor. This should be expanded to also produce an IllegalArgumentException
if a registration is attempted for a previously registered ID will be added to the geode-serialization
module.
Changes and Additions to Public Interfaces
...
No backwards compatibility impact.
Prior Art
N/A
FAQ
Answers to questions you’ve commonly been asked after requesting comments for this proposalNone yet.
Errata
What are minor adjustments that had to be made to the proposal since it was approved?None yet.