Return-Path: X-Original-To: apmail-geode-commits-archive@minotaur.apache.org Delivered-To: apmail-geode-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D93F1189BD for ; Thu, 16 Jul 2015 17:32:41 +0000 (UTC) Received: (qmail 6601 invoked by uid 500); 16 Jul 2015 17:32:41 -0000 Delivered-To: apmail-geode-commits-archive@geode.apache.org Received: (qmail 6566 invoked by uid 500); 16 Jul 2015 17:32:41 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 6557 invoked by uid 99); 16 Jul 2015 17:32:41 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jul 2015 17:32:41 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 47976C0910 for ; Thu, 16 Jul 2015 17:32:41 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.771 X-Spam-Level: X-Spam-Status: No, score=0.771 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-us-east.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id xx0ah0LlRE9H for ; Thu, 16 Jul 2015 17:32:32 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-east.apache.org (ASF Mail Server at mx1-us-east.apache.org) with SMTP id 1A30A428DB for ; Thu, 16 Jul 2015 17:32:32 +0000 (UTC) Received: (qmail 6424 invoked by uid 99); 16 Jul 2015 17:32:31 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jul 2015 17:32:31 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 6982DE681F; Thu, 16 Jul 2015 17:32:31 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: qihong@apache.org To: commits@geode.incubator.apache.org Date: Thu, 16 Jul 2015 17:32:31 -0000 Message-Id: <93ca21bd5ece4183bbda63254f501f72@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] incubator-geode git commit: GEODE-114: fix race condition in DefaultGemFireConnection.getRegionProxy Repository: incubator-geode Updated Branches: refs/heads/feature/GEODE-9 60d074cc7 -> 89b9aaff8 GEODE-114: fix race condition in DefaultGemFireConnection.getRegionProxy Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/dc1c1559 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/dc1c1559 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/dc1c1559 Branch: refs/heads/feature/GEODE-9 Commit: dc1c1559dd8a38ffade204f5440755338de2a5c8 Parents: 2793365 Author: Qihong Chen Authored: Tue Jul 14 16:49:18 2015 -0700 Committer: Qihong Chen Committed: Wed Jul 15 09:44:34 2015 -0700 ---------------------------------------------------------------------- .../internal/DefaultGemFireConnection.scala | 8 ++++--- .../DefaultGemFireConnectionManager.scala | 24 ++++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/dc1c1559/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnection.scala ---------------------------------------------------------------------- diff --git a/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnection.scala b/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnection.scala index e31186b..bba6c69 100644 --- a/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnection.scala +++ b/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnection.scala @@ -23,8 +23,6 @@ private[connector] class DefaultGemFireConnection ( extends GemFireConnection with Logging { private val clientCache = initClientCache() - /** a lock object only used by getRegionProxy...() */ - private val regionLock = new Object /** Register GemFire functions to the GemFire cluster */ FunctionService.registerFunction(RetrieveRegionMetadataFunction.getInstance()) @@ -81,7 +79,7 @@ private[connector] class DefaultGemFireConnection ( def getRegionProxy[K, V](regionPath: String): Region[K, V] = { val region1: Region[K, V] = clientCache.getRegion(regionPath).asInstanceOf[Region[K, V]] if (region1 != null) region1 - else regionLock.synchronized { + else DefaultGemFireConnection.regionLock.synchronized { val region2 = clientCache.getRegion(regionPath).asInstanceOf[Region[K, V]] if (region2 != null) region2 else clientCache.createClientRegionFactory[K, V](ClientRegionShortcut.PROXY).create(regionPath) @@ -116,6 +114,10 @@ private[connector] class DefaultGemFireConnection ( } } +private[connector] object DefaultGemFireConnection { + /** a lock object only used by getRegionProxy...() */ + private val regionLock = new Object +} /** The purpose of this class is making unit test DefaultGemFireConnectionManager easier */ class DefaultGemFireConnectionFactory { http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/dc1c1559/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnectionManager.scala ---------------------------------------------------------------------- diff --git a/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnectionManager.scala b/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnectionManager.scala index 0463340..7495c60 100644 --- a/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnectionManager.scala +++ b/gemfire-spark-connector/gemfire-spark-connector/src/main/scala/io/pivotal/gemfire/spark/connector/internal/DefaultGemFireConnectionManager.scala @@ -23,17 +23,27 @@ object DefaultGemFireConnectionManager { private[connector] val connections = mutable.Map[(String, Int), GemFireConnection]() /** - * use locator host:port pair to lookup connection. create new connection and add it - * to `connections` if it does not exists. + * use locator host:port pair to lookup cached connection. create new connection + * and add it to the cache `connections` if it does not exist. */ def getConnection(connConf: GemFireConnectionConf) (implicit factory: DefaultGemFireConnectionFactory = new DefaultGemFireConnectionFactory): GemFireConnection = { - val conns = connConf.locators.map(connections withDefaultValue null).filter(_ != null) - if (conns.nonEmpty) conns(0) + + def getCachedConnection(locators: Seq[(String, Int)]): GemFireConnection = { + val conns = connConf.locators.map(connections withDefaultValue null).filter(_ != null) + if (conns.nonEmpty) conns(0) else null + } + + val conn1 = getCachedConnection(connConf.locators) + if (conn1 != null) conn1 else connections.synchronized { - val conn = factory.newConnection(connConf.locators, connConf.gemfireProps) - connConf.locators.foreach(pair => connections += (pair -> conn)) - conn + val conn2 = getCachedConnection(connConf.locators) + if (conn2 != null) conn2 + else { + val conn3 = factory.newConnection(connConf.locators, connConf.gemfireProps) + connConf.locators.foreach(pair => connections += (pair -> conn3)) + conn3 + } } }