[ 
https://issues.apache.org/jira/browse/IGNITE-21924?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Roman Puchkovskiy updated IGNITE-21924:
---------------------------------------
    Labels: ignite-3 storage-threading threading  (was: ignite-3 threading)

> Improve user threads handling
> -----------------------------
>
>                 Key: IGNITE-21924
>                 URL: https://issues.apache.org/jira/browse/IGNITE-21924
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Roman Puchkovskiy
>            Assignee: Roman Puchkovskiy
>            Priority: Major
>              Labels: ignite-3, storage-threading, threading
>             Fix For: 3.0.0-beta2
>
>
> Now, some Ignite threads are marked with ThreadAttributes, but some are not. 
> ThreadAttributes contain the set of operations (like storage read, storage 
> write, blocking on a lock, etc) a thread is allowed to do. If an attribute 
> marked with these attributes tries to execute an operation, we know what to 
> do: if it's not allowed to, we throw a thread assertion (if they are enabled).
> Also, in ReplicaManager there is a stage where we either let the thread to 
> proceed execution (and potentially touch a storage), or we resubmit it to a 
> thread that is guaranteed to be allowed to touch storages. We need to make a 
> decision on whether we need to resubmit or not.
> Threads that do not implement ThreadAttributes are:
>  # Ignite threads which were not 'marked'
>  # User threads
>  # JRE threads (like the common fork join pool threads and delayerthread) to 
> which the execution might be switched accidentally (due to a bug in Ignite)
> If a storage operation is executed in a non-marked Ignite thread or in a JRE 
> thread, this is an indication of a bug. But for user threads, *currently* 
> either allow anything, or treat them as 'they are not allowed anything', 
> having to use the ugly technique of whitelisting the threads.
> This has to be sorted out.
> With the user threads, the situation should be treated in a more complex way:
>  * If the user entered our public API via a sync operation, such a thread 
> must be allowed to do anything
>  * If the entry point is an async operation, such a thread should NOT be 
> allowed to touch the storage (as a storage operation might take block on 
> taking locks, and it's not a correct thing to block a user thread if the 
> operation is async)
> In this way, we will always know what to do with a thread trying to touch the 
> storage:
>  # If it is marked with ThreadAttributes, consult the allowed operations, and 
> if the operation is not allowed, throw an assertion
>  # If it's not marked, but its thread-local SyncOperation flag is raised, 
> it's allowed anything
>  # Otherwise, we throw an assertion (as it's either a not-marked Ignite 
> thread [should be marked], or it's a JRE thread [we should not allow it to 
> touch the storages], or it's a user's thread which executes an async 
> operation [should not touch the storages])
> Also, the criterion for resubmitting in ReplicaManager is: (is 
> ThreadAttributes and there is no permission to touch storages) OR 
> (!ThreadAttributes AND it's a user's AsyncOperation thread). This will result 
> in resubmitting for getAsync (and its varieties) and for the cases when we 
> come from a Metastorage thread.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to