From 2e4aec67daf2ee13e16facce265c232ed8f47301 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 23 May 2022 15:29:15 +0200 Subject: [PATCH] Replace synchronized usage with ReentrantLock Closes gh-702 --- .../authentication/LifecycleAwareSessionManager.java | 10 +++++++--- .../vault/authentication/SimpleSessionManager.java | 10 ++++++++-- .../vault/core/env/VaultPropertySource.java | 10 ++++++++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java index 64bf5371..3771d854 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java @@ -18,6 +18,7 @@ package org.springframework.vault.authentication; import java.time.Duration; import java.util.Map; import java.util.Optional; +import java.util.concurrent.locks.ReentrantLock; import org.springframework.beans.factory.DisposableBean; import org.springframework.http.HttpEntity; @@ -81,7 +82,7 @@ public class LifecycleAwareSessionManager extends LifecycleAwareSessionManagerSu */ private final RestOperations restOperations; - private final Object lock = new Object(); + private final ReentrantLock lock = new ReentrantLock(); /** * The token state: Contains the currently valid token that identifies the Vault @@ -254,12 +255,15 @@ public class LifecycleAwareSessionManager extends LifecycleAwareSessionManagerSu if (!getToken().isPresent()) { - synchronized (this.lock) { - + this.lock.lock(); + try { if (!getToken().isPresent()) { doGetSessionToken(); } } + finally { + this.lock.unlock(); + } } return getToken().map(TokenWrapper::getToken) diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/SimpleSessionManager.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/SimpleSessionManager.java index 601c9118..7f482a6e 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/SimpleSessionManager.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/SimpleSessionManager.java @@ -16,6 +16,7 @@ package org.springframework.vault.authentication; import java.util.Optional; +import java.util.concurrent.locks.ReentrantLock; import org.springframework.util.Assert; import org.springframework.vault.support.VaultToken; @@ -34,7 +35,7 @@ public class SimpleSessionManager implements SessionManager { private final ClientAuthentication clientAuthentication; - private final Object lock = new Object(); + private final ReentrantLock lock = new ReentrantLock(); private volatile Optional token = Optional.empty(); @@ -53,11 +54,16 @@ public class SimpleSessionManager implements SessionManager { public VaultToken getSessionToken() { if (!this.token.isPresent()) { - synchronized (this.lock) { + + this.lock.lock(); + try { if (!this.token.isPresent()) { this.token = Optional.of(this.clientAuthentication.login()); } } + finally { + this.lock.unlock(); + } } return this.token.orElseThrow(() -> new IllegalStateException("Cannot obtain VaultToken")); diff --git a/spring-vault-core/src/main/java/org/springframework/vault/core/env/VaultPropertySource.java b/spring-vault-core/src/main/java/org/springframework/vault/core/env/VaultPropertySource.java index 14c842a2..0a1d4744 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/core/env/VaultPropertySource.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/core/env/VaultPropertySource.java @@ -18,6 +18,7 @@ package org.springframework.vault.core.env; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -60,7 +61,7 @@ public class VaultPropertySource extends EnumerablePropertySource