[ 
https://issues.apache.org/jira/browse/HBASE-28842?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nick Dimiduk resolved HBASE-28842.
----------------------------------
    Resolution: Fixed

No adjustment needed. Resolving. 

> TestRequestAttributes should fail when expected
> -----------------------------------------------
>
>                 Key: HBASE-28842
>                 URL: https://issues.apache.org/jira/browse/HBASE-28842
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 2.0.0, 3.0.0
>            Reporter: Evelyn Boland
>            Assignee: Evelyn Boland
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 4.0.0-alpha-1, 2.7.0, 3.0.0-beta-2, 2.6.1
>
>
> Problem:
> The tests in the TestRequestAttributes class pass even when they should fail. 
> I've included an example of a test that should fail but does not below.
> Fix:
> Throw an IOException in the AttributesCoprocessor when the map of expected 
> request attributes does not match the map of given request attributes.
>  
> Test: 
> We set 2+ request attributes on the Get request but always return 0 request 
> attributes from AttributesCoprocessor::getRequestAttributesForRowKey method. 
> Yet the test passes even though the map of expected request attributes never 
> matches the map of given request attributes.
> {code:java}
> @Category({ ClientTests.class, MediumTests.class })
> public class TestRequestAttributes {
>   @ClassRule
>   public static final HBaseClassTestRule CLASS_RULE =
>     HBaseClassTestRule.forClass(TestRequestAttributes.class);
>   private static final byte[] ROW_KEY1 = Bytes.toBytes("1");
>   private static final Map<byte[], Map<String, byte[]>> 
> ROW_KEY_TO_REQUEST_ATTRIBUTES =
>     new HashMap<>();
>   static {
>     CONNECTION_ATTRIBUTES.put("clientId", Bytes.toBytes("foo"));
>     ROW_KEY_TO_REQUEST_ATTRIBUTES.put(ROW_KEY1, addRandomRequestAttributes());
>   }
>   private static final ExecutorService EXECUTOR_SERVICE = 
> Executors.newFixedThreadPool(100);
>   private static final byte[] FAMILY = Bytes.toBytes("0");
>   private static final TableName TABLE_NAME = 
> TableName.valueOf("testRequestAttributes");
>   private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();
>   private static SingleProcessHBaseCluster cluster;
>   @BeforeClass
>   public static void setUp() throws Exception {
>     cluster = TEST_UTIL.startMiniCluster(1);
>     Table table = TEST_UTIL.createTable(TABLE_NAME, new byte[][] { FAMILY }, 
> 1,
>       HConstants.DEFAULT_BLOCKSIZE, AttributesCoprocessor.class.getName());
>     table.close();
>   }
>   @AfterClass
>   public static void afterClass() throws Exception {
>     cluster.close();
>     TEST_UTIL.shutdownMiniCluster();
>   }
> @Test
> public void testRequestAttributesGet() throws IOException {
>   Configuration conf = TEST_UTIL.getConfiguration();
>   try (
>     Connection conn = ConnectionFactory.createConnection(conf, null, 
> AuthUtil.loginClient(conf),
>       CONNECTION_ATTRIBUTES);
>     Table table = configureRequestAttributes(conn.getTableBuilder(TABLE_NAME, 
> EXECUTOR_SERVICE),
>       ROW_KEY_TO_REQUEST_ATTRIBUTES.get(ROW_KEY1)).build()) {
>     table.get(new Get(ROW_KEY1));
>   }
> }
> private static Map<String, byte[]> addRandomRequestAttributes() {
>   Map<String, byte[]> requestAttributes = new HashMap<>();
>   int j = Math.max(2, (int) (10 * Math.random()));
>   for (int i = 0; i < j; i++) {
>     requestAttributes.put(String.valueOf(i), 
> Bytes.toBytes(UUID.randomUUID().toString()));
>   }
>   return requestAttributes;
> }
> public static class AttributesCoprocessor implements RegionObserver, 
> RegionCoprocessor {
>     @Override
>     public Optional<RegionObserver> getRegionObserver() {
>       return Optional.of(this);
>     }
>     @Override
>     public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> c, Get 
> get,
>       List<Cell> result) throws IOException {
>        
> validateRequestAttributes(getRequestAttributesForRowKey(get.getRow())));   
>     }
>     private Map<String, byte[]> getRequestAttributesForRowKey(byte[] rowKey) {
>       return Collections.emptyMap(); // This line helps demonstrate the bug
>     }
>     private boolean validateRequestAttributes(Map<String, byte[]> 
> requestAttributes) {
>       RpcCall rpcCall = RpcServer.getCurrentCall().get();
>       Map<String, byte[]> attrs = rpcCall.getRequestAttributes();
>       if (attrs.size() != requestAttributes.size()) {
>         return;
>       }
>       for (Map.Entry<String, byte[]> attr : attrs.entrySet()) {
>         if (!requestAttributes.containsKey(attr.getKey())) {
>           return;
>         }
>         if (!Arrays.equals(requestAttributes.get(attr.getKey()), 
> attr.getValue())) {
>           return;
>         }
>       }
>       return;
>     }
>   }
> } {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to