Skip to content
This repository was archived by the owner on Jul 19, 2024. It is now read-only.

Commit 2b7e650

Browse files
authored
Merge pull request #547 from rickle-msft/7.0.1hotfix
7.0.1hotfix
2 parents b796935 + 6c1039c commit 2b7e650

File tree

5 files changed

+57
-4
lines changed

5 files changed

+57
-4
lines changed

ChangeLog.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2020.06.22 Version 7.0.1
2+
* Fixed a race condition in XML parsing logic that in narrow situations could cause the parser to be initialized incorrectly resulting in an erroneously empty list result.
3+
14
2018.02.05 Version 7.0.0
25
* Support for 2017-07-29 REST version. Please see our REST api documentation and blogs for information about the related added features.
36
* Added support for soft delete feature. If a delete retention policy is enabled through the set service properties API, then blobs or snapshots can be deleted softly and retained for a specified number of days, before being permanently removed by garbage collection.

microsoft-azure-storage-test/src/com/microsoft/azure/storage/blob/CloudBlobContainerTests.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@
3232
import java.util.TimeZone;
3333
import java.util.UUID;
3434

35+
import java.util.concurrent.Executors;
36+
import java.util.concurrent.ThreadPoolExecutor;
37+
import java.util.concurrent.TimeUnit;
38+
import java.util.concurrent.atomic.AtomicInteger;
39+
import javax.xml.parsers.SAXParser;
40+
41+
import com.microsoft.azure.storage.core.Utility;
42+
3543
import org.junit.After;
3644
import org.junit.Before;
3745
import org.junit.Test;
@@ -557,6 +565,49 @@ public void testCloudBlobContainerListBlobs() throws StorageException, IOExcepti
557565
assertTrue(blobNames.size() == 0);
558566
}
559567

568+
@Test
569+
@Category({DevFabricTests.class, DevStoreTests.class})
570+
public void testSAXParserConcurrency() throws Exception {
571+
final int totalCount = 200000;
572+
final int numThreads = 200;
573+
final AtomicInteger currentCount = new AtomicInteger(0);
574+
final AtomicInteger pending = new AtomicInteger(0);
575+
final AtomicInteger failureCount = new AtomicInteger(0);
576+
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(numThreads);
577+
578+
do {
579+
final int count = currentCount.incrementAndGet();
580+
pending.incrementAndGet();
581+
executor.execute(new Runnable() {
582+
@Override
583+
public void run() {
584+
pending.decrementAndGet();
585+
if (count > totalCount) {
586+
return;
587+
}
588+
try {
589+
SAXParser parser = Utility.getSAXParser();
590+
if (!parser.isNamespaceAware()) {
591+
failureCount.incrementAndGet();
592+
}
593+
assertEquals(true, parser.isNamespaceAware());
594+
} catch (Exception e) {
595+
fail(e.toString());
596+
}
597+
}
598+
});
599+
600+
assertEquals(0, failureCount.get());
601+
602+
while (pending.get() > numThreads * 2) {
603+
Thread.sleep(10);
604+
}
605+
} while (currentCount.get() < totalCount);
606+
executor.shutdown();
607+
executor.awaitTermination(1, TimeUnit.MINUTES);
608+
executor.shutdownNow();
609+
}
610+
560611
/**
561612
* List the blobs in a container with a prefix
562613
*

microsoft-azure-storage/src/com/microsoft/azure/storage/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ public static class HeaderConstants {
670670
/**
671671
* Specifies the value to use for UserAgent header.
672672
*/
673-
public static final String USER_AGENT_VERSION = "7.0.0";
673+
public static final String USER_AGENT_VERSION = "7.0.1";
674674

675675
/**
676676
* The default type for content-type and accept

microsoft-azure-storage/src/com/microsoft/azure/storage/core/Utility.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,8 @@ protected DateFormat initialValue() {
135135
* Thread local for SAXParser.
136136
*/
137137
private static final ThreadLocal<SAXParser> saxParserThreadLocal = new ThreadLocal<SAXParser>() {
138-
SAXParserFactory factory;
139138
@Override public SAXParser initialValue() {
140-
factory = SAXParserFactory.newInstance();
139+
SAXParserFactory factory = SAXParserFactory.newInstance();
141140
factory.setNamespaceAware(true);
142141
try {
143142
return factory.newSAXParser();

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<modelVersion>4.0.0</modelVersion>
1111
<groupId>com.microsoft.azure</groupId>
1212
<artifactId>azure-storage</artifactId>
13-
<version>7.0.0</version>
13+
<version>7.0.1</version>
1414
<packaging>jar</packaging>
1515

1616
<name>Microsoft Azure Storage Client SDK</name>

0 commit comments

Comments
 (0)