DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
| ID | IEP-126 |
| Author | |
| Sponsor | |
| Created | 10.09.2024 |
| Status | DRAFT |
When processing data, users want to have access to non-tabular (not stored in cache structures) data.
SecuritySubject can be used to provide fine-grained access control to cache data. For example, CacheInterceptor saves the subject id it along with data and it can be used for filtering.The requirements include:
QuerySqlFunction, CacheInterceptor) on all nodes participated in queries.Ignite does not have a such API:
ServiceCallContext helps solve similar problems, but has several limitations - available only by calls via the IgniteService API and cannot be used for primitive operations.UserAttributes - allows to set user attributes, but the attribute values are fixed for the entire lifetime of the connection.ClientListenerConnectionContext - it's available only on single node which directly accepts a client connection.Application context mechanism exists in Oracle [1] and it's widely used [6]. Support similar mechanisms (session variables) exist in multiple DBMS (e.g. SQLServer [8], Snowflake [7], MySQL [9]).
ApplicationContext is an entrypoint for accessing all non-tabular data.QuerySqlFunction are static, CacheInterceptor is a cache singleton).QuerySqlFunction to get access to the attribute from SQL if needed./** ApplicationContext interface. It's an entrypoint for all non-tabular data. */
public class ApplicationContext {
/** @return Application attributes set for current thread. */
public static @Nullable Map<String, String> getAttributes();
/** @return Current SecuritySubject. */
public static @Nullable SecuritySubject getSecuritySubject();
}
/** Example, use it in QuerySqlFunction. */
public static class UserDefinedFunctions {
/** @return Session ID set with application attributes. */
@QuerySqlFunction
public static @Nullable String sessionId() {
Map<String, String> appAttrs = ApplicationContext.getAttributes();
return appAttrs == null ? null : appAttr.get("SESSION_ID");
}
}
Ignite node.ClientBitmaskFeature protocol.// Example of usage.
try (IgniteClient cln = Ignition.startClient(clnCfg)) {
Map<String, String> appAttrs = F.asMap("SESSION_ID", "1234");
try (ClientTransaction tx = cln.transactions().withApplicationAttributes(appAttrs).txStart()) {
...
}
}
The standard jdbc protocol describes the methods Connection#setClientInfo, which allow changing the values of client attributes during the life of the connection [3]. Implementation features:
#setClientInfo is arbitrary. The documentation recommends strictly limiting the set of attributes, but this is not necessary. For example, Oracle does not have such a limitation [5]. The setClientInfo array is completely translated into the getClientAttributes array.setClientInfo are passed along with each JdbcRequest (this requires a new feature in JdbcThinFeature).// JDBC connection to Ignite server.
try (Connection conn = DriverManager.getConnection(URL)) {
conn.setClientInfo("SESSION_ID", "1234");
...
}
QueryStartRequest SQL message protocol (for jdbc, SQL transactions)CacheInterceptor), since inserts are not always performed on the request initiator node.// Describe project risks, such as API or binary compatibility issues, major protocol changes, etc.
// Links to discussions on the devlist, if applicable.
[4] https://torofimofu.blogspot.com/2014/05/oracle.html
[5] https://docs.oracle.com/database/121/JJDBC/jdbcvers.htm#BABDAEEC
[6] https://stackoverflow.com/search?tab=newest&q=SYS_CONTEXT
[7] https://docs.snowflake.com/en/sql-reference/session-variables#session-variable-functions
[9] https://dev.mysql.com/doc/refman/8.4/en/user-variables.html
// Links or report with relevant JIRA tickets.