You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by jb...@apache.org on 2019/01/05 07:09:41 UTC
[geode] branch develop updated: GEODE-6011: Prevent synchronization
using strings and boolean (#2807)
This is an automated email from the ASF dual-hosted git repository.
jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new fcc61b6 GEODE-6011: Prevent synchronization using strings and boolean (#2807)
fcc61b6 is described below
commit fcc61b647f147fba409cd4c73de8271b7bc78c2f
Author: Nabarun Nag <na...@users.noreply.github.com>
AuthorDate: Fri Jan 4 23:09:30 2019 -0800
GEODE-6011: Prevent synchronization using strings and boolean (#2807)
* Locking is now achieved using reentrant locks as they are more fair than synchronization.
---
.../geode/modules/util/BootstrappingFunction.java | 7 ++++++-
.../org/apache/geode/internal/net/SocketCloser.java | 18 ++++++++++++++++--
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/BootstrappingFunction.java b/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/BootstrappingFunction.java
index bc399e3..4cc9c09 100644
--- a/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/BootstrappingFunction.java
+++ b/extensions/geode-modules/src/main/java/org/apache/geode/modules/util/BootstrappingFunction.java
@@ -21,6 +21,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.geode.DataSerializable;
import org.apache.geode.cache.Cache;
@@ -42,6 +43,7 @@ public class BootstrappingFunction implements Function, MembershipListener, Data
private static final long serialVersionUID = 1856043174458190605L;
public static final String ID = "bootstrapping-function";
+ private static final ReentrantLock registerFunctionLock = new ReentrantLock();
private static final int TIME_TO_WAIT_FOR_CACHE =
Integer.getInteger("gemfiremodules.timeToWaitForCache", 30000);
@@ -105,7 +107,8 @@ public class BootstrappingFunction implements Function, MembershipListener, Data
private void registerFunctions() {
// Synchronize so that these functions aren't registered twice. The
// constructor for the CreateRegionFunction creates a meta region.
- synchronized (ID) {
+ registerFunctionLock.lock();
+ try {
// Register the create region function if it is not already registered
if (!FunctionService.isRegistered(CreateRegionFunction.ID)) {
FunctionService.registerFunction(new CreateRegionFunction());
@@ -125,6 +128,8 @@ public class BootstrappingFunction implements Function, MembershipListener, Data
if (!FunctionService.isRegistered(RegionSizeFunction.ID)) {
FunctionService.registerFunction(new RegionSizeFunction());
}
+ } finally {
+ registerFunctionLock.unlock();
}
}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCloser.java b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCloser.java
index 53815ec..d33caba 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/net/SocketCloser.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/net/SocketCloser.java
@@ -22,6 +22,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.geode.SystemFailure;
import org.apache.geode.internal.logging.LoggingExecutors;
@@ -68,6 +69,13 @@ public class SocketCloser {
private final int asyncClosePoolMaxThreads;
private final long asyncCloseWaitTime;
private final TimeUnit asyncCloseWaitUnits;
+ /**
+ * Protect access to closed synchronizing with closedLock
+ */
+ private final ReentrantLock closedLock = new ReentrantLock();
+ /**
+ * Protect access to closed using synchronizing with closedLock
+ */
private boolean closed;
public SocketCloser() {
@@ -132,12 +140,15 @@ public class SocketCloser {
* called then the asyncClose will be done synchronously.
*/
public void close() {
- synchronized (this) {
+ closedLock.lock();
+ try {
if (!this.closed) {
this.closed = true;
} else {
return;
}
+ } finally {
+ closedLock.unlock();
}
for (ExecutorService executorService : asyncCloseExecutors.values()) {
executorService.shutdown();
@@ -167,7 +178,8 @@ public class SocketCloser {
boolean doItInline = false;
try {
Future submittedTask = null;
- synchronized (this) {
+ closedLock.lock();
+ try {
if (closed) {
// this SocketCloser has been closed so do a synchronous, inline, close
doItInline = true;
@@ -186,6 +198,8 @@ public class SocketCloser {
}
});
}
+ } finally {
+ closedLock.unlock();
}
if (submittedTask != null) {
waitForFutureTaskWithTimeout(submittedTask);