You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/06/14 17:15:23 UTC

[44/44] usergrid git commit: Merge branch 'release-2.1.1' of https://git-wip-us.apache.org/repos/asf/usergrid into usergrid-1268-akka-211

Merge branch 'release-2.1.1' of https://git-wip-us.apache.org/repos/asf/usergrid into usergrid-1268-akka-211

# Conflicts:
#	stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
#	stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java
#	stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
#	stack/rest/src/test/java/org/apache/usergrid/rest/applications/collection/CollectionsResourceIT.java


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/a93cad8f
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/a93cad8f
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/a93cad8f

Branch: refs/heads/usergrid-1268-akka-211
Commit: a93cad8fae58679fcbfde9727aa675962f1347d4
Parents: 324ef35 3df0779
Author: Dave Johnson <sn...@apache.org>
Authored: Tue Jun 14 13:14:34 2016 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Tue Jun 14 13:14:34 2016 -0400

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |   3 +-
 .../corepersistence/CpEntityManager.java        |   2 +-
 .../corepersistence/CpEntityManagerFactory.java | 244 +++++++++++++++----
 .../corepersistence/EntityManagerFig.java       |   2 +-
 .../asyncevents/AsyncEventService.java          |   6 +-
 .../asyncevents/AsyncEventServiceImpl.java      |  11 +-
 .../asyncevents/EventBuilder.java               |   6 +-
 .../asyncevents/EventBuilderImpl.java           |  46 ++--
 .../model/DeIndexOldVersionsEvent.java          |  12 +-
 .../corepersistence/index/IndexService.java     |  23 +-
 .../corepersistence/index/IndexServiceImpl.java |  74 +++---
 .../pipeline/cursor/CursorSerializerUtil.java   |   9 -
 .../pipeline/cursor/RequestCursor.java          |  29 ++-
 .../read/search/CandidateEntityFilter.java      |  94 ++++++-
 .../apache/usergrid/locking/LockManager.java    |   5 +
 .../locking/cassandra/AstyanaxLockImpl.java     |   2 +-
 .../cassandra/AstyanaxLockManagerImpl.java      | 113 +++++----
 .../locking/noop/NoOpLockManagerImpl.java       |   5 +
 .../persistence/entities/Notification.java      |  38 ++-
 .../usergrid/persistence/CoreSchemaManager.java |   8 +-
 .../apache/usergrid/persistence/IndexIT.java    |  98 ++++++++
 .../test/resources/usergrid-test-context.xml    |   1 +
 .../collection/EntityCollectionManager.java     |  10 +-
 .../exception/CollectionRuntimeException.java   |  11 +
 .../impl/EntityCollectionManagerImpl.java       |  40 ++-
 .../serialization/SerializationFig.java         |   5 +
 .../serialization/impl/LogEntryIterator.java    | 128 ++++++++++
 .../core/astyanax/CassandraCluster.java         |  24 +-
 .../persistence/core/astyanax/CassandraFig.java |  18 +-
 .../model/field/value/EntityObject.java         |  15 +-
 .../usergrid/persistence/index/EntityIndex.java |   5 +-
 .../usergrid/persistence/index/IndexFig.java    |   2 +-
 .../index/impl/EsEntityIndexImpl.java           |  64 ++---
 .../persistence/index/impl/EntityIndexTest.java |  41 ----
 .../security/SecuredResourceFilterFactory.java  |   2 +-
 .../collection/CollectionsResourceIT.java       |  47 ++++
 .../queries/SelectMappingsQueryTest.java        | 168 +++++++++++++
 .../resource/endpoints/CollectionEndpoint.java  |  24 +-
 .../test/resources/usergrid-test-context.xml    |   2 +-
 .../usergrid/security/shiro/ShiroCache.java     |  80 +++---
 .../usergrid/services/ServiceManager.java       |   8 +
 .../services/ServiceManagerFactory.java         |  12 +
 .../impl/ApplicationQueueManagerImpl.java       |  52 +++-
 .../AbstractServiceNotificationIT.java          |  26 +-
 .../test/resources/usergrid-test-context.xml    |   1 +
 45 files changed, 1232 insertions(+), 384 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --cc stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 926cc0a,18df205..090400f
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@@ -16,24 -16,17 +16,17 @@@
  package org.apache.usergrid.corepersistence;
  
  
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Set;
- import java.util.TreeMap;
- import java.util.UUID;
- 
- import org.apache.usergrid.persistence.collection.uniquevalues.AkkaFig;
- import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.BeansException;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.ApplicationContextAware;
- 
+ import com.google.common.base.Optional;
+ import com.google.common.cache.CacheBuilder;
+ import com.google.common.cache.CacheLoader;
+ import com.google.common.cache.LoadingCache;
+ import com.google.common.util.concurrent.UncheckedExecutionException;
+ import com.google.inject.Injector;
+ import com.google.inject.Key;
+ import com.google.inject.TypeLiteral;
  import org.apache.commons.lang.StringUtils;
- 
  import org.apache.usergrid.corepersistence.asyncevents.AsyncEventService;
 -import org.apache.usergrid.corepersistence.index.IndexSchemaCacheFactory;
 +import org.apache.usergrid.corepersistence.index.CollectionSettingsCacheFactory;
  import org.apache.usergrid.corepersistence.index.ReIndexRequestBuilder;
  import org.apache.usergrid.corepersistence.index.ReIndexService;
  import org.apache.usergrid.corepersistence.service.CollectionService;
@@@ -53,7 -39,8 +39,10 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.cassandra.CounterUtils;
  import org.apache.usergrid.persistence.cassandra.Setup;
  import org.apache.usergrid.persistence.collection.EntityCollectionManager;
+ import org.apache.usergrid.persistence.collection.exception.CollectionRuntimeException;
  import org.apache.usergrid.persistence.collection.serialization.impl.migration.EntityIdScope;
++import org.apache.usergrid.persistence.collection.uniquevalues.AkkaFig;
++import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
  import org.apache.usergrid.persistence.core.metrics.MetricsFactory;
  import org.apache.usergrid.persistence.core.migration.data.MigrationDataProvider;
  import org.apache.usergrid.persistence.core.scope.ApplicationScope;
@@@ -104,16 -84,17 +86,16 @@@ public class CpEntityManagerFactory imp
  
      private Setup setup = null;
  
+     EntityManager managementAppEntityManager = null;
+ 
      // cache of already instantiated entity managers
-     private LoadingCache<UUID, EntityManager> entityManagers
-         = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<UUID, EntityManager>() {
-             public EntityManager load(UUID appId) { // no checked exception
-                 return _getEntityManager(appId);
-             }
-         });
+     private final String ENTITY_MANAGER_CACHE_SIZE = "entity.manager.cache.size";
+     private final LoadingCache<UUID, EntityManager> entityManagers;
  
      private final ApplicationIdCache applicationIdCache;
 -    //private final IndexSchemaCache indexSchemaCache;
  
+     Application managementApp = null;
+ 
      private ManagerCache managerCache;
  
      private CassandraService cassandraService;
@@@ -125,11 -106,15 +107,16 @@@
      private final CollectionService collectionService;
      private final ConnectionService connectionService;
      private final GraphManagerFactory graphManagerFactory;
 -    private final IndexSchemaCacheFactory indexSchemaCacheFactory;
 +    private final CollectionSettingsCacheFactory collectionSettingsCacheFactory;
 +    private UniqueValuesService uniqueValuesService;
+     private final LockManager lockManager;
  
-     public CpEntityManagerFactory( final CassandraService cassandraService, final CounterUtils counterUtils,
-                                    final Injector injector ) {
+     public static final String MANAGEMENT_APP_INIT_MAXRETRIES= "management.app.init.max-retries";
+     public static final String MANAGEMENT_APP_INIT_INTERVAL = "management.app.init.interval";
+ 
+ 
+     public CpEntityManagerFactory(
+         final CassandraService cassandraService, final CounterUtils counterUtils, final Injector injector ) {
  
          this.cassandraService = cassandraService;
          this.counterUtils = counterUtils;
@@@ -142,24 -127,162 +129,175 @@@
          this.graphManagerFactory = injector.getInstance( GraphManagerFactory.class );
          this.collectionService = injector.getInstance( CollectionService.class );
          this.connectionService = injector.getInstance( ConnectionService.class );
 -        this.indexSchemaCacheFactory = injector.getInstance( IndexSchemaCacheFactory.class );
 +
 +        this.collectionSettingsCacheFactory = injector.getInstance( CollectionSettingsCacheFactory.class );
 +
 +        AkkaFig akkaFig = injector.getInstance( AkkaFig.class );
 +
 +        // this line always needs to be last due to the temporary cicular dependency until spring is removed
 +        this.applicationIdCache = injector.getInstance(ApplicationIdCacheFactory.class).getInstance(
 +            getManagementEntityManager() );
 +
 +        if ( akkaFig.getAkkaEnabled() ) {
 +            try {
 +                this.uniqueValuesService = injector.getInstance( UniqueValuesService.class );
 +                this.uniqueValuesService.start();
 +            } catch (Throwable t) {
 +                logger.error("Error starting Akka", t);
 +                throw t;
 +            }
 +        }
+         this.lockManager = injector.getInstance( LockManager.class );
+ 
+         Properties properties = cassandraService.getProperties();
+ 
+         entityManagers = createEntityManagerCache( properties );
+ 
+         checkManagementApp( properties );
 -
 -        // this line always needs to be last due to the temporary circular dependency until spring is removed
 -        applicationIdCache = injector.getInstance(ApplicationIdCacheFactory.class)
 -            .getInstance( getManagementEntityManager() );
+     }
+ 
+ 
+     private LoadingCache<UUID, EntityManager> createEntityManagerCache(Properties properties) {
+ 
+         int entityManagerCacheSize = 100;
+         try {
+             entityManagerCacheSize = Integer.parseInt( properties.getProperty( ENTITY_MANAGER_CACHE_SIZE, "100" ));
+         } catch ( Exception e ) {
+             logger.error("Error parsing " + ENTITY_MANAGER_CACHE_SIZE + ". Will use " + entityManagerCacheSize, e );
+         }
+ 
+         return CacheBuilder.newBuilder()
+             .maximumSize(entityManagerCacheSize)
+             .build(new CacheLoader<UUID, EntityManager>() {
+ 
+                 public EntityManager load( UUID appId ) { // no checked exception
+ 
+                     // create new entity manager and pre-fetch its application
+                     EntityManager entityManager = _getEntityManager( appId );
+                     Application app = null;
+                     Throwable throwable = null;
+                     try {
+                         app = entityManager.getApplication();
+                     } catch (Throwable t) {
+                         throwable = t;
+                     }
+ 
+                     // the management app is a special case
+                     if ( CpNamingUtils.MANAGEMENT_APPLICATION_ID.equals( appId ) ) {
+ 
+                         if ( app != null ) {
+                             // we successfully fetched up the management app, cache it for a rainy day
+                             managementAppEntityManager = entityManager;
+ 
+                         } else if ( managementAppEntityManager != null ) {
+                             // failed to fetch management app, use cached one
+                             entityManager = managementAppEntityManager;
+                             logger.error("Failed to fetch management app");
+                         }
+                     }
+ 
+                     // missing keyspace means we have not done bootstrap yet
+                     final boolean isBootstrapping;
+                     if ( throwable instanceof CollectionRuntimeException ) {
+                         CollectionRuntimeException cre = (CollectionRuntimeException) throwable;
+                         isBootstrapping = cre.isBootstrapping();
+                     } else {
+                         isBootstrapping = false;
+                     }
+ 
+                     // work around for https://issues.apache.org/jira/browse/USERGRID-1291
+                     // throw exception so that we do not cache
+                     // TODO: determine how application name can intermittently be null
+                     if ( app != null && app.getName() == null ) {
+                         throw new RuntimeException( "Name is null for application " + appId, throwable );
+                     }
+ 
+                     if ( app == null && !isBootstrapping ) {
+                         throw new RuntimeException( "Error getting application " + appId, throwable );
+ 
+                     } // else keyspace is missing because setup/bootstrap not done yet
+ 
+                     return entityManager;
+                 }
+             });
+     }
+ 
+ 
+     private void checkManagementApp(Properties properties) {
+ 
+         int maxRetries = 100;
+         try {
+             maxRetries = Integer.parseInt( properties.getProperty( MANAGEMENT_APP_INIT_MAXRETRIES, "100" ));
+ 
+         } catch ( Exception e ) {
+             logger.error("Error parsing " + MANAGEMENT_APP_INIT_MAXRETRIES + ". Will use " + maxRetries, e );
+         }
+ 
+         int interval = 1000;
+         try {
+             interval = Integer.parseInt( properties.getProperty( MANAGEMENT_APP_INIT_INTERVAL, "1000" ));
+ 
+         } catch ( Exception e ) {
+             logger.error("Error parsing " + MANAGEMENT_APP_INIT_INTERVAL + ". Will use " + maxRetries, e );
+         }
+ 
+         // hold up construction until we can access the management app
+         int retries = 0;
+         boolean managementAppFound = false;
+         boolean bootstrapping = false;
+         Set<Class> seenBefore = new HashSet<>(10);
+         while ( !managementAppFound && retries++ < maxRetries ) {
+             try {
+                 // bypass entity manager cache and get managementApp
+                 managementApp = _getEntityManager( getManagementAppId() ).getApplication();
+                 managementAppFound = true;
+ 
+             } catch ( Throwable t ) {
+ 
+                 if ( t instanceof CollectionRuntimeException ) {
+                     CollectionRuntimeException cre = (CollectionRuntimeException)t;
+                     if ( cre.isBootstrapping() ) {
+                         // we're bootstrapping, ignore this and continue
+                         bootstrapping = true;
+                         break;
+                     }
+                 }
+                 Throwable cause = t;
+ 
+                 // there was an error, be as informative as possible
+                 StringBuilder sb = new StringBuilder();
+                 sb.append(retries).append(": Error (");
+ 
+                 if ( t instanceof UncheckedExecutionException ) {
+                     UncheckedExecutionException uee = (UncheckedExecutionException)t;
+                     if ( uee.getCause() instanceof RuntimeException ) {
+                         cause = uee.getCause().getCause();
+                         sb.append(cause.getClass().getSimpleName()).append(") ")
+                           .append(uee.getCause().getMessage());
+                     } else {
+                         cause = uee.getCause();
+                         sb.append(cause.getClass().getSimpleName()).append(") ").append(t.getMessage());
+                     }
+                 } else {
+                     sb.append(t.getCause().getClass().getSimpleName()).append(") ").append(t.getMessage());
+                 }
+ 
+                 String msg = sb.toString();
+                 if ( !seenBefore.contains( cause.getClass() ) ) {
+                     logger.error( msg, t);
+                 } else {
+                     logger.error(msg);
+                 }
+                 seenBefore.add( cause.getClass() );
+ 
+                 try { Thread.sleep( interval ); } catch (InterruptedException ignored) {}
+             }
+         }
+ 
+         if ( !managementAppFound && !bootstrapping ) {
+             // exception here will prevent WAR from being deployed
+             throw new RuntimeException( "Unable to get management app after " + retries + " retries" );
+         }
      }
  
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/core/src/main/java/org/apache/usergrid/corepersistence/EntityManagerFig.java
----------------------------------------------------------------------
diff --cc stack/core/src/main/java/org/apache/usergrid/corepersistence/EntityManagerFig.java
index 46c7a1d,655a968..872ffbb
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/EntityManagerFig.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/EntityManagerFig.java
@@@ -39,15 -39,6 +39,15 @@@ public interface EntityManagerFig exten
      int sleep();
  
      @Key( "usergrid.entityManager.enable_deindex_on_update" )
-     @Default( "false" )
+     @Default( "true" )
      boolean getDeindexOnUpdate();
 +
 +    /**
 +     * Comma-separated list of one or more Amazon regions to use if multiregion
 +     * is set to true.
 +     */
 +    @Key( "usergrid.queue.regionList" )
 +    @Default("us-east-1")
 +    String getRegionList();
 +
  }

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java
----------------------------------------------------------------------
diff --cc stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java
index ab2caa3,54b18bb..d371b8a
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/index/IndexServiceImpl.java
@@@ -43,13 -51,14 +43,12 @@@ import org.apache.usergrid.persistence.
  import org.apache.usergrid.persistence.model.entity.Id;
  import org.apache.usergrid.persistence.model.entity.SimpleId;
  import org.apache.usergrid.utils.InflectionUtils;
- import org.apache.usergrid.utils.UUIDUtils;
 -
 -import com.codahale.metrics.Timer;
 -import com.google.common.base.Optional;
 -import com.google.inject.Inject;
 -import com.google.inject.Singleton;
 -
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  import rx.Observable;
  
 +import java.util.*;
 +
  import static org.apache.usergrid.corepersistence.util.CpNamingUtils.*;
  import static org.apache.usergrid.persistence.Schema.TYPE_APPLICATION;
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/EntityCollectionManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
----------------------------------------------------------------------
diff --cc stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
index 544e7bb,fcf1c6b..09bd01b
--- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
+++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/impl/EntityCollectionManagerImpl.java
@@@ -27,7 -27,7 +27,8 @@@ import java.util.List
  import java.util.UUID;
  
  import com.netflix.astyanax.model.ConsistencyLevel;
 +import org.apache.usergrid.persistence.collection.uniquevalues.UniqueValuesService;
+ import org.apache.usergrid.persistence.collection.serialization.impl.LogEntryIterator;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  

http://git-wip-us.apache.org/repos/asf/usergrid/blob/a93cad8f/stack/rest/src/test/java/org/apache/usergrid/rest/applications/collection/CollectionsResourceIT.java
----------------------------------------------------------------------
diff --cc stack/rest/src/test/java/org/apache/usergrid/rest/applications/collection/CollectionsResourceIT.java
index 48e125b,690cec2..f13ed46
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/collection/CollectionsResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/collection/CollectionsResourceIT.java
@@@ -17,24 -17,44 +17,26 @@@
  package org.apache.usergrid.rest.applications.collection;
  
  
 -import java.io.IOException;
 -import java.util.ArrayList;
 -import java.util.HashMap;
 -import java.util.Iterator;
 -import java.util.LinkedHashMap;
 -import java.util.Map;
 -import java.util.Set;
 -
 -import javax.ws.rs.BadRequestException;
 -import javax.ws.rs.ClientErrorException;
 -
 -import org.junit.Ignore;
 -import org.junit.Test;
 -import org.slf4j.Logger;
 -import org.slf4j.LoggerFactory;
 -
 +import com.fasterxml.jackson.databind.JsonNode;
  import org.apache.commons.lang.RandomStringUtils;
 -
  import org.apache.usergrid.persistence.Schema;
  import org.apache.usergrid.persistence.entities.Application;
+ import org.apache.usergrid.persistence.index.utils.UUIDUtils;
  import org.apache.usergrid.rest.test.resource.AbstractRestIT;
 -import org.apache.usergrid.rest.test.resource.model.ApiResponse;
 +import org.apache.usergrid.rest.test.resource.model.*;
  import org.apache.usergrid.rest.test.resource.model.Collection;
 -import org.apache.usergrid.rest.test.resource.model.Credentials;
 -import org.apache.usergrid.rest.test.resource.model.Entity;
 -import org.apache.usergrid.rest.test.resource.model.QueryParameters;
 -import org.apache.usergrid.rest.test.resource.model.Token;
 +import org.junit.Ignore;
 +import org.junit.Test;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  
 -import com.fasterxml.jackson.databind.JsonNode;
 +import javax.ws.rs.BadRequestException;
 +import javax.ws.rs.ClientErrorException;
 +import java.io.IOException;
 +import java.util.*;
  
+ import static junit.framework.TestCase.assertNotNull;
 -import static org.junit.Assert.assertEquals;
 -import static org.junit.Assert.assertFalse;
 -import static org.junit.Assert.assertNotEquals;
 -import static org.junit.Assert.assertNotSame;
 -import static org.junit.Assert.assertTrue;
 -import static org.junit.Assert.fail;
 +import static org.junit.Assert.*;
  
  
  /**
@@@ -1003,58 -1103,48 +1005,103 @@@ public class CollectionsResourceIT exte
          assertEquals( 0, connectionsByQuery.getNumOfEntities() );
      }
  
 +
 +    @Test
 +    public void testCollectionRegion() {
 +
 +        // create collection with settings for index all
 +
 +        String randomizer = RandomStringUtils.randomAlphanumeric(10);
 +        String collectionName = "col_" + randomizer;
 +
 +        app().collection( collectionName ).collection( "_settings" )
 +            .post( new Entity().chainPut( "fields", "all" ) );
 +        refreshIndex();
 +
 +        // get collection settings, should see no region
 +
 +        Collection collection = app().collection( collectionName ).collection( "_settings" ).get();
 +        Map<String, Object> settings = (Map<String, Object>)collection.getResponse().getData();
 +        assertNull( settings.get( "region" ));
 +
 +        // set collection region with bad region, expect error
 +
 +        try {
 +            app().collection( collectionName ).collection( "_settings" )
 +                .post( new Entity().chainPut( "region", "us-moon-1" ) );
 +            fail( "post should have failed");
 +
 +        } catch ( BadRequestException expected ) {}
 +
 +        // set collection region with good region
 +
 +        app().collection( collectionName ).collection( "_settings" )
 +            .post( new Entity().chainPut( "region", "us-east-1" ) );
 +
 +        // get collection settings see that we have a region
 +
 +        collection = app().collection( collectionName ).collection( "_settings" ).get();
 +        settings = (Map<String, Object>)collection.getResponse().getData();
 +        assertNotNull( settings.get( "region" ));
 +        assertEquals( "us-east-1", settings.get( "region" ));
 +
 +        // unset the collection region
 +
 +        app().collection( collectionName ).collection( "_settings" )
 +            .post( new Entity().chainPut( "region", "" ) );
 +        refreshIndex();
 +
 +        // get collection settings, should see no region
 +
 +        collection = app().collection( collectionName ).collection( "_settings" ).get();
 +        settings = (Map<String, Object>)collection.getResponse().getData();
 +        assertNull( settings.get( "region" ));
 +
 +
 +    }
++
++
+     @Test
+     public void testBeingAbleToRetreiveMigratedValues() throws Exception {
+ 
+ 
+         Entity notifier = new Entity().chainPut("name", "mynotifier").chainPut("provider", "noop");
+ 
+         ApiResponse notifierNode = this.pathResource(getOrgAppPath("notifier")).post(ApiResponse.class,notifier);
+ 
+         // create user
+ 
+         Map payloads = new HashMap<>(  );
+         payloads.put( "mynotifier","hello world" );
+ 
+         Map statistics = new HashMap<>(  );
+         statistics.put( "sent",1 );
+         statistics.put( "errors",2 );
+ 
+         Entity payload = new Entity();
+         payload.put("debug", false);
+         payload.put( "expectedCount",0 );
+         payload.put( "finished",1438279671229L);
+         payload.put( "payloads",payloads);
+         payload.put( "priority","normal");
+         payload.put( "state","FINISHED");
+         payload.put( "statistics",statistics);
+ 
+ 
+         this.app().collection("notifications/"+ UUIDUtils.newTimeUUID()).post(payload );
+         this.refreshIndex();
+ 
+         Collection user2 = this.app().collection("notifications").get();
+ 
+         assertEquals(1,user2.getNumOfEntities());
+ 
+         this.app().collection("notifications/"+ UUIDUtils.newTimeUUID()).put(null,payload );
+         this.refreshIndex();
+ 
+         user2 = this.app().collection("notifications").get();
+ 
+         assertEquals(2,user2.getNumOfEntities());
+ 
+     }
+ 
 -
  }