[ 
https://issues.apache.org/jira/browse/THRIFT-2429?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13967671#comment-13967671
 ] 

Randy Abernethy commented on THRIFT-2429:
-----------------------------------------

Hey Ben,

Thanks for the ongoing thoughtful discussion. Great to vet all this stuff. You 
make a good point on the semantic front and I agree. Optionality is an 
important semantic. 

The issue at hand, "providing the option to not write default values", is 
mechanical in nature and the optimization comment was directed at that level. I 
often try to think about interfaces in three orthogonal vectors, this may help 
frame our discussion around this issue:

* Mechanical - what's going to be serialized and how
* Semantic - how the interface maps to my domain constructs/concepts today
* Evolution – how will changes affect the interface (this is tied to mechanics 
but is useful to consider separately I find)

Thrift IDL defines all three of these vectors. Relative to THRIFT-2429 and 
considering the field:

bq.        1:  optional i32 x = 10

*On the mechanical front:*
Presently Thrift sets x to 10 (possible overwritten with another value by the 
writer) and then x is serialized. THRIFT-2429 suggested that if x is 10 at 
serialization time it will not be serialized. You can unset the field today to 
avoid transmission so THRIFT-2429 only adds the convenience of implicitly 
unsetting the value if it holds the default. [Default values are unsafe if 
changed over time (true independent of THRIFT-2429, though more true with 
THRIFT-2429) with the exception of required field defaults. It is safe to 
change the default of a required field because required fields are always 
present in any version of the interface and always transmit their defaults, 
making default values the one aspect you can evolve in a required field.] 

*On the semantic front:*
In our example some may interpret x semantically as an element of the interface 
with optionality. This would be a mistake. Adding a default value to an 
optional field changes the semantic. How can you have a default for something 
with optionality? Default implies a value is always present. If the writer sets 
x the reader will see the set value but if the writer unsets x, (regardless of 
THRIFT-2429) x will be received with the default value by the reader. The 
semantic of an optional field with a default value today (regardless of 
THRIFT-2429) is the same as that of a normal field. The difference is not 
semantic, it is mechanical, the writer of an optional field with a default 
value can unset the field, as a mechanical optimization, to not transmit it. A 
normal field with a default value provides no such ability. So it is the case 
today that "optional" imparts mechanical attributes to a field (that of 
selective transmission) and in the presence of default values, this is the 
exclusive feature attributed. "Optional semantics" are not imparted when 
default values are in play, the value will always be found by the reader). 
Default values have primacy over requiredness.

*On the evolution front:*
If the writer knows x and the reader doesn't we are fine. Readers ignore 
unknown fields (present or not present). If the reader knows x and the writer 
doesn't the reader will see the default value for x. This is the behavior we 
have now. If a field has a default value, the reader will always receive that 
field (whether it is in the stream or not). Default values have primacy over 
requiredness. This is the most significant feature to raise attention to in my 
estimation, but nothing new. 

To summarize from the writer's perspective, what we have today is:
* required - I will serialize this forever
* normal - I will serialize this as long as it is a part of my interface
* optional - I will serialize this if it is appropriate in the context of this 
call
* ----
* required/default - I will serialize this forever, the default simply 
initializes the writer's side
* normal/default - I will serialize this as long as it is a part of my 
interface and the reader will use the default when the value is not in the 
stream
* optional/default - I will serialize this if it is appropriate in the context 
of this call and the reader will use the default if a value is not found in the 
stream.

[Required and normal without a default can impair one's ability to evolve an 
interface.]

THRIFT-2429 currently proposes to change the definition of "appropriate" in the 
last bullet to elide the case where the value is equal to the default.

Thoughts?

Best,
Randy

> Provide option to not write default values, rely on receiver default 
> construction instead
> -----------------------------------------------------------------------------------------
>
>                 Key: THRIFT-2429
>                 URL: https://issues.apache.org/jira/browse/THRIFT-2429
>             Project: Thrift
>          Issue Type: Improvement
>          Components: C++ - Compiler
>    Affects Versions: 0.9.1
>            Reporter: Chris Stylianou
>            Assignee: Randy Abernethy
>              Labels: default, optional, required
>
> Would there be any objections to a patch that does not write default values 
> (essentially the same logic as the optional attributes). This obviously 
> relies on the receiving application using the same IDL version to ensure the 
> defaults used on object construction match the senders.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to