You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2017/01/11 02:17:28 UTC
hbase git commit: HBASE-14061 Support CF-level Storage Policy
(addendum)
Repository: hbase
Updated Branches:
refs/heads/master ac3b1c9aa -> 36eeb2c56
HBASE-14061 Support CF-level Storage Policy (addendum)
Addendum to resolve compatible issue with Hadoop 2.8.0+ / 3.0.0-alpha1+, meantime added
a util method in ReflectionUtils for invoking method with reflection
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/36eeb2c5
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/36eeb2c5
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/36eeb2c5
Branch: refs/heads/master
Commit: 36eeb2c569c574b299f8628bed6b8dd20fb900e2
Parents: ac3b1c9
Author: Yu Li <li...@apache.org>
Authored: Wed Jan 11 10:14:55 2017 +0800
Committer: Yu Li <li...@apache.org>
Committed: Wed Jan 11 10:14:55 2017 +0800
----------------------------------------------------------------------
.../hadoop/hbase/util/ReflectionUtils.java | 37 +++++++++++++++++
.../org/apache/hadoop/hbase/fs/HFileSystem.java | 42 ++++++++++++++++----
.../hbase/regionserver/HRegionFileSystem.java | 15 ++++---
.../hadoop/hbase/regionserver/HStore.java | 4 +-
.../hbase/regionserver/StoreFileWriter.java | 7 +++-
.../hbase/mapreduce/TestHFileOutputFormat2.java | 25 ++++++++++--
.../regionserver/TestHRegionFileSystem.java | 32 +++++++--------
7 files changed, 126 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java
index 740f9ee..63c6b9c 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/ReflectionUtils.java
@@ -26,12 +26,15 @@ import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.nio.charset.Charset;
import org.apache.commons.logging.Log;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
@InterfaceAudience.Private
public class ReflectionUtils {
@SuppressWarnings("unchecked")
@@ -188,4 +191,38 @@ public class ReflectionUtils {
return id + " (" + name + ")";
}
+ /**
+ * Get and invoke the target method from the given object with given parameters
+ * @param obj the object to get and invoke method from
+ * @param methodName the name of the method to invoke
+ * @param params the parameters for the method to invoke
+ * @return the return value of the method invocation
+ */
+ @NonNull
+ public static Object invokeMethod(Object obj, String methodName, Object... params) {
+ Method m;
+ try {
+ m = obj.getClass().getMethod(methodName, getParameterTypes(params));
+ m.setAccessible(true);
+ return m.invoke(obj, params);
+ } catch (NoSuchMethodException e) {
+ throw new UnsupportedOperationException("Cannot find specified method " + methodName, e);
+ } catch (IllegalAccessException e) {
+ throw new UnsupportedOperationException("Unable to access specified method " + methodName, e);
+ } catch (IllegalArgumentException e) {
+ throw new UnsupportedOperationException("Illegal arguments supplied for method " + methodName,
+ e);
+ } catch (InvocationTargetException e) {
+ throw new UnsupportedOperationException("Method threw an exception for " + methodName, e);
+ }
+ }
+
+ private static Class<?>[] getParameterTypes(Object[] params) {
+ Class<?>[] parameterTypes = new Class<?>[params.length];
+ for (int i = 0; i < params.length; i++) {
+ parameterTypes[i] = params[i].getClass();
+ }
+ return parameterTypes;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/main/java/org/apache/hadoop/hbase/fs/HFileSystem.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/fs/HFileSystem.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/fs/HFileSystem.java
index 1a5408b..fe8b3b2 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/fs/HFileSystem.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/fs/HFileSystem.java
@@ -40,6 +40,7 @@ import org.apache.hadoop.fs.FilterFileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;
import org.apache.hadoop.hdfs.DFSClient;
import org.apache.hadoop.hdfs.DistributedFileSystem;
@@ -52,7 +53,6 @@ import org.apache.hadoop.hdfs.protocol.LocatedBlocks;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockStoragePolicySuite;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.util.Progressable;
-import org.apache.hadoop.util.ReflectionUtils;
import edu.umd.cs.findbugs.annotations.Nullable;
@@ -68,6 +68,7 @@ public class HFileSystem extends FilterFileSystem {
private final FileSystem noChecksumFs; // read hfile data from storage
private final boolean useHBaseChecksum;
+ private static volatile byte unspecifiedStoragePolicyId = Byte.MIN_VALUE;
/**
* Create a FileSystem object for HBase regionservers.
@@ -157,11 +158,9 @@ public class HFileSystem extends FilterFileSystem {
*/
public void setStoragePolicy(Path path, String policyName) {
try {
- if (this.fs instanceof DistributedFileSystem) {
- ((DistributedFileSystem) this.fs).setStoragePolicy(path, policyName);
- }
- } catch (Throwable e) {
- LOG.warn("failed to set block storage policy of [" + path + "] to [" + policyName + "]", e);
+ ReflectionUtils.invokeMethod(this.fs, "setStoragePolicy", path, policyName);
+ } catch (Exception e) {
+ LOG.warn("Failed to set storage policy of [" + path + "] to [" + policyName + "]", e);
}
}
@@ -172,14 +171,41 @@ public class HFileSystem extends FilterFileSystem {
* exception thrown when trying to get policy
*/
@Nullable
- public String getStoragePolicy(Path path) {
+ public String getStoragePolicyName(Path path) {
+ try {
+ Object blockStoragePolicySpi =
+ ReflectionUtils.invokeMethod(this.fs, "getStoragePolicy", path);
+ return (String) ReflectionUtils.invokeMethod(blockStoragePolicySpi, "getName");
+ } catch (Exception e) {
+ // Maybe fail because of using old HDFS version, try the old way
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Failed to get policy directly", e);
+ }
+ return getStoragePolicyForOldHDFSVersion(path);
+ }
+ }
+
+ /**
+ * Before Hadoop 2.8.0, there's no getStoragePolicy method for FileSystem interface, and we need
+ * to keep compatible with it. See HADOOP-12161 for more details.
+ * @param path Path to get storage policy against
+ * @return the storage policy name
+ */
+ private String getStoragePolicyForOldHDFSVersion(Path path) {
try {
if (this.fs instanceof DistributedFileSystem) {
DistributedFileSystem dfs = (DistributedFileSystem) this.fs;
HdfsFileStatus status = dfs.getClient().getFileInfo(path.toUri().getPath());
if (null != status) {
+ if (unspecifiedStoragePolicyId < 0) {
+ // Get the unspecified id field through reflection to avoid compilation error.
+ // In later version BlockStoragePolicySuite#ID_UNSPECIFIED is moved to
+ // HdfsConstants#BLOCK_STORAGE_POLICY_ID_UNSPECIFIED
+ Field idUnspecified = BlockStoragePolicySuite.class.getField("ID_UNSPECIFIED");
+ unspecifiedStoragePolicyId = idUnspecified.getByte(BlockStoragePolicySuite.class);
+ }
byte storagePolicyId = status.getStoragePolicy();
- if (storagePolicyId != BlockStoragePolicySuite.ID_UNSPECIFIED) {
+ if (storagePolicyId != unspecifiedStoragePolicyId) {
BlockStoragePolicy[] policies = dfs.getStoragePolicies();
for (BlockStoragePolicy policy : policies) {
if (policy.getId() == storagePolicyId) {
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
index 4fcea64..6fd1764 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java
@@ -22,6 +22,8 @@ package org.apache.hadoop.hbase.regionserver;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InterruptedIOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -53,6 +55,7 @@ import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.FSHDFSUtils;
import org.apache.hadoop.hbase.util.FSUtils;
import org.apache.hadoop.hbase.util.Pair;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;
import com.google.common.collect.Lists;
@@ -189,9 +192,11 @@ public class HRegionFileSystem {
* @param policyName The name of the storage policy.
*/
public void setStoragePolicy(String familyName, String policyName) {
- if (this.fs instanceof HFileSystem) {
- Path storeDir = getStoreDir(familyName);
- ((HFileSystem) this.fs).setStoragePolicy(storeDir, policyName);
+ Path storeDir = getStoreDir(familyName);
+ try {
+ ReflectionUtils.invokeMethod(this.fs, "setStoragePolicy", storeDir, policyName);
+ } catch (Exception e) {
+ LOG.warn("Failed to set storage policy of [" + storeDir + "] to [" + policyName + "]", e);
}
}
@@ -202,10 +207,10 @@ public class HRegionFileSystem {
* thrown when trying to get policy
*/
@Nullable
- public String getStoragePolicy(String familyName) {
+ public String getStoragePolicyName(String familyName) {
if (this.fs instanceof HFileSystem) {
Path storeDir = getStoreDir(familyName);
- return ((HFileSystem) this.fs).getStoragePolicy(storeDir);
+ return ((HFileSystem) this.fs).getStoragePolicyName(storeDir);
}
return null;
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
index 09d1a66..2a93b70 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
@@ -117,6 +117,8 @@ public class HStore implements Store {
"hbase.server.compactchecker.interval.multiplier";
public static final String BLOCKING_STOREFILES_KEY = "hbase.hstore.blockingStoreFiles";
public static final String BLOCK_STORAGE_POLICY_KEY = "hbase.hstore.block.storage.policy";
+ // keep in accordance with HDFS default storage policy
+ public static final String DEFAULT_BLOCK_STORAGE_POLICY = "HOT";
public static final int DEFAULT_COMPACTCHECKER_INTERVAL_MULTIPLIER = 1000;
public static final int DEFAULT_BLOCKING_STOREFILE_COUNT = 7;
@@ -231,7 +233,7 @@ public class HStore implements Store {
// set block storage policy for store directory
String policyName = family.getStoragePolicy();
if (null == policyName) {
- policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY);
+ policyName = this.conf.get(BLOCK_STORAGE_POLICY_KEY, DEFAULT_BLOCK_STORAGE_POLICY);
}
if (null != policyName && !policyName.trim().isEmpty()) {
if (LOG.isTraceEnabled()) {
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileWriter.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileWriter.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileWriter.java
index deba6b2..786d58a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileWriter.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileWriter.java
@@ -41,6 +41,7 @@ import org.apache.hadoop.hbase.util.BloomContext;
import org.apache.hadoop.hbase.util.BloomFilterFactory;
import org.apache.hadoop.hbase.util.BloomFilterWriter;
import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.hadoop.hbase.util.RowBloomContext;
import org.apache.hadoop.hbase.util.RowColBloomContext;
import org.apache.hadoop.io.WritableUtils;
@@ -480,8 +481,10 @@ public class StoreFileWriter implements CellSink, ShipperListener {
LOG.trace("set block storage policy of [" + dir + "] to [" + policyName + "]");
}
- if (this.fs instanceof HFileSystem) {
- ((HFileSystem) this.fs).setStoragePolicy(dir, policyName.trim());
+ try {
+ ReflectionUtils.invokeMethod(this.fs, "setStoragePolicy", dir, policyName.trim());
+ } catch (Exception e) {
+ LOG.warn("Failed to set storage policy of [" + dir + "] to [" + policyName + "]", e);
}
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java
index 21a39d4..52b2901 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java
@@ -28,6 +28,7 @@ import static org.junit.Assert.fail;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
@@ -91,6 +92,7 @@ import org.apache.hadoop.hbase.testclassification.LargeTests;
import org.apache.hadoop.hbase.testclassification.VerySlowMapReduceTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.ReflectionUtils;
import org.apache.hadoop.hbase.util.Threads;
import org.apache.hadoop.hbase.util.Writables;
import org.apache.hadoop.hdfs.DistributedFileSystem;
@@ -1312,13 +1314,13 @@ public class TestHFileOutputFormat2 {
fs.mkdirs(cf1Dir);
fs.mkdirs(cf2Dir);
- // the original block storage policy would be NULL
+ // the original block storage policy would be HOT
String spA = getStoragePolicyName(fs, cf1Dir);
String spB = getStoragePolicyName(fs, cf2Dir);
LOG.debug("Storage policy of cf 0: [" + spA + "].");
LOG.debug("Storage policy of cf 1: [" + spB + "].");
- assertNull(spA);
- assertNull(spB);
+ assertEquals("HOT", spA);
+ assertEquals("HOT", spB);
// alter table cf schema to change storage policies
HFileOutputFormat2.configureStoragePolicy(conf, fs, FAMILIES[0], cf1Dir);
@@ -1340,12 +1342,27 @@ public class TestHFileOutputFormat2 {
private String getStoragePolicyName(FileSystem fs, Path path) {
try {
+ Object blockStoragePolicySpi = ReflectionUtils.invokeMethod(fs, "getStoragePolicy", path);
+ return (String) ReflectionUtils.invokeMethod(blockStoragePolicySpi, "getName");
+ } catch (Exception e) {
+ // Maybe fail because of using old HDFS version, try the old way
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Failed to get policy directly", e);
+ }
+ String policy = getStoragePolicyNameForOldHDFSVersion(fs, path);
+ return policy == null ? "HOT" : policy;// HOT by default
+ }
+ }
+
+ private String getStoragePolicyNameForOldHDFSVersion(FileSystem fs, Path path) {
+ try {
if (fs instanceof DistributedFileSystem) {
DistributedFileSystem dfs = (DistributedFileSystem) fs;
HdfsFileStatus status = dfs.getClient().getFileInfo(path.toUri().getPath());
if (null != status) {
byte storagePolicyId = status.getStoragePolicy();
- if (storagePolicyId != BlockStoragePolicySuite.ID_UNSPECIFIED) {
+ Field idUnspecified = BlockStoragePolicySuite.class.getField("ID_UNSPECIFIED");
+ if (storagePolicyId != idUnspecified.getByte(BlockStoragePolicySuite.class)) {
BlockStoragePolicy[] policies = dfs.getStoragePolicies();
for (BlockStoragePolicy policy : policies) {
if (policy.getId() == storagePolicyId) {
http://git-wip-us.apache.org/repos/asf/hbase/blob/36eeb2c5/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java
index a2772ec..7875e68 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java
@@ -73,28 +73,28 @@ public class TestHRegionFileSystem {
HTable table = (HTable) TEST_UTIL.createTable(TABLE_NAME, FAMILIES);
assertEquals("Should start with empty table", 0, TEST_UTIL.countRows(table));
HRegionFileSystem regionFs = getHRegionFS(table, conf);
- // the original block storage policy would be NULL
- String spA = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[0]));
- String spB = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[1]));
+ // the original block storage policy would be HOT
+ String spA = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[0]));
+ String spB = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[1]));
LOG.debug("Storage policy of cf 0: [" + spA + "].");
LOG.debug("Storage policy of cf 1: [" + spB + "].");
- assertNull(spA);
- assertNull(spB);
+ assertEquals("HOT", spA);
+ assertEquals("HOT", spB);
// Recreate table and make sure storage policy could be set through configuration
TEST_UTIL.shutdownMiniCluster();
- TEST_UTIL.getConfiguration().set(HStore.BLOCK_STORAGE_POLICY_KEY, "HOT");
+ TEST_UTIL.getConfiguration().set(HStore.BLOCK_STORAGE_POLICY_KEY, "WARM");
TEST_UTIL.startMiniCluster();
table = (HTable) TEST_UTIL.createTable(TABLE_NAME, FAMILIES);
regionFs = getHRegionFS(table, conf);
try (Admin admin = TEST_UTIL.getConnection().getAdmin()) {
- spA = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[0]));
- spB = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[1]));
+ spA = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[0]));
+ spB = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[1]));
LOG.debug("Storage policy of cf 0: [" + spA + "].");
LOG.debug("Storage policy of cf 1: [" + spB + "].");
- assertEquals("HOT", spA);
- assertEquals("HOT", spB);
+ assertEquals("WARM", spA);
+ assertEquals("WARM", spB);
// alter table cf schema to change storage policies
// and make sure it could override settings in conf
@@ -116,8 +116,8 @@ public class TestHRegionFileSystem {
Thread.sleep(200);
LOG.debug("Waiting on table to finish schema altering");
}
- spA = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[0]));
- spB = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[1]));
+ spA = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[0]));
+ spB = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[1]));
LOG.debug("Storage policy of cf 0: [" + spA + "].");
LOG.debug("Storage policy of cf 1: [" + spB + "].");
assertNotNull(spA);
@@ -145,17 +145,17 @@ public class TestHRegionFileSystem {
assertNull(tempFiles);
// storage policy of cf temp dir and 3 store files should be ONE_SSD
assertEquals("ONE_SSD",
- ((HFileSystem) regionFs.getFileSystem()).getStoragePolicy(storeTempDir));
+ ((HFileSystem) regionFs.getFileSystem()).getStoragePolicyName(storeTempDir));
for (FileStatus status : storeFiles) {
assertEquals("ONE_SSD",
- ((HFileSystem) regionFs.getFileSystem()).getStoragePolicy(status.getPath()));
+ ((HFileSystem) regionFs.getFileSystem()).getStoragePolicyName(status.getPath()));
}
// change storage policies by calling raw api directly
regionFs.setStoragePolicy(Bytes.toString(FAMILIES[0]), "ALL_SSD");
regionFs.setStoragePolicy(Bytes.toString(FAMILIES[1]), "ONE_SSD");
- spA = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[0]));
- spB = regionFs.getStoragePolicy(Bytes.toString(FAMILIES[1]));
+ spA = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[0]));
+ spB = regionFs.getStoragePolicyName(Bytes.toString(FAMILIES[1]));
LOG.debug("Storage policy of cf 0: [" + spA + "].");
LOG.debug("Storage policy of cf 1: [" + spB + "].");
assertNotNull(spA);