From 40f9b0c5c13f40921b6976589543a04efa489f93 Mon Sep 17 00:00:00 2001 From: Aaron Fabbri Date: Tue, 31 Jul 2018 15:21:38 -0700 Subject: [PATCH] HDFS-13322 fuse dfs - uid persists when switching between ticket caches. Contributed by Istvan Fajth. --- .../src/main/native/fuse-dfs/fuse_connect.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/fuse_connect.c b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/fuse_connect.c index 6ee4ad5130..f08917a53c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/fuse_connect.c +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/fuse-dfs/fuse_connect.c @@ -192,7 +192,7 @@ int fuseConnectInit(const char *nnUri, int port) } /** - * Compare two libhdfs connections by username + * Compare two libhdfs connections by username and Kerberos ticket cache path * * @param a The first libhdfs connection * @param b The second libhdfs connection @@ -201,22 +201,26 @@ int fuseConnectInit(const char *nnUri, int port) */ static int hdfsConnCompare(const struct hdfsConn *a, const struct hdfsConn *b) { - return strcmp(a->usrname, b->usrname); + int rc = strcmp(a->usrname, b->usrname); + if (rc) return rc; + return gHdfsAuthConf == AUTH_CONF_KERBEROS && strcmp(a->kpath, b->kpath); } /** * Find a libhdfs connection by username * * @param usrname The username to look up + * @param kpath The Kerberos ticket cache file path * * @return The connection, or NULL if none could be found */ -static struct hdfsConn* hdfsConnFind(const char *usrname) +static struct hdfsConn* hdfsConnFind(const char *usrname, const char *kpath) { struct hdfsConn exemplar; memset(&exemplar, 0, sizeof(exemplar)); exemplar.usrname = (char*)usrname; + exemplar.kpath = (char*)kpath; return RB_FIND(hdfsConnTree, &gConnTree, &exemplar); } @@ -542,8 +546,13 @@ static int fuseConnect(const char *usrname, struct fuse_context *ctx, int ret; struct hdfsConn* conn; + char kpath[PATH_MAX] = { 0 }; + if (gHdfsAuthConf == AUTH_CONF_KERBEROS) { + findKerbTicketCachePath(ctx, kpath, sizeof(kpath)); + } + pthread_mutex_lock(&gConnMutex); - conn = hdfsConnFind(usrname); + conn = hdfsConnFind(usrname, kpath); if (!conn) { ret = fuseNewConnect(usrname, ctx, &conn); if (ret) {