alievmirza commented on a change in pull request #724:
URL: https://github.com/apache/ignite-3/pull/724#discussion_r829873279



##########
File path: 
modules/core/src/main/java/org/apache/ignite/internal/causality/README.md
##########
@@ -0,0 +1,28 @@
+This package contains classes that are used for implementation of 
functionality based on causality tokens.
+
+### The purpose
+
+Every component registers configuration update listeners while starting. These 
listeners receive notifications during the further lifetime of the node, and 
also during the [recovery](TODO link to recovery readme) process while 
retrieving notifications from Metastorage. The details of the component start 
described 
[here](../../../../../../../../../runner/README.md#node-components-startup). 
While handling the notifications, listeners should rely on the fact that the 
components that they depend on, won’t return stale or inconsistent data, 
regardless of the order in which these listeners will be called. It should be 
guaranteed by the causality tokens mechanism.

Review comment:
       lets add todo with the ticket 

##########
File path: 
modules/core/src/main/java/org/apache/ignite/internal/causality/README.md
##########
@@ -0,0 +1,28 @@
+This package contains classes that are used for implementation of 
functionality based on causality tokens.
+
+### The purpose
+
+Every component registers configuration update listeners while starting. These 
listeners receive notifications during the further lifetime of the node, and 
also during the [recovery](TODO link to recovery readme) process while 
retrieving notifications from Metastorage. The details of the component start 
described 
[here](../../../../../../../../../runner/README.md#node-components-startup). 
While handling the notifications, listeners should rely on the fact that the 
components that they depend on, won’t return stale or inconsistent data, 
regardless of the order in which these listeners will be called. It should be 
guaranteed by the causality tokens mechanism.
+
+### Causality tokens
+
+Cluster-wide events, such as, for example, configuration changes or 
Metastorage updates, trigger notifications that are propagated to the nodes and 
therefore, to components. Every event can trigger one or several notifications. 
Every notification has a causality token. Notifications triggered by the same 
event have the same causality token. Metastorage updates are bound with updates 
of revision, see [Reliable watch 
processing](../../../../../../../../../runner/README.md#reliable-watch-processing).
 
+It is guaranteed that the last notification produced with a certain causality 
token, will be a notification about a storage revision update.
+
+Components’ listeners that process these notifications, can be called in any 
order. So there may be a situation when a listener registered in component A 
tries to call component B, but component B is not ready because its listeners 
haven’t received a corresponding notification yet. The listener of component A 
needs to make sure that component B is in a consistent up-to-date state, so it 
needs to await this state, and then continue the execution of a code dependent 
on component B. It is achieved by including a causality token to a call to 
component B. The token should be taken from notification. The call to component 
B now returns a future. This future is completed when component B receives 
notifications that have a causality token in the context of which the future 
was created. After completion of this future, the listener in component A can 
continue working – of course, it should happen asynchronously.
+
+More formally, one can make a call for a component using a causality token and 
receive a future, that will be completed when this component handles 
notification about a storage revision update having the given causality token. 
The result of this future should be guaranteed to be consistent regarding the 
given token. This guarantees that notifications will be handled by component 
listeners in the proper order.
+
+It is also worth mentioning that local events should also be produced within 
the context of an appropriate causality token.
+
+To simplify the implementation of this pattern, the concept of 
`VersionedValue` was introduced.
+
+### Versioned value
+
+Versioned value is some value that can be associated with a causality token. 
Typically, a field of a component that is supposed to be changed according to 
configuration changes, should be represented as 
`org.apache.ignite.internal.causality.VersionedValue` of needed type. Versioned 
value stores multiple versions of actual values, each for a certain causality 
token, i.e. a history of this value. Default history size is 2, but if the 
value didn’t change within a row of serial tokens, it is counted as one version 
for the history.

Review comment:
       ```suggestion
   Versioned value is some value that can be associated with a causality token. 
Typically, a field of a component that is supposed to be changed according to 
configuration changes, should be represented as 
`org.apache.ignite.internal.causality.VersionedValue` of needed type. Versioned 
value stores multiple versions of actual values, each for a certain causality 
token, i.e. a history of this value. The default history size is 2, but if the 
value hasn't been changed within a row of serial tokens, it is counted as one 
version for the history.
   ```

##########
File path: 
modules/core/src/main/java/org/apache/ignite/internal/causality/README.md
##########
@@ -0,0 +1,28 @@
+This package contains classes that are used for implementation of 
functionality based on causality tokens.
+
+### The purpose
+
+Every component registers configuration update listeners while starting. These 
listeners receive notifications during the further lifetime of the node, and 
also during the [recovery](TODO link to recovery readme) process while 
retrieving notifications from Metastorage. The details of the component start 
described 
[here](../../../../../../../../../runner/README.md#node-components-startup). 
While handling the notifications, listeners should rely on the fact that the 
components that they depend on, won’t return stale or inconsistent data, 
regardless of the order in which these listeners will be called. It should be 
guaranteed by the causality tokens mechanism.
+
+### Causality tokens
+
+Cluster-wide events, such as, for example, configuration changes or 
Metastorage updates, trigger notifications that are propagated to the nodes and 
therefore, to components. Every event can trigger one or several notifications. 
Every notification has a causality token. Notifications triggered by the same 
event have the same causality token. Metastorage updates are bound with updates 
of revision, see [Reliable watch 
processing](../../../../../../../../../runner/README.md#reliable-watch-processing).
 
+It is guaranteed that the last notification produced with a certain causality 
token, will be a notification about a storage revision update.
+
+Components’ listeners that process these notifications, can be called in any 
order. So there may be a situation when a listener registered in component A 
tries to call component B, but component B is not ready because its listeners 
haven’t received a corresponding notification yet. The listener of component A 
needs to make sure that component B is in a consistent up-to-date state, so it 
needs to await this state, and then continue the execution of a code dependent 
on component B. It is achieved by including a causality token to a call to 
component B. The token should be taken from notification. The call to component 
B now returns a future. This future is completed when component B receives 
notifications that have a causality token in the context of which the future 
was created. After completion of this future, the listener in component A can 
continue working – of course, it should happen asynchronously.
+
+More formally, one can make a call for a component using a causality token and 
receive a future, that will be completed when this component handles 
notification about a storage revision update having the given causality token. 
The result of this future should be guaranteed to be consistent regarding the 
given token. This guarantees that notifications will be handled by component 
listeners in the proper order.
+
+It is also worth mentioning that local events should also be produced within 
the context of an appropriate causality token.
+
+To simplify the implementation of this pattern, the concept of 
`VersionedValue` was introduced.
+
+### Versioned value
+
+Versioned value is some value that can be associated with a causality token. 
Typically, a field of a component that is supposed to be changed according to 
configuration changes, should be represented as 
`org.apache.ignite.internal.causality.VersionedValue` of needed type. Versioned 
value stores multiple versions of actual values, each for a certain causality 
token, i.e. a history of this value. Default history size is 2, but if the 
value didn’t change within a row of serial tokens, it is counted as one version 
for the history.
+
+Aforementioned futures, created for some causality token, are returned from 
`#get(long causalityToken)` method of `VersionedValue`.
+
+New version of a value, associated with causality token, can be set either 
explicitly via `#set` method, or an update of storage revision. The storage 
revision updater is set in the constructor. If the value didn't change when the 
storage revision update happens (neither `#set` nor `#update` methods were 
called), it means that the previous value becomes associated with the new 
token. When a value becomes associated with a token, a future created for this 
token completes.
+
+Versioned value can be also changed multiple times within one causality token, 
but these changes are not saved to history and don’t complete the futures. It 
should be used for processing multiple notifications having the same causality 
token. For details, see javadoc for `#update` method.

Review comment:
       ```suggestion
   Versioned value can be also changed multiple times within one causality 
token, but these changes are not saved to the history and don’t complete the 
futures. It should be used for processing multiple notifications having the 
same causality token. For details, see javadoc for `#update` method.
   ```

##########
File path: 
modules/core/src/main/java/org/apache/ignite/internal/causality/README.md
##########
@@ -0,0 +1,28 @@
+This package contains classes that are used for implementation of 
functionality based on causality tokens.
+
+### The purpose
+
+Every component registers configuration update listeners while starting. These 
listeners receive notifications during the further lifetime of the node, and 
also during the [recovery](TODO link to recovery readme) process while 
retrieving notifications from Metastorage. The details of the component start 
described 
[here](../../../../../../../../../runner/README.md#node-components-startup). 
While handling the notifications, listeners should rely on the fact that the 
components that they depend on, won’t return stale or inconsistent data, 
regardless of the order in which these listeners will be called. It should be 
guaranteed by the causality tokens mechanism.
+
+### Causality tokens
+
+Cluster-wide events, such as, for example, configuration changes or 
Metastorage updates, trigger notifications that are propagated to the nodes and 
therefore, to components. Every event can trigger one or several notifications. 
Every notification has a causality token. Notifications triggered by the same 
event have the same causality token. Metastorage updates are bound with updates 
of revision, see [Reliable watch 
processing](../../../../../../../../../runner/README.md#reliable-watch-processing).
 
+It is guaranteed that the last notification produced with a certain causality 
token, will be a notification about a storage revision update.
+
+Components’ listeners that process these notifications, can be called in any 
order. So there may be a situation when a listener registered in component A 
tries to call component B, but component B is not ready because its listeners 
haven’t received a corresponding notification yet. The listener of component A 
needs to make sure that component B is in a consistent up-to-date state, so it 
needs to await this state, and then continue the execution of a code dependent 
on component B. It is achieved by including a causality token to a call to 
component B. The token should be taken from notification. The call to component 
B now returns a future. This future is completed when component B receives 
notifications that have a causality token in the context of which the future 
was created. After completion of this future, the listener in component A can 
continue working – of course, it should happen asynchronously.
+
+More formally, one can make a call for a component using a causality token and 
receive a future, that will be completed when this component handles 
notification about a storage revision update having the given causality token. 
The result of this future should be guaranteed to be consistent regarding the 
given token. This guarantees that notifications will be handled by component 
listeners in the proper order.
+
+It is also worth mentioning that local events should also be produced within 
the context of an appropriate causality token.
+
+To simplify the implementation of this pattern, the concept of 
`VersionedValue` was introduced.
+
+### Versioned value
+
+Versioned value is some value that can be associated with a causality token. 
Typically, a field of a component that is supposed to be changed according to 
configuration changes, should be represented as 
`org.apache.ignite.internal.causality.VersionedValue` of needed type. Versioned 
value stores multiple versions of actual values, each for a certain causality 
token, i.e. a history of this value. Default history size is 2, but if the 
value didn’t change within a row of serial tokens, it is counted as one version 
for the history.
+
+Aforementioned futures, created for some causality token, are returned from 
`#get(long causalityToken)` method of `VersionedValue`.
+
+New version of a value, associated with causality token, can be set either 
explicitly via `#set` method, or an update of storage revision. The storage 
revision updater is set in the constructor. If the value didn't change when the 
storage revision update happens (neither `#set` nor `#update` methods were 
called), it means that the previous value becomes associated with the new 
token. When a value becomes associated with a token, a future created for this 
token completes.

Review comment:
       ```suggestion
   New version of a value, associated with causality token, can be set either 
explicitly via `#set` method, or via update of a storage revision. The storage 
revision updater is set in the constructor. If the value hasn't been changed 
when the storage revision update happens (neither `#set` nor `#update` methods 
were called), it means that the previous value becomes associated with the new 
token. When a value becomes associated with a token, a future created for this 
token completes.
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to