[infinispan-issues] [JBoss JIRA] (ISPN-2187) Pre-Invocation flag PUT_FOR_EXTERNAL_READ throws exception

Anna Manukyan (JIRA) jira-events at lists.jboss.org
Wed Aug 8 11:43:06 EDT 2012


     [ https://issues.jboss.org/browse/ISPN-2187?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Anna Manukyan updated ISPN-2187:
--------------------------------

    Description: 
Hi,

While writing tests for Infinispan Flag.PUT_FOR_EXTERNAL_READ the following issue has been found.

In documentation it is said: 

 PUT_FOR_EXTERNAL_READ 
          Flags the invocation as a Cache.putForExternalRead(Object, Object) call, as opposed to a regular Map.put(Object, Object).

And the documentation for Cache.putForExternalRead(Object, Object) says:

void putForExternalRead(K key,
                        V value)
...................
 Errors and exceptions are 'silent' - logged at a much lower level than normal, and this method does not throw exceptions

The issue is the following:

when trying to perform operation using PUT_FOR_EXTERNAL_READ flag, the exception is thrown, it is not 'silent'.

cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);

The test is the following: 
{code}
public void testExceptionSuppression() throws Exception {
      Cache cache1 = cache(0, "replSync");
      Cache cache2 = cache(1, "replSync");
      Transport mockTransport = mock(Transport.class);
      RpcManagerImpl rpcManager = (RpcManagerImpl) TestingUtil.extractComponent(cache1, RpcManager.class);
      Transport originalTransport = TestingUtil.extractComponent(cache1, Transport.class);
      try {

         Address mockAddress1 = mock(Address.class);
         Address mockAddress2 = mock(Address.class);

         List<Address> memberList = new ArrayList<Address>(2);
         memberList.add(mockAddress1);
         memberList.add(mockAddress2);

         rpcManager.setTransport(mockTransport);

         when(mockTransport.getMembers()).thenReturn(memberList);

         when(mockTransport.getViewId()).thenReturn(originalTransport.getViewId());

         when(mockTransport.invokeRemotely(anyAddresses(), (CacheRpcCommand) anyObject(), anyResponseMode(),
                                             anyLong(), anyBoolean(), (ResponseFilter) anyObject()))
               .thenThrow(new RuntimeException("Barf!"));

         try {
            cache1.put(key, value);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         // clean up any indeterminate state left over
         try {
            cache1.remove(key);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         assertNull("Should have cleaned up", cache1.get(key));

         // should not barf
         cache1.putForExternalRead(key, value);

         /** ------------------- Testing the same feature with Flag.PUT_FOR_EXTERNAL_READ **/
         try {
            cache1.remove(key);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);
      }
      finally {
         if (rpcManager != null) rpcManager.setTransport(originalTransport);
      }
   }
{code}
Best regards,
Anna.

  was:
Hi,

While writing tests for Infinispan Flag.PUT_FOR_EXTERNAL_READ the following issue has been found.

In documentation it is said: 

 PUT_FOR_EXTERNAL_READ 
          Flags the invocation as a Cache.putForExternalRead(Object, Object) call, as opposed to a regular Map.put(Object, Object).

And the documentation for Cache.putForExternalRead(Object, Object) says:

void putForExternalRead(K key,
                        V value)
...................
 Errors and exceptions are 'silent' - logged at a much lower level than normal, and this method does not throw exceptions

The issue is the following:

when trying to perform operation using PUT_FOR_EXTERNAL_READ flag, the exception is thrown, it is not 'silent'.

cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);

The test is the following: 

public void testExceptionSuppression() throws Exception {
      Cache cache1 = cache(0, "replSync");
      Cache cache2 = cache(1, "replSync");
      Transport mockTransport = mock(Transport.class);
      RpcManagerImpl rpcManager = (RpcManagerImpl) TestingUtil.extractComponent(cache1, RpcManager.class);
      Transport originalTransport = TestingUtil.extractComponent(cache1, Transport.class);
      try {

         Address mockAddress1 = mock(Address.class);
         Address mockAddress2 = mock(Address.class);

         List<Address> memberList = new ArrayList<Address>(2);
         memberList.add(mockAddress1);
         memberList.add(mockAddress2);

         rpcManager.setTransport(mockTransport);

         when(mockTransport.getMembers()).thenReturn(memberList);

         when(mockTransport.getViewId()).thenReturn(originalTransport.getViewId());

         when(mockTransport.invokeRemotely(anyAddresses(), (CacheRpcCommand) anyObject(), anyResponseMode(),
                                             anyLong(), anyBoolean(), (ResponseFilter) anyObject()))
               .thenThrow(new RuntimeException("Barf!"));

         try {
            cache1.put(key, value);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         // clean up any indeterminate state left over
         try {
            cache1.remove(key);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         assertNull("Should have cleaned up", cache1.get(key));

         // should not barf
         cache1.putForExternalRead(key, value);

         /** ------------------- Testing the same feature with Flag.PUT_FOR_EXTERNAL_READ **/
         try {
            cache1.remove(key);
            fail("Should have barfed");
         }
         catch (RuntimeException re) {
         }

         cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);
      }
      finally {
         if (rpcManager != null) rpcManager.setTransport(originalTransport);
      }
   }

Best regards,
Anna.


    
> Pre-Invocation flag PUT_FOR_EXTERNAL_READ throws exception
> ----------------------------------------------------------
>
>                 Key: ISPN-2187
>                 URL: https://issues.jboss.org/browse/ISPN-2187
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Core API
>            Reporter: Anna Manukyan
>            Assignee: Manik Surtani
>              Labels: jdg6
>
> Hi,
> While writing tests for Infinispan Flag.PUT_FOR_EXTERNAL_READ the following issue has been found.
> In documentation it is said: 
>  PUT_FOR_EXTERNAL_READ 
>           Flags the invocation as a Cache.putForExternalRead(Object, Object) call, as opposed to a regular Map.put(Object, Object).
> And the documentation for Cache.putForExternalRead(Object, Object) says:
> void putForExternalRead(K key,
>                         V value)
> ...................
>  Errors and exceptions are 'silent' - logged at a much lower level than normal, and this method does not throw exceptions
> The issue is the following:
> when trying to perform operation using PUT_FOR_EXTERNAL_READ flag, the exception is thrown, it is not 'silent'.
> cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);
> The test is the following: 
> {code}
> public void testExceptionSuppression() throws Exception {
>       Cache cache1 = cache(0, "replSync");
>       Cache cache2 = cache(1, "replSync");
>       Transport mockTransport = mock(Transport.class);
>       RpcManagerImpl rpcManager = (RpcManagerImpl) TestingUtil.extractComponent(cache1, RpcManager.class);
>       Transport originalTransport = TestingUtil.extractComponent(cache1, Transport.class);
>       try {
>          Address mockAddress1 = mock(Address.class);
>          Address mockAddress2 = mock(Address.class);
>          List<Address> memberList = new ArrayList<Address>(2);
>          memberList.add(mockAddress1);
>          memberList.add(mockAddress2);
>          rpcManager.setTransport(mockTransport);
>          when(mockTransport.getMembers()).thenReturn(memberList);
>          when(mockTransport.getViewId()).thenReturn(originalTransport.getViewId());
>          when(mockTransport.invokeRemotely(anyAddresses(), (CacheRpcCommand) anyObject(), anyResponseMode(),
>                                              anyLong(), anyBoolean(), (ResponseFilter) anyObject()))
>                .thenThrow(new RuntimeException("Barf!"));
>          try {
>             cache1.put(key, value);
>             fail("Should have barfed");
>          }
>          catch (RuntimeException re) {
>          }
>          // clean up any indeterminate state left over
>          try {
>             cache1.remove(key);
>             fail("Should have barfed");
>          }
>          catch (RuntimeException re) {
>          }
>          assertNull("Should have cleaned up", cache1.get(key));
>          // should not barf
>          cache1.putForExternalRead(key, value);
>          /** ------------------- Testing the same feature with Flag.PUT_FOR_EXTERNAL_READ **/
>          try {
>             cache1.remove(key);
>             fail("Should have barfed");
>          }
>          catch (RuntimeException re) {
>          }
>          cache1.getAdvancedCache().withFlags(Flag.PUT_FOR_EXTERNAL_READ).put(key, value);
>       }
>       finally {
>          if (rpcManager != null) rpcManager.setTransport(originalTransport);
>       }
>    }
> {code}
> Best regards,
> Anna.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the infinispan-issues mailing list