google-nomulus/java/google/registry/model/ofy/CommitLogCheckpoint.java
shikhman f76bc70f91 Preserve test logs and test summary output for Kokoro CI runs
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=135494972
2016-10-14 16:57:43 -04:00

95 lines
4 KiB
Java

// Copyright 2016 The Nomulus Authors. 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 google.registry.model.ofy;
import static com.google.common.base.Preconditions.checkArgument;
import static org.joda.time.DateTimeZone.UTC;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.joda.time.DateTime;
/**
* Entity representing a point-in-time consistent view of datastore, based on commit logs.
*
* <p>Conceptually, this entity consists of two pieces of information: the checkpoint "wall" time
* and a set of bucket checkpoint times. The former is the ID for this checkpoint (constrained
* to be unique upon checkpoint creation) and also represents the approximate wall time of the
* consistent datastore view this checkpoint represents. The latter is really a mapping from
* bucket ID to timestamp, where the timestamp dictates the upper bound (inclusive) on commit logs
* from that bucket to include when restoring the datastore to this checkpoint.
*/
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
public class CommitLogCheckpoint extends ImmutableObject {
/** Shared singleton parent entity for commit log checkpoints. */
@Parent
Key<CommitLogCheckpointRoot> parent = CommitLogCheckpointRoot.getKey();
/** The checkpoint's approximate "wall" time (in millis since the epoch). */
@Id
long checkpointTime;
/** Bucket checkpoint times for this checkpoint, ordered to match up with buckets 1-N. */
List<DateTime> bucketTimestamps = new ArrayList<>();
public DateTime getCheckpointTime() {
return new DateTime(checkpointTime, UTC);
}
/** Returns the bucket checkpoint times as a map from bucket ID to commit timestamp. */
public ImmutableMap<Integer, DateTime> getBucketTimestamps() {
ImmutableMap.Builder<Integer, DateTime> builder = new ImmutableMap.Builder<>();
for (int i = 0; i < bucketTimestamps.size(); ++i) {
// Add 1 to map the bucket timestamps properly to buckets indexed from 1-N.
builder.put(i + 1, bucketTimestamps.get(i));
}
return builder.build();
}
/**
* Creates a CommitLogCheckpoint for the given wall time and bucket checkpoint times, specified
* as a map from bucket ID to bucket commit timestamp.
*/
public static CommitLogCheckpoint create(
DateTime checkpointTime,
ImmutableMap<Integer, DateTime> bucketTimestamps) {
checkArgument(
Objects.equals(CommitLogBucket.getBucketIds().asList(), bucketTimestamps.keySet().asList()),
"Bucket ids are incorrect: %s",
bucketTimestamps.keySet());
CommitLogCheckpoint instance = new CommitLogCheckpoint();
instance.checkpointTime = checkpointTime.getMillis();
instance.bucketTimestamps = ImmutableList.copyOf(bucketTimestamps.values());
return instance;
}
/** Creates a key for the CommitLogCheckpoint for the given wall time. */
public static Key<CommitLogCheckpoint> createKey(DateTime checkpointTime) {
return Key.create(
CommitLogCheckpointRoot.getKey(), CommitLogCheckpoint.class, checkpointTime.getMillis());
}
}