Refactor the ChangeMessage UUID generation to a common utility
We also now only hit the database for a new change message sequence number once each application startup, or once every 2^31 messages. Since the application startup is going to be the more frequent case we should only hit the database once. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
		@@ -20,6 +20,7 @@ import com.google.gerrit.client.reviewdb.ChangeMessage;
 | 
				
			|||||||
import com.google.gerrit.client.reviewdb.PatchSet;
 | 
					import com.google.gerrit.client.reviewdb.PatchSet;
 | 
				
			||||||
import com.google.gerrit.client.reviewdb.ReviewDb;
 | 
					import com.google.gerrit.client.reviewdb.ReviewDb;
 | 
				
			||||||
import com.google.gerrit.client.rpc.Common;
 | 
					import com.google.gerrit.client.rpc.Common;
 | 
				
			||||||
 | 
					import com.google.gerrit.server.ChangeUtil;
 | 
				
			||||||
import com.google.gerrit.server.GerritServer;
 | 
					import com.google.gerrit.server.GerritServer;
 | 
				
			||||||
import com.google.gwtorm.client.OrmException;
 | 
					import com.google.gwtorm.client.OrmException;
 | 
				
			||||||
import com.google.gwtorm.client.Transaction;
 | 
					import com.google.gwtorm.client.Transaction;
 | 
				
			||||||
@@ -39,8 +40,6 @@ import org.spearce.jgit.merge.Merger;
 | 
				
			|||||||
import org.spearce.jgit.revwalk.RevCommit;
 | 
					import org.spearce.jgit.revwalk.RevCommit;
 | 
				
			||||||
import org.spearce.jgit.revwalk.RevSort;
 | 
					import org.spearce.jgit.revwalk.RevSort;
 | 
				
			||||||
import org.spearce.jgit.revwalk.RevWalk;
 | 
					import org.spearce.jgit.revwalk.RevWalk;
 | 
				
			||||||
import org.spearce.jgit.util.Base64;
 | 
					 | 
				
			||||||
import org.spearce.jgit.util.NB;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
@@ -442,9 +441,12 @@ public class MergeOp {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private ChangeMessage message(final Change c, final String body) {
 | 
					  private ChangeMessage message(final Change c, final String body) {
 | 
				
			||||||
    final byte[] raw = new byte[4];
 | 
					    final String uuid;
 | 
				
			||||||
    NB.encodeInt32(raw, 0, schema.nextChangeMessageId());
 | 
					    try {
 | 
				
			||||||
    final String uuid = Base64.encodeBytes(raw);
 | 
					      uuid = ChangeUtil.messageUUID(schema);
 | 
				
			||||||
 | 
					    } catch (OrmException e) {
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    final ChangeMessage m =
 | 
					    final ChangeMessage m =
 | 
				
			||||||
        new ChangeMessage(new ChangeMessage.Key(c.getId(), uuid), null);
 | 
					        new ChangeMessage(new ChangeMessage.Key(c.getId(), uuid), null);
 | 
				
			||||||
    m.setMessage(body);
 | 
					    m.setMessage(body);
 | 
				
			||||||
@@ -486,7 +488,9 @@ public class MergeOp {
 | 
				
			|||||||
      try {
 | 
					      try {
 | 
				
			||||||
        final Transaction txn = schema.beginTransaction();
 | 
					        final Transaction txn = schema.beginTransaction();
 | 
				
			||||||
        schema.changes().update(Collections.singleton(c), txn);
 | 
					        schema.changes().update(Collections.singleton(c), txn);
 | 
				
			||||||
 | 
					        if (msg != null) {
 | 
				
			||||||
          schema.changeMessages().insert(Collections.singleton(msg), txn);
 | 
					          schema.changeMessages().insert(Collections.singleton(msg), txn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        txn.commit();
 | 
					        txn.commit();
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      } catch (OrmException e) {
 | 
					      } catch (OrmException e) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					// Copyright 2009 Google Inc.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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.gerrit.server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.gerrit.client.reviewdb.ReviewDb;
 | 
				
			||||||
 | 
					import com.google.gwtorm.client.OrmException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.spearce.jgit.util.Base64;
 | 
				
			||||||
 | 
					import org.spearce.jgit.util.NB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ChangeUtil {
 | 
				
			||||||
 | 
					  private static int uuidPrefix;
 | 
				
			||||||
 | 
					  private static int uuidSeq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Generate a new unique identifier for change message entities.
 | 
				
			||||||
 | 
					   * 
 | 
				
			||||||
 | 
					   * @param db the database connection, used to increment the change message
 | 
				
			||||||
 | 
					   *        allocation sequence.
 | 
				
			||||||
 | 
					   * @return the new unique identifier.
 | 
				
			||||||
 | 
					   * @throws OrmException the database couldn't be incremented.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public static String messageUUID(final ReviewDb db) throws OrmException {
 | 
				
			||||||
 | 
					    final byte[] raw = new byte[8];
 | 
				
			||||||
 | 
					    fill(raw, db);
 | 
				
			||||||
 | 
					    return Base64.encodeBytes(raw);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private static synchronized void fill(byte[] raw, ReviewDb db)
 | 
				
			||||||
 | 
					      throws OrmException {
 | 
				
			||||||
 | 
					    if (uuidSeq == 0) {
 | 
				
			||||||
 | 
					      uuidPrefix = db.nextChangeMessageId();
 | 
				
			||||||
 | 
					      uuidSeq = Integer.MAX_VALUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    NB.encodeInt32(raw, 0, uuidPrefix);
 | 
				
			||||||
 | 
					    NB.encodeInt32(raw, 4, uuidSeq--);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user