Skip to content

Commit 15cc07b

Browse files
committed
Fix empty list engine result when etcd is used as the service registry
1 parent 5d04c9b commit 15cc07b

File tree

5 files changed

+30
-1
lines changed

5 files changed

+30
-1
lines changed

kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/DiscoveryClient.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ trait DiscoveryClient extends Logging {
6666
*/
6767
def pathNonExists(path: String): Boolean
6868

69+
def pathNonExists(path: String, isPrefix: Boolean): Boolean
6970
/**
7071
* Delete a path.
7172
* @param path the path to be deleted

kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/etcd/EtcdDiscoveryClient.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ class EtcdDiscoveryClient(conf: KyuubiConf) extends DiscoveryClient {
151151
kvClient.get(ByteSequence.from(path.getBytes())).get().getKvs.isEmpty
152152
}
153153

154+
override def pathNonExists(path: String, isPrefix: Boolean): Boolean = {
155+
kvClient.get(
156+
ByteSequence.from(path.getBytes()),
157+
GetOption.newBuilder().isPrefix(isPrefix).build()).get().getKvs.isEmpty
158+
}
159+
154160
override def delete(path: String, deleteChildren: Boolean = false): Unit = {
155161
kvClient.delete(
156162
ByteSequence.from(path.getBytes()),

kyuubi-ha/src/main/scala/org/apache/kyuubi/ha/client/zookeeper/ZookeeperDiscoveryClient.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class ZookeeperDiscoveryClient(conf: KyuubiConf) extends DiscoveryClient {
9090
zkClient.checkExists().forPath(path) == null
9191
}
9292

93+
override def pathNonExists(path: String, isPrefix: Boolean): Boolean = {
94+
zkClient.checkExists().forPath(path) == null
95+
}
96+
9397
override def delete(path: String, deleteChildren: Boolean = false): Unit = {
9498
if (deleteChildren) {
9599
zkClient.delete().deletingChildrenIfNeeded().forPath(path)

kyuubi-ha/src/test/scala/org/apache/kyuubi/ha/client/etcd/EtcdDiscoveryClientSuite.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,22 @@ class EtcdDiscoveryClientSuite extends DiscoveryClientTests {
9292
assert(!discoveryClient.pathExists(path))
9393
}
9494
}
95+
96+
test("etcd test: set, get with path prefix and delete") {
97+
withDiscoveryClient(conf) { discoveryClient =>
98+
val path = "/kyuubi_version_USER_SPARK_SQL/test/default"
99+
val pathPrefix = "/kyuubi_version_USER_SPARK_SQL/test"
100+
// set
101+
discoveryClient.create(path, "PERSISTENT")
102+
assert(discoveryClient.pathExists(path))
103+
assert(!discoveryClient.pathNonExists(pathPrefix, isPrefix = true))
104+
105+
// get
106+
assert(new String(discoveryClient.getData(path), StandardCharsets.UTF_8) == path)
107+
108+
// delete
109+
discoveryClient.delete(path)
110+
assert(!discoveryClient.pathExists(path))
111+
}
112+
}
95113
}

kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/AdminResource.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ private[v1] class AdminResource extends ApiRequestContext with Logging {
349349
case Some(_) =>
350350
info(s"Listing engine nodes under $engineSpace")
351351
engineNodes ++= discoveryClient.getServiceNodesInfo(engineSpace)
352-
case None if discoveryClient.pathNonExists(engineSpace) =>
352+
case None if discoveryClient.pathNonExists(engineSpace, isPrefix = true) =>
353353
warn(s"Path $engineSpace does not exist. user: $userName, engine type: $engineType, " +
354354
s"share level: $shareLevel, subdomain: $subdomain")
355355
case None =>

0 commit comments

Comments
 (0)