Merge "BatchUpdate: Always bump rowVersion when dirty"
This commit is contained in:
@@ -44,6 +44,7 @@ import com.google.gerrit.reviewdb.client.PatchSet;
|
|||||||
import com.google.gerrit.reviewdb.client.Project;
|
import com.google.gerrit.reviewdb.client.Project;
|
||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
import com.google.gerrit.server.AnonymousUser;
|
import com.google.gerrit.server.AnonymousUser;
|
||||||
|
import com.google.gerrit.server.ChangeFinder;
|
||||||
import com.google.gerrit.server.GerritPersonIdent;
|
import com.google.gerrit.server.GerritPersonIdent;
|
||||||
import com.google.gerrit.server.IdentifiedUser;
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
import com.google.gerrit.server.OutputFormat;
|
import com.google.gerrit.server.OutputFormat;
|
||||||
@@ -175,6 +176,9 @@ public abstract class AbstractDaemonTest {
|
|||||||
@Inject
|
@Inject
|
||||||
protected PatchSetUtil psUtil;
|
protected PatchSetUtil psUtil;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected ChangeFinder changeFinder;
|
||||||
|
|
||||||
protected TestRepository<InMemoryRepository> testRepo;
|
protected TestRepository<InMemoryRepository> testRepo;
|
||||||
protected GerritServer server;
|
protected GerritServer server;
|
||||||
protected TestAccount admin;
|
protected TestAccount admin;
|
||||||
|
|||||||
@@ -60,10 +60,12 @@ import com.google.gerrit.reviewdb.client.Account;
|
|||||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
|
import com.google.gerrit.server.change.ChangeResource;
|
||||||
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
|
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
|
||||||
import com.google.gerrit.server.git.ProjectConfig;
|
import com.google.gerrit.server.git.ProjectConfig;
|
||||||
import com.google.gerrit.server.group.SystemGroupBackend;
|
import com.google.gerrit.server.group.SystemGroupBackend;
|
||||||
import com.google.gerrit.server.notedb.ChangeNoteUtil;
|
import com.google.gerrit.server.notedb.ChangeNoteUtil;
|
||||||
|
import com.google.gerrit.server.project.ChangeControl;
|
||||||
import com.google.gerrit.server.project.Util;
|
import com.google.gerrit.server.project.Util;
|
||||||
|
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
@@ -73,6 +75,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
|
|||||||
import org.eclipse.jgit.revwalk.RevWalk;
|
import org.eclipse.jgit.revwalk.RevWalk;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -397,6 +400,10 @@ public class ChangeIT extends AbstractDaemonTest {
|
|||||||
@Test
|
@Test
|
||||||
public void addReviewer() throws Exception {
|
public void addReviewer() throws Exception {
|
||||||
PushOneCommit.Result r = createChange();
|
PushOneCommit.Result r = createChange();
|
||||||
|
ChangeResource rsrc = parseResource(r);
|
||||||
|
String oldETag = rsrc.getETag();
|
||||||
|
Timestamp oldTs = rsrc.getChange().getLastUpdatedOn();
|
||||||
|
|
||||||
AddReviewerInput in = new AddReviewerInput();
|
AddReviewerInput in = new AddReviewerInput();
|
||||||
in.reviewer = user.email;
|
in.reviewer = user.email;
|
||||||
gApi.changes()
|
gApi.changes()
|
||||||
@@ -418,6 +425,11 @@ public class ChangeIT extends AbstractDaemonTest {
|
|||||||
assertThat(reviewers).hasSize(1);
|
assertThat(reviewers).hasSize(1);
|
||||||
assertThat(reviewers.iterator().next()._accountId)
|
assertThat(reviewers.iterator().next()._accountId)
|
||||||
.isEqualTo(user.getId().get());
|
.isEqualTo(user.getId().get());
|
||||||
|
|
||||||
|
// Ensure ETag is updated but lastUpdatedOn isn't.
|
||||||
|
rsrc = parseResource(r);
|
||||||
|
assertThat(rsrc.getETag()).isNotEqualTo(oldETag);
|
||||||
|
assertThat(rsrc.getChange().getLastUpdatedOn()).isEqualTo(oldTs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -1024,4 +1036,12 @@ public class ChangeIT extends AbstractDaemonTest {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ChangeResource parseResource(PushOneCommit.Result r)
|
||||||
|
throws Exception {
|
||||||
|
List<ChangeControl> ctls = changeFinder.find(
|
||||||
|
r.getChangeId(), atrScope.get().getUser());
|
||||||
|
assertThat(ctls).hasSize(1);
|
||||||
|
return new ChangeResource(ctls.get(0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ import com.google.gerrit.extensions.restapi.IdString;
|
|||||||
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
import com.google.gerrit.extensions.restapi.ResourceConflictException;
|
||||||
import com.google.gerrit.reviewdb.client.Patch;
|
import com.google.gerrit.reviewdb.client.Patch;
|
||||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||||
import com.google.gerrit.server.ChangeFinder;
|
|
||||||
import com.google.gerrit.server.change.ChangeResource;
|
import com.google.gerrit.server.change.ChangeResource;
|
||||||
import com.google.gerrit.server.change.GetRevisionActions;
|
import com.google.gerrit.server.change.GetRevisionActions;
|
||||||
import com.google.gerrit.server.change.RevisionResource;
|
import com.google.gerrit.server.change.RevisionResource;
|
||||||
@@ -79,9 +78,6 @@ import java.util.Map;
|
|||||||
@NoHttpd
|
@NoHttpd
|
||||||
public class RevisionIT extends AbstractDaemonTest {
|
public class RevisionIT extends AbstractDaemonTest {
|
||||||
|
|
||||||
@Inject
|
|
||||||
private ChangeFinder changeFinder;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private GetRevisionActions getRevisionActions;
|
private GetRevisionActions getRevisionActions;
|
||||||
|
|
||||||
|
|||||||
@@ -589,26 +589,23 @@ public class BatchUpdate implements AutoCloseable {
|
|||||||
for (Op op : e.getValue()) {
|
for (Op op : e.getValue()) {
|
||||||
dirty |= op.updateChange(ctx);
|
dirty |= op.updateChange(ctx);
|
||||||
}
|
}
|
||||||
ctx.getChange().setLastUpdatedOn(ctx.getWhen());
|
if (!dirty) {
|
||||||
Iterable<Change> changes = Collections.singleton(ctx.getChange());
|
return;
|
||||||
|
}
|
||||||
if (newChanges.containsKey(id)) {
|
if (newChanges.containsKey(id)) {
|
||||||
db.changes().insert(changes);
|
db.changes().insert(bumpLastUpdatedOn(ctx));
|
||||||
} else if (ctx.saved) {
|
} else if (ctx.saved) {
|
||||||
db.changes().update(changes);
|
db.changes().update(bumpLastUpdatedOn(ctx));
|
||||||
} else if (ctx.deleted) {
|
} else if (ctx.deleted) {
|
||||||
db.changes().delete(changes);
|
db.changes().delete(bumpLastUpdatedOn(ctx));
|
||||||
}
|
} else {
|
||||||
if (dirty) {
|
db.changes().update(bumpRowVersionNotLastUpdatedOn(ctx));
|
||||||
db.commit();
|
|
||||||
}
|
}
|
||||||
|
db.commit();
|
||||||
} finally {
|
} finally {
|
||||||
db.rollback();
|
db.rollback();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dirty) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctx.deleted) {
|
if (ctx.deleted) {
|
||||||
if (notesMigration.writeChanges()) {
|
if (notesMigration.writeChanges()) {
|
||||||
new ChangeDelete(plcUtil, getRepository(), ctx.getNotes()).delete();
|
new ChangeDelete(plcUtil, getRepository(), ctx.getNotes()).delete();
|
||||||
@@ -636,6 +633,17 @@ public class BatchUpdate implements AutoCloseable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Iterable<Change> bumpLastUpdatedOn(ChangeContext ctx) {
|
||||||
|
Change c = ctx.getChange();
|
||||||
|
c.setLastUpdatedOn(ctx.getWhen());
|
||||||
|
return Collections.singleton(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Iterable<Change> bumpRowVersionNotLastUpdatedOn(
|
||||||
|
ChangeContext ctx) {
|
||||||
|
return Collections.singleton(ctx.getChange());
|
||||||
|
}
|
||||||
|
|
||||||
private ChangeContext newChangeContext(Change.Id id) throws Exception {
|
private ChangeContext newChangeContext(Change.Id id) throws Exception {
|
||||||
Change c = newChanges.get(id);
|
Change c = newChanges.get(id);
|
||||||
if (c == null) {
|
if (c == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user