This is an automated email from the ASF dual-hosted git repository.
ayushtkn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 5e54c134531 HIVE-30099: Add support for Hive variables in Persistable
Sessions (#6828)
5e54c134531 is described below
commit 5e54c134531881bfcd3973f971db9afef02ecbdd
Author: Tanishq Chugh <[email protected]>
AuthorDate: Sat Oct 3 00:10:50 2026 +0530
HIVE-30099: Add support for Hive variables in Persistable Sessions (#6828)
---
.../cli/session/store/HiveSessionSnapshot.java | 16 ++++++++++-
.../session/store/TestSessionStateStoreBase.java | 8 ++++++
.../hive/service/cli/session/HiveSessionImpl.java | 9 +++++-
.../cli/session/PersistableSessionUtils.java | 11 ++++++--
.../cli/session/TestPersistableSessionUtils.java | 33 ++++++++++++++++++++++
5 files changed, 73 insertions(+), 4 deletions(-)
diff --git
a/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
b/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
index 8c10772cd78..d52592fa635 100644
---
a/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
+++
b/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
@@ -34,6 +34,7 @@ public class HiveSessionSnapshot {
private final String ipAddress;
private final String currentDatabase;
private final Map<String, String> overriddenConfigurations;
+ private final Map<String, String> hiveVariables;
private final List<String> addedJars;
private final List<String> addedFiles;
private final Map<String, String> tempTableDefinitions;
@@ -50,6 +51,7 @@ public HiveSessionSnapshot(
@JsonProperty("ipAddress") String ipAddress,
@JsonProperty("currentDatabase") String currentDatabase,
@JsonProperty("overriddenConfigurations") Map<String, String>
overriddenConfigurations,
+ @JsonProperty("hiveVariables") Map<String, String> hiveVariables,
@JsonProperty("addedJars") List<String> addedJars,
@JsonProperty("addedFiles") List<String> addedFiles,
@JsonProperty("tempTableDefinitions") Map<String, String>
tempTableDefinitions,
@@ -64,6 +66,7 @@ public HiveSessionSnapshot(
this.currentDatabase = currentDatabase;
this.overriddenConfigurations = overriddenConfigurations != null
? new HashMap<>(overriddenConfigurations) : Collections.emptyMap();
+ this.hiveVariables = hiveVariables != null ? new HashMap<>(hiveVariables)
: Collections.emptyMap();
this.addedJars = addedJars != null ? new ArrayList<>(addedJars) :
Collections.emptyList();
this.addedFiles = addedFiles != null ? new ArrayList<>(addedFiles) :
Collections.emptyList();
this.tempTableDefinitions = tempTableDefinitions != null
@@ -102,6 +105,11 @@ public Map<String, String> getOverriddenConfigurations() {
return overriddenConfigurations;
}
+ @JsonProperty("hiveVariables")
+ public Map<String, String> getHiveVariables() {
+ return hiveVariables;
+ }
+
@JsonProperty("addedJars")
public List<String> getAddedJars() {
return addedJars;
@@ -152,6 +160,7 @@ public static class Builder {
private String ipAddress;
private String currentDatabase;
private Map<String, String> overriddenConfigurations;
+ private Map<String, String> hiveVariables;
private List<String> addedJars;
private List<String> addedFiles;
private Map<String, String> tempTableDefinitions;
@@ -186,6 +195,11 @@ public Builder overriddenConfigurations(Map<String,
String> overriddenConfigurat
return this;
}
+ public Builder hiveVariables(Map<String, String> hiveVariables) {
+ this.hiveVariables = hiveVariables;
+ return this;
+ }
+
public Builder addedJars(List<String> addedJars) {
this.addedJars = addedJars;
return this;
@@ -229,7 +243,7 @@ public Builder lastAccessTime(long lastAccessTime) {
public HiveSessionSnapshot build() {
return new HiveSessionSnapshot(sessionHandleId, username, ipAddress,
currentDatabase,
- overriddenConfigurations, addedJars, addedFiles,
tempTableDefinitions,
+ overriddenConfigurations, hiveVariables, addedJars, addedFiles,
tempTableDefinitions,
tempTablePartitionDefinitions, tempFunctionDefinitions,
protocolVersion, creationTime,
lastAccessTime);
}
diff --git
a/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
b/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
index 4268d770cbc..196c8507ffa 100644
---
a/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
+++
b/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
@@ -65,6 +65,9 @@ public void testSaveAndGetSnapshot() {
assertEquals(2, retrieved.getOverriddenConfigurations().size());
assertEquals("true",
retrieved.getOverriddenConfigurations().get("hive.exec.dynamic.partition"));
assertEquals("nonstrict",
retrieved.getOverriddenConfigurations().get("hive.exec.dynamic.partition.mode"));
+ assertEquals(2, retrieved.getHiveVariables().size());
+ assertEquals("test_value_A",
retrieved.getHiveVariables().get("test_var_A"));
+ assertEquals("test_value_B",
retrieved.getHiveVariables().get("test_var_B"));
assertEquals(2, retrieved.getAddedJars().size());
assertEquals("hdfs:///user/hive/udfs/my-udf.jar",
retrieved.getAddedJars().get(0));
assertEquals(2, retrieved.getAddedFiles().size());
@@ -163,12 +166,17 @@ protected HiveSessionSnapshot createTestSnapshot(String
sessionId, String userna
Map<String, String> tempTables = new HashMap<>();
tempTables.put("tmp_t", "CREATE TEMPORARY TABLE tmp_t (col1 STRING, col2
INT)");
+ Map<String, String> hiveVariables = new HashMap<>();
+ hiveVariables.put("test_var_A", "test_value_A");
+ hiveVariables.put("test_var_B", "test_value_B");
+
return HiveSessionSnapshot.builder()
.sessionHandleId(sessionId)
.username(username)
.ipAddress("127.0.0.1")
.currentDatabase(database)
.overriddenConfigurations(configs)
+ .hiveVariables(hiveVariables)
.addedJars(Arrays.asList("hdfs:///user/hive/udfs/my-udf.jar",
"hdfs:///user/hive/udfs/other.jar"))
.addedFiles(Arrays.asList("hdfs:///user/hive/files/data.csv",
"/tmp/local_file.txt"))
.tempTableDefinitions(tempTables)
diff --git
a/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
b/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
index 3a5ab4c2d4d..65405df7647 100644
--- a/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
+++ b/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
@@ -31,6 +31,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
@@ -1055,9 +1056,15 @@ public OperationHandle getCrossReference(String
primaryCatalog,
@Override
public void setApplicationName(String value) {
String oldName = sessionState.getHiveVariables().put("wmapp", value);
- if (oldName != null && !oldName.equals(value)) {
+ if (Objects.equals(oldName, value)) {
+ return;
+ }
+ if (oldName != null) {
LOG.info("ApplicationName changed from " + oldName + " to " + value);
}
+ if (sessionManager != null &&
sessionManager.isPersistableSessionsEnabled()) {
+ sessionManager.notifySessionStateChanged(sessionHandle);
+ }
}
diff --git
a/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
b/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
index dbdb21f394b..fae2d4ddfe9 100644
---
a/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
+++
b/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
@@ -92,7 +92,7 @@ private PersistableSessionUtils() {
/**
* Determines whether a SQL statement changes session state that should
- * be persisted (database, configs, JARs, temp tables, temp functions).
+ * be persisted (database, configs, hive variables, JARs, temp tables, temp
functions).
*/
public static boolean isStateChangingCommand(String statement) {
if (statement == null) {
@@ -210,6 +210,8 @@ public static HiveSessionSnapshot
captureSnapshot(SessionHandle sessionHandle, S
.currentDatabase(sessionState != null ?
sessionState.getCurrentDatabase() : null)
.overriddenConfigurations(sessionState != null
? new HashMap<>(sessionState.getOverriddenConfigurations()) : null)
+ .hiveVariables(sessionState != null
+ ? new HashMap<>(sessionState.getHiveVariables()) : null)
.addedJars(jars)
.addedFiles(files)
.tempTableDefinitions(tempTableDefs)
@@ -313,7 +315,7 @@ static List<String> captureTempFunctions(SessionState
sessionState) {
/**
* Hydrates a recovered session from a snapshot: restores database, configs,
- * JARs, files, temp functions, and temp tables.
+ * hive variables, JARs, files, temp functions, and temp tables.
*/
public static void hydrateSession(HiveSession session, HiveSessionSnapshot
snapshot)
throws HiveSQLException {
@@ -328,6 +330,11 @@ public static void hydrateSession(HiveSession session,
HiveSessionSnapshot snaps
sessionState.getOverriddenConfigurations().put(entry.getKey(),
entry.getValue());
}
}
+ if (snapshot.getHiveVariables() != null) {
+ for (Map.Entry<String, String> entry :
snapshot.getHiveVariables().entrySet()) {
+ sessionState.getHiveVariables().put(entry.getKey(),
entry.getValue());
+ }
+ }
if (snapshot.getAddedJars() != null) {
for (String jar : snapshot.getAddedJars()) {
sessionState.add_resource(SessionState.ResourceType.JAR, jar);
diff --git
a/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
b/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
index 4d13ab8d038..89d8da3da0e 100644
---
a/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
+++
b/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
@@ -18,15 +18,24 @@
package org.apache.hive.service.cli.session;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.VariableSubstitution;
import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.session.SessionState;
+import org.apache.hive.service.cli.SessionHandle;
+import org.apache.hive.service.cli.session.store.HiveSessionSnapshot;
+import org.apache.hive.service.rpc.thrift.TProtocolVersion;
import org.junit.Before;
import org.junit.Test;
@@ -71,4 +80,28 @@ public void
testShouldPersistSnapshotForStateChangingCommands() {
"CREATE TEMPORARY TABLE tmp (id INT)", sessionState));
assertFalse(PersistableSessionUtils.shouldPersistSnapshot("SELECT 1",
sessionState));
}
+
+ @Test
+ public void testHiveVariablesSnapshotJsonRoundTrip() throws Exception {
+ SessionState source = new SessionState(new HiveConf());
+ source.getHiveVariables().put("hive_var", "hive_value");
+
+ HiveSessionSnapshot snapshot = PersistableSessionUtils.captureSnapshot(
+ new SessionHandle(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V11),
+ "hive", "127.0.0.1", source,
TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V11, 0, 0);
+
+ ObjectMapper mapper = new ObjectMapper();
+ snapshot = mapper.readValue(mapper.writeValueAsString(snapshot),
HiveSessionSnapshot.class);
+
+ SessionState target = new SessionState(new HiveConf());
+ HiveSession session = mock(HiveSession.class);
+ when(session.getSessionState()).thenReturn(target);
+ when(session.getHiveConf()).thenReturn(target.getConf());
+ PersistableSessionUtils.hydrateSession(session, snapshot);
+
+ assertEquals("hive_value", target.getHiveVariables().get("hive_var"));
+ target.getConf().setBoolVar(HiveConf.ConfVars.HIVE_VARIABLE_SUBSTITUTE,
true);
+ assertEquals("hive_value", new
VariableSubstitution(target::getHiveVariables)
+ .substitute(target.getConf(), "${hivevar:hive_var}"));
+ }
}