/** * Copyright 2015 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS-IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.apphosting.tests.usercode.testservlets; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.QueryResultList; import java.io.IOException; import java.io.PrintWriter; import java.util.HashSet; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * A servlet that kicks off some datastore jobs and reports which jobs fail * to immediately apply, as a way to test the consistency model. */ public class DatastoreUnappliedJobsReportServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); // By default ~10% fail to apply. Key[] keys = new Key[50]; for (int i = 0; i < keys.length; ++i) { keys[i] = datastore.put(new Entity("foo")); } // Perform eventually consistent query and report unapplied jobs. QueryResultList<Entity> results = datastore .prepare(new Query("foo").setKeysOnly()) .asQueryResultList(FetchOptions.Builder.withDefaults()); writer.println("Of " + keys.length + " jobs " + results.size() + " applied"); writer.print("Query results: "); Set<Key> applied = new HashSet<Key>(); for (Entity entity : results) { applied.add(entity.getKey()); } for (Key key : keys) { writer.append(applied.contains(key) ? '1' : '0'); } writer.append('\n'); // Fetch test entities directly to confirm written. for (Key key : keys) { try { datastore.get(key); } catch (EntityNotFoundException e) { writer.println("Error: missing entity " + key.toString()); } } } }