Skip to content

Commit 32ed314

Browse files
authored
fix for cosmos spark preferred regions issue (Azure#27084)
* added a comment on query plan caching. * fix for cosmos spark preferred regions issue * fix for cosmos spark preferred regions issue
1 parent 830d468 commit 32ed314

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosConfig.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ private object CosmosAccountConfig {
253253
helpMessage = "Cosmos DB Account Name")
254254

255255

256-
private val PreferredRegionRegex = "^[a-z0-9]+$"r // this is for the final form after lower-casing and trimming the whitespaces
256+
private val PreferredRegionRegex = "^[a-z0-9\\d]+(?: [a-z0-9\\d]+)*$".r
257257
private val PreferredRegionsList = CosmosConfigEntry[Array[String]](key = CosmosConfigNames.PreferredRegionsList,
258258
Option.apply(CosmosConfigNames.PreferredRegions),
259259
mandatory = false,
@@ -268,7 +268,7 @@ private object CosmosAccountConfig {
268268
} else {
269269
trimmedInput.split(",")
270270
.toStream
271-
.map(preferredRegion => preferredRegion.toLowerCase(Locale.ROOT).replace(" ", ""))
271+
.map(preferredRegion => preferredRegion.toLowerCase(Locale.ROOT).trim)
272272
.map(preferredRegion => {
273273
if (!PreferredRegionRegex.findFirstIn(preferredRegion).isDefined) {
274274
throw new IllegalArgumentException(s"$preferredRegionsListAsString is invalid")

sdk/cosmos/azure-cosmos-spark_3_2-12/src/test/scala/com/azure/cosmos/spark/CosmosConfigSpec.scala

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CosmosConfigSpec extends UnitSpec {
2727
endpointConfig.applicationName.get shouldEqual "myapp"
2828
endpointConfig.useGatewayMode shouldEqual true
2929
endpointConfig.preferredRegionsList.isDefined shouldEqual true
30-
endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("westus", "eastus1")
30+
endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("west us", "eastus1")
3131
}
3232

3333
"Config Parser" should "parse account credentials with spark.cosmos.preferredRegions" in {
@@ -46,7 +46,7 @@ class CosmosConfigSpec extends UnitSpec {
4646
endpointConfig.applicationName.get shouldEqual "myapp"
4747
endpointConfig.useGatewayMode shouldEqual true
4848
endpointConfig.preferredRegionsList.isDefined shouldEqual true
49-
endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("westus", "eastus1")
49+
endpointConfig.preferredRegionsList.get should contain theSameElementsAs Array("west us", "eastus1")
5050
}
5151

5252
"Config Parser" should "parse account credentials with spark.cosmos.preferredRegions and spark.cosmos.preferredRegionsList" in {
@@ -116,6 +116,22 @@ class CosmosConfigSpec extends UnitSpec {
116116
"invalid configuration for spark.cosmos.preferredRegionsList:[westus, eastus. Config description: Preferred Region List"
117117
}
118118
}
119+
120+
userConfig = Map(
121+
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
122+
"spark.cosmos.accountKey" -> "xyz",
123+
"spark.cosmos.preferredRegionsList" -> "[west us, eastus]"
124+
)
125+
126+
try {
127+
CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
128+
fail("invalid preferred region list")
129+
} catch {
130+
case e: Exception => {
131+
e.getMessage shouldEqual
132+
"invalid configuration for spark.cosmos.preferredRegionsList:[west us, eastus]. Config description: Preferred Region List"
133+
}
134+
}
119135
}
120136

121137
it should "preferred regions parsing" in {
@@ -126,7 +142,7 @@ class CosmosConfigSpec extends UnitSpec {
126142
)
127143

128144
var config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
129-
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1")
145+
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1")
130146

131147
userConfig = Map(
132148
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -135,7 +151,7 @@ class CosmosConfigSpec extends UnitSpec {
135151
)
136152

137153
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
138-
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1")
154+
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1")
139155

140156
userConfig = Map(
141157
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -144,7 +160,7 @@ class CosmosConfigSpec extends UnitSpec {
144160
)
145161

146162
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
147-
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1")
163+
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1")
148164

149165
userConfig = Map(
150166
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -153,7 +169,7 @@ class CosmosConfigSpec extends UnitSpec {
153169
)
154170

155171
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
156-
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "westus1")
172+
config.preferredRegionsList.get should contain theSameElementsAs Array("eastus", "west us1")
157173

158174
userConfig = Map(
159175
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -162,7 +178,7 @@ class CosmosConfigSpec extends UnitSpec {
162178
)
163179

164180
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
165-
config.preferredRegionsList.get should contain theSameElementsAs Array("westus1")
181+
config.preferredRegionsList.get should contain theSameElementsAs Array("west us1")
166182

167183
userConfig = Map(
168184
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -171,7 +187,7 @@ class CosmosConfigSpec extends UnitSpec {
171187
)
172188

173189
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
174-
config.preferredRegionsList.get should contain theSameElementsAs Array("westus1")
190+
config.preferredRegionsList.get should contain theSameElementsAs Array("west us1")
175191

176192
userConfig = Map(
177193
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
@@ -182,6 +198,15 @@ class CosmosConfigSpec extends UnitSpec {
182198
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
183199
config.preferredRegionsList.get should contain theSameElementsAs Array[String]()
184200

201+
userConfig = Map(
202+
"spark.cosmos.accountEndpoint" -> sampleProdEndpoint,
203+
"spark.cosmos.accountKey" -> "xyz",
204+
"spark.cosmos.preferredRegionsList" -> "[west us 1, east us 2]"
205+
)
206+
207+
config = CosmosAccountConfig.parseCosmosAccountConfig(userConfig)
208+
config.preferredRegionsList.get should contain theSameElementsAs Array("west us 1","east us 2")
209+
185210
}
186211

187212

0 commit comments

Comments
 (0)