From 311b835b412d131287790ca567bd9ae97f2226d6 Mon Sep 17 00:00:00 2001 From: Martin Fick Date: Wed, 30 Sep 2020 15:54:16 -0600 Subject: [PATCH 01/43] Update git submodules * Update plugins/replication from branch 'stable-2.16' to 6d0b12c83001805bfc740e3dabd37223acc294d8 - Make the shouldReplicateNewProject test more reliable The ReplicationIT shouldReplicateNewProject was failing regularly on my machine. Improve the timeout for this test so that it explicitly includes the time needed to wait for the project to be created, not just the scheduling and retry times. Change-Id: Ibf3cc3506991b222ded3ee4ddfbd7e2d60341d60 --- plugins/replication | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/replication b/plugins/replication index fef0ec1946..6d0b12c830 160000 --- a/plugins/replication +++ b/plugins/replication @@ -1 +1 @@ -Subproject commit fef0ec1946617ea7d5446b2136dff8a2ed4434d6 +Subproject commit 6d0b12c83001805bfc740e3dabd37223acc294d8 From 1de0e7cccba81a7da1501e228a5d3e355e3ef819 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 5 Aug 2020 16:25:05 +0200 Subject: [PATCH 02/43] Limit graceful shutdown to SSH sessions serving git requests Not all SSH sessions should be shut down gracefully. E.g. sessions serving the EventStream command should rather be closed immediately, since it would otherwise keep the shutdown waiting until the timeout is reached. This change adds a counter to the SshSession that tracks the number of threads running tasks for this session that require a graceful shutdown. A graceful shutdown of the session is only done, if the counter is zero. Each command has to take care itself of incrementing or decrementing the counter. This change activates graceful shutdown for git commands, but does not enable it for other commands yet. Change-Id: I31ac3fbfe791fc3dc4aacbae9b1226549a1e8f49 --- .../gerrit/acceptance/AbstractDaemonTest.java | 21 +++- java/com/google/gerrit/acceptance/BUILD | 1 + .../gerrit/acceptance/GerritServer.java | 30 +++++- .../google/gerrit/acceptance/SshSession.java | 16 +++ .../gerrit/acceptance/StandaloneSiteTest.java | 2 +- .../acceptance/ssh/GracefulCommand.java | 31 ++++++ .../acceptance/ssh/NonGracefulCommand.java | 31 ++++++ .../gerrit/acceptance/ssh/TestCommand.java | 49 +++++++++ .../acceptance/ssh/TestSshCommandModule.java | 25 +++++ java/com/google/gerrit/pgm/Daemon.java | 8 ++ .../gerrit/sshd/AbstractGitCommand.java | 1 + java/com/google/gerrit/sshd/BaseCommand.java | 4 + java/com/google/gerrit/sshd/SshDaemon.java | 27 +++-- java/com/google/gerrit/sshd/SshSession.java | 10 ++ .../gerrit/acceptance/ssh/SshDaemonIT.java | 100 ++++++++++++++++++ 15 files changed, 342 insertions(+), 14 deletions(-) create mode 100644 java/com/google/gerrit/acceptance/ssh/GracefulCommand.java create mode 100644 java/com/google/gerrit/acceptance/ssh/NonGracefulCommand.java create mode 100644 java/com/google/gerrit/acceptance/ssh/TestCommand.java create mode 100644 java/com/google/gerrit/acceptance/ssh/TestSshCommandModule.java create mode 100644 javatests/com/google/gerrit/acceptance/ssh/SshDaemonIT.java diff --git a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 6bacc1abbe..f05c598b07 100644 --- a/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/java/com/google/gerrit/acceptance/AbstractDaemonTest.java @@ -364,6 +364,15 @@ public abstract class AbstractDaemonTest { initSsh(); } + protected void restart() throws Exception { + server = GerritServer.restart(server, createModule(), createSshModule()); + server.getTestInjector().injectMembers(this); + if (resetter != null) { + server.getTestInjector().injectMembers(resetter); + } + initSsh(); + } + protected void evictAndReindexAccount(Account.Id accountId) { accountCache.evict(accountId); accountIndexer.index(accountId); @@ -399,13 +408,16 @@ public abstract class AbstractDaemonTest { baseConfig.setInt("receive", null, "changeUpdateThreads", 4); Module module = createModule(); + Module sshModule = createSshModule(); if (classDesc.equals(methodDesc) && !classDesc.sandboxed() && !methodDesc.sandboxed()) { if (commonServer == null) { - commonServer = GerritServer.initAndStart(temporaryFolder, classDesc, baseConfig, module); + commonServer = + GerritServer.initAndStart(temporaryFolder, classDesc, baseConfig, module, sshModule); } server = commonServer; } else { - server = GerritServer.initAndStart(temporaryFolder, methodDesc, baseConfig, module); + server = + GerritServer.initAndStart(temporaryFolder, methodDesc, baseConfig, module, sshModule); } server.getTestInjector().injectMembers(this); @@ -445,6 +457,11 @@ public abstract class AbstractDaemonTest { return null; } + /** Override to bind an additional Guice module for SSH injector */ + public Module createSshModule() { + return null; + } + protected void initSsh() throws Exception { if (testRequiresSsh && SshMode.useSsh() diff --git a/java/com/google/gerrit/acceptance/BUILD b/java/com/google/gerrit/acceptance/BUILD index f7c0aee24f..25d8df1ae7 100644 --- a/java/com/google/gerrit/acceptance/BUILD +++ b/java/com/google/gerrit/acceptance/BUILD @@ -84,6 +84,7 @@ java_library2( "//lib:jimfs", "//lib/auto:auto-value", "//lib/auto:auto-value-annotations", + "//lib/flogger:api", "//lib/httpcomponents:fluent-hc", "//lib/httpcomponents:httpclient", "//lib/httpcomponents:httpcore", diff --git a/java/com/google/gerrit/acceptance/GerritServer.java b/java/com/google/gerrit/acceptance/GerritServer.java index 893106bccf..bb828afece 100644 --- a/java/com/google/gerrit/acceptance/GerritServer.java +++ b/java/com/google/gerrit/acceptance/GerritServer.java @@ -273,6 +273,7 @@ public class GerritServer implements AutoCloseable { * @param desc server description. * @param baseConfig default config values; merged with config from {@code desc}. * @param testSysModule additional Guice module to use. + * @param testSshModule additional Guice module to use. * @return started server. * @throws Exception */ @@ -280,14 +281,15 @@ public class GerritServer implements AutoCloseable { TemporaryFolder temporaryFolder, Description desc, Config baseConfig, - @Nullable Module testSysModule) + @Nullable Module testSysModule, + @Nullable Module testSshModule) throws Exception { Path site = temporaryFolder.newFolder().toPath(); try { if (!desc.memory()) { init(desc, baseConfig, site); } - return start(desc, baseConfig, site, testSysModule, null); + return start(desc, baseConfig, site, testSysModule, testSshModule, null); } catch (Exception e) { throw e; } @@ -303,6 +305,7 @@ public class GerritServer implements AutoCloseable { * initialize this directory. Can be retrieved from the returned instance via {@link * #getSitePath()}. * @param testSysModule optional additional module to add to the system injector. + * @param testSshModule optional additional module to add to the ssh injector. * @param inMemoryRepoManager {@link InMemoryRepositoryManager} that should be used if the site is * started in memory * @param additionalArgs additional command-line arguments for the daemon program; only allowed if @@ -315,6 +318,7 @@ public class GerritServer implements AutoCloseable { Config baseConfig, Path site, @Nullable Module testSysModule, + @Nullable Module testSshModule, @Nullable InMemoryRepositoryManager inMemoryRepoManager, String... additionalArgs) throws Exception { @@ -337,6 +341,9 @@ public class GerritServer implements AutoCloseable { if (testSysModule != null) { daemon.addAdditionalSysModuleForTesting(testSysModule); } + if (testSshModule != null) { + daemon.addAdditionalSshModuleForTesting(testSshModule); + } daemon.setEnableSshd(desc.useSsh()); if (desc.memory()) { @@ -553,7 +560,24 @@ public class GerritServer implements AutoCloseable { server.close(); server.daemon.stop(); - return start(server.desc, cfg, site, null, inMemoryRepoManager); + return start(server.desc, cfg, site, null, null, inMemoryRepoManager); + } + + public static GerritServer restart( + GerritServer server, @Nullable Module testSysModule, @Nullable Module testSshModule) + throws Exception { + checkState(server.desc.sandboxed(), "restarting as slave requires @Sandboxed"); + Config cfg = server.testInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); + Path site = server.testInjector.getInstance(Key.get(Path.class, SitePath.class)); + + InMemoryRepositoryManager inMemoryRepoManager = null; + if (hasBinding(server.testInjector, InMemoryRepositoryManager.class)) { + inMemoryRepoManager = server.testInjector.getInstance(InMemoryRepositoryManager.class); + } + + server.close(); + server.daemon.stop(); + return start(server.desc, cfg, site, testSysModule, testSshModule, inMemoryRepoManager); } private static boolean hasBinding(Injector injector, Class clazz) { diff --git a/java/com/google/gerrit/acceptance/SshSession.java b/java/com/google/gerrit/acceptance/SshSession.java index fa0bc90c7e..fd60d16ed3 100644 --- a/java/com/google/gerrit/acceptance/SshSession.java +++ b/java/com/google/gerrit/acceptance/SshSession.java @@ -66,6 +66,22 @@ public class SshSession { } } + @SuppressWarnings("resource") + public int execAndReturnStatus(String command) throws Exception { + ChannelExec channel = (ChannelExec) getSession().openChannel("exec"); + try { + channel.setCommand(command); + InputStream err = channel.getErrStream(); + channel.connect(); + + Scanner s = new Scanner(err, UTF_8.name()).useDelimiter("\\A"); + error = s.hasNext() ? s.next() : null; + return channel.getExitStatus(); + } finally { + channel.disconnect(); + } + } + public InputStream exec2(String command, InputStream opt) throws Exception { ChannelExec channel = (ChannelExec) getSession().openChannel("exec"); channel.setCommand(command); diff --git a/java/com/google/gerrit/acceptance/StandaloneSiteTest.java b/java/com/google/gerrit/acceptance/StandaloneSiteTest.java index 53f1ce93ea..d20124ae7b 100644 --- a/java/com/google/gerrit/acceptance/StandaloneSiteTest.java +++ b/java/com/google/gerrit/acceptance/StandaloneSiteTest.java @@ -207,7 +207,7 @@ public abstract class StandaloneSiteTest { private GerritServer startImpl(@Nullable Module testSysModule, String... additionalArgs) throws Exception { return GerritServer.start( - serverDesc, baseConfig, sitePaths.site_path, testSysModule, null, additionalArgs); + serverDesc, baseConfig, sitePaths.site_path, testSysModule, null, null, additionalArgs); } protected static void runGerrit(String... args) throws Exception { diff --git a/java/com/google/gerrit/acceptance/ssh/GracefulCommand.java b/java/com/google/gerrit/acceptance/ssh/GracefulCommand.java new file mode 100644 index 0000000000..ddaf341ee7 --- /dev/null +++ b/java/com/google/gerrit/acceptance/ssh/GracefulCommand.java @@ -0,0 +1,31 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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.acceptance.ssh; + +import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE; + +import com.google.gerrit.sshd.CommandMetaData; + +@CommandMetaData( + name = "graceful", + description = "Test command for graceful shutdown", + runsAt = MASTER_OR_SLAVE) +public class GracefulCommand extends TestCommand { + + @Override + boolean isGraceful() { + return true; + } +} diff --git a/java/com/google/gerrit/acceptance/ssh/NonGracefulCommand.java b/java/com/google/gerrit/acceptance/ssh/NonGracefulCommand.java new file mode 100644 index 0000000000..ed635c8fdb --- /dev/null +++ b/java/com/google/gerrit/acceptance/ssh/NonGracefulCommand.java @@ -0,0 +1,31 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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.acceptance.ssh; + +import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE; + +import com.google.gerrit.sshd.CommandMetaData; + +@CommandMetaData( + name = "non-graceful", + description = "Test command for immediate shutdown", + runsAt = MASTER_OR_SLAVE) +public class NonGracefulCommand extends TestCommand { + + @Override + boolean isGraceful() { + return false; + } +} diff --git a/java/com/google/gerrit/acceptance/ssh/TestCommand.java b/java/com/google/gerrit/acceptance/ssh/TestCommand.java new file mode 100644 index 0000000000..783957805a --- /dev/null +++ b/java/com/google/gerrit/acceptance/ssh/TestCommand.java @@ -0,0 +1,49 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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.acceptance.ssh; + +import com.google.common.flogger.FluentLogger; +import com.google.gerrit.sshd.SshCommand; +import java.util.concurrent.CyclicBarrier; +import org.kohsuke.args4j.Option; + +public abstract class TestCommand extends SshCommand { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + public static final CyclicBarrier syncPoint = new CyclicBarrier(2); + + @Option( + name = "--duration", + aliases = {"-d"}, + required = true, + usage = "Duration of the command execution in seconds") + private int duration; + + @Override + protected void run() throws UnloggedFailure, Failure, Exception { + logger.atFine().log("Starting command."); + if (isGraceful()) { + enableGracefulStop(); + } + try { + syncPoint.await(); + Thread.sleep(duration * 1000); + logger.atFine().log("Stopping command."); + } catch (Exception e) { + throw die("Command ended prematurely.", e); + } + } + + abstract boolean isGraceful(); +} diff --git a/java/com/google/gerrit/acceptance/ssh/TestSshCommandModule.java b/java/com/google/gerrit/acceptance/ssh/TestSshCommandModule.java new file mode 100644 index 0000000000..626092bdbd --- /dev/null +++ b/java/com/google/gerrit/acceptance/ssh/TestSshCommandModule.java @@ -0,0 +1,25 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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.acceptance.ssh; + +import com.google.gerrit.sshd.CommandModule; + +public class TestSshCommandModule extends CommandModule { + @Override + protected void configure() { + command("graceful").to(GracefulCommand.class); + command("non-graceful").to(NonGracefulCommand.class); + } +} diff --git a/java/com/google/gerrit/pgm/Daemon.java b/java/com/google/gerrit/pgm/Daemon.java index d2371e896e..a5c6dacbc4 100644 --- a/java/com/google/gerrit/pgm/Daemon.java +++ b/java/com/google/gerrit/pgm/Daemon.java @@ -189,6 +189,7 @@ public class Daemon extends SiteProgram { private AbstractModule luceneModule; private Module emailModule; private List testSysModules = new ArrayList<>(); + private List testSshModules = new ArrayList<>(); private Module auditEventModule; private Runnable serverStarted; @@ -319,6 +320,11 @@ public class Daemon extends SiteProgram { testSysModules.addAll(Arrays.asList(modules)); } + @VisibleForTesting + public void addAdditionalSshModuleForTesting(@Nullable Module... modules) { + testSshModules.addAll(Arrays.asList(modules)); + } + @VisibleForTesting public void start() throws IOException { if (dbInjector == null) { @@ -523,6 +529,8 @@ public class Daemon extends SiteProgram { slave, sysInjector.getInstance(DownloadConfig.class), sysInjector.getInstance(LfsPluginAuthCommand.Module.class))); + + modules.addAll(testSshModules); if (!slave) { modules.add(new IndexCommandsModule(sysInjector)); } diff --git a/java/com/google/gerrit/sshd/AbstractGitCommand.java b/java/com/google/gerrit/sshd/AbstractGitCommand.java index f617ebb79b..90f0c4365d 100644 --- a/java/com/google/gerrit/sshd/AbstractGitCommand.java +++ b/java/com/google/gerrit/sshd/AbstractGitCommand.java @@ -48,6 +48,7 @@ public abstract class AbstractGitCommand extends BaseCommand { @Override public void start(Environment env) { + enableGracefulStop(); Context ctx = context.subContext(newSession(), context.getCommandLine()); final Context old = sshScope.set(ctx); try { diff --git a/java/com/google/gerrit/sshd/BaseCommand.java b/java/com/google/gerrit/sshd/BaseCommand.java index 7c77a2c091..1d9635f108 100644 --- a/java/com/google/gerrit/sshd/BaseCommand.java +++ b/java/com/google/gerrit/sshd/BaseCommand.java @@ -401,6 +401,10 @@ public abstract class BaseCommand implements Command { } } + protected void enableGracefulStop() { + context.getSession().setGracefulStop(true); + } + protected String getTaskDescription() { String[] ta = getTrimmedArguments(); if (ta != null) { diff --git a/java/com/google/gerrit/sshd/SshDaemon.java b/java/com/google/gerrit/sshd/SshDaemon.java index b2548738b0..8265413d7b 100644 --- a/java/com/google/gerrit/sshd/SshDaemon.java +++ b/java/com/google/gerrit/sshd/SshDaemon.java @@ -88,6 +88,7 @@ import org.apache.sshd.common.mac.Mac; import org.apache.sshd.common.random.Random; import org.apache.sshd.common.random.SingletonRandomFactory; import org.apache.sshd.common.session.Session; +import org.apache.sshd.common.session.helpers.AbstractSession; import org.apache.sshd.common.session.helpers.DefaultUnknownChannelReferenceHandler; import org.apache.sshd.common.util.buffer.Buffer; import org.apache.sshd.common.util.buffer.ByteArrayBuffer; @@ -366,14 +367,24 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { Collection ioSessions = daemonAcceptor.getManagedSessions().values(); CountDownLatch allSessionsClosed = new CountDownLatch(ioSessions.size()); for (IoSession io : ioSessions) { - logger.atFine().log("Waiting for session %s to stop.", io.getId()); - io.addCloseFutureListener( - new SshFutureListener() { - @Override - public void operationComplete(CloseFuture future) { - allSessionsClosed.countDown(); - } - }); + AbstractSession serverSession = AbstractSession.getSession(io, true); + SshSession sshSession = + serverSession != null ? serverSession.getAttribute(SshSession.KEY) : null; + if (sshSession != null && sshSession.requiresGracefulStop()) { + logger.atFine().log("Waiting for session %s to stop.", io.getId()); + io.addCloseFutureListener( + new SshFutureListener() { + @Override + public void operationComplete(CloseFuture future) { + logger.atFine().log("Session %s was stopped.", io.getId()); + allSessionsClosed.countDown(); + } + }); + } else { + logger.atFine().log("Stopping session %s immediately.", io.getId()); + io.close(true); + allSessionsClosed.countDown(); + } } try { if (!allSessionsClosed.await(gracefulStopTimeout, TimeUnit.SECONDS)) { diff --git a/java/com/google/gerrit/sshd/SshSession.java b/java/com/google/gerrit/sshd/SshSession.java index 1a60a20f90..a2c3d93648 100644 --- a/java/com/google/gerrit/sshd/SshSession.java +++ b/java/com/google/gerrit/sshd/SshSession.java @@ -35,6 +35,8 @@ public class SshSession { private volatile String authError; private volatile String peerAgent; + private volatile boolean gracefulStop = false; + SshSession(int sessionId, SocketAddress peer) { this.sessionId = sessionId; this.remoteAddress = peer; @@ -58,6 +60,14 @@ public class SshSession { return sessionId; } + public boolean requiresGracefulStop() { + return gracefulStop; + } + + public void setGracefulStop(boolean gracefulStop) { + this.gracefulStop = gracefulStop; + } + /** Identity of the authenticated user account on the socket. */ public CurrentUser getUser() { return identity; diff --git a/javatests/com/google/gerrit/acceptance/ssh/SshDaemonIT.java b/javatests/com/google/gerrit/acceptance/ssh/SshDaemonIT.java new file mode 100644 index 0000000000..827c192765 --- /dev/null +++ b/javatests/com/google/gerrit/acceptance/ssh/SshDaemonIT.java @@ -0,0 +1,100 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// 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.acceptance.ssh; + +import com.google.common.flogger.FluentLogger; +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.NoHttpd; +import com.google.gerrit.acceptance.Sandboxed; +import com.google.gerrit.acceptance.UseSsh; +import com.google.gerrit.server.config.SitePaths; +import com.google.gerrit.server.restapi.config.ListTasks; +import com.google.gerrit.testing.ConfigSuite; +import com.google.inject.Inject; +import com.google.inject.Module; +import java.time.LocalDateTime; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.eclipse.jgit.lib.Config; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +@NoHttpd +@UseSsh +@Sandboxed +@RunWith(ConfigSuite.class) +@SuppressWarnings("unused") +public class SshDaemonIT extends AbstractDaemonTest { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + @Inject private ListTasks listTasks; + @Inject private SitePaths gerritSitePath; + + @ConfigSuite.Parameter protected Config config; + + @ConfigSuite.Config + public static Config gracefulConfig() { + Config config = new Config(); + config.setString("sshd", null, "gracefulStopTimeout", "10s"); + return config; + } + + @Override + public Module createSshModule() { + return new TestSshCommandModule(); + } + + public Future startCommand(String command) throws Exception { + Callable gracefulSession = + () -> { + int returnCode = -1; + logger.atFine().log("Before Command"); + returnCode = userSshSession.execAndReturnStatus(command); + logger.atFine().log("After Command"); + return returnCode; + }; + + ExecutorService executor = Executors.newFixedThreadPool(1); + Future future = executor.submit(gracefulSession); + + LocalDateTime timeout = LocalDateTime.now().plusSeconds(10); + + TestCommand.syncPoint.await(); + + return future; + } + + @Test + public void NonGracefulCommandIsStoppedImmediately() throws Exception { + Future future = startCommand("non-graceful -d 5"); + restart(); + Assert.assertTrue(future.get() == -1); + } + + @Test + public void GracefulCommandIsStoppedGracefully() throws Exception { + Future future = startCommand("graceful -d 5"); + restart(); + if (cfg.getTimeUnit("sshd", null, "gracefulStopTimeout", 0, TimeUnit.SECONDS) == 0) { + Assert.assertTrue(future.get() == -1); + } else { + Assert.assertTrue(future.get() == 0); + } + } +} From 2911eab289cfd8fca023f6b4fb8316365658cbdf Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Thu, 6 Aug 2020 09:25:43 +0200 Subject: [PATCH 03/43] Register graceful shutdown for apropos command Change-Id: Iae08901c6d5fcc75b9fe0afb6e3b2d3fc03b897d --- java/com/google/gerrit/sshd/commands/AproposCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/AproposCommand.java b/java/com/google/gerrit/sshd/commands/AproposCommand.java index d3db70d1db..e7a88a1836 100644 --- a/java/com/google/gerrit/sshd/commands/AproposCommand.java +++ b/java/com/google/gerrit/sshd/commands/AproposCommand.java @@ -39,6 +39,7 @@ final class AproposCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); try { List res = searcher.doQuery(q); for (DocResult docResult : res) { From dd8022113eb430e64aea49e8ad36cfaac55ae58c Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:19:31 +0200 Subject: [PATCH 04/43] Register graceful shutdown for ban commit command Change-Id: If3476d2dbf292a5fcb9786dacdaf7b5dfe43524d --- java/com/google/gerrit/sshd/commands/BanCommitCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/BanCommitCommand.java b/java/com/google/gerrit/sshd/commands/BanCommitCommand.java index 415ac4c774..42e5624718 100644 --- a/java/com/google/gerrit/sshd/commands/BanCommitCommand.java +++ b/java/com/google/gerrit/sshd/commands/BanCommitCommand.java @@ -63,6 +63,7 @@ public class BanCommitCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); try { BanCommitInput input = BanCommitInput.fromCommits(Lists.transform(commitsToBan, ObjectId::getName)); From ae8f8cf9591665bb5bac50c698d9660b07245bc5 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:20:48 +0200 Subject: [PATCH 05/43] Register graceful shutdown for prolog test commands Change-Id: I651fdebcfae37de96aea2c4f0575a3f2582e139d --- java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java b/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java index d70c153ae0..ad8e20d7db 100644 --- a/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java +++ b/java/com/google/gerrit/sshd/commands/BaseTestPrologCommand.java @@ -59,6 +59,7 @@ abstract class BaseTestPrologCommand extends SshCommand { @Override protected final void run() throws UnloggedFailure { + enableGracefulStop(); try { RevisionResource revision = revisions.parse( From 5401ca4db3b63eafb6d909d1815160e0754b97c2 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:21:43 +0200 Subject: [PATCH 06/43] Register graceful shutdown for close connection command Change-Id: I17ec7b2e853da8fefeaa65a3c8b5e9926558ed05 --- java/com/google/gerrit/sshd/commands/CloseConnection.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/CloseConnection.java b/java/com/google/gerrit/sshd/commands/CloseConnection.java index 60a878a62c..6cd009b54b 100644 --- a/java/com/google/gerrit/sshd/commands/CloseConnection.java +++ b/java/com/google/gerrit/sshd/commands/CloseConnection.java @@ -60,6 +60,7 @@ final class CloseConnection extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); IoAcceptor acceptor = sshDaemon.getIoAcceptor(); if (acceptor == null) { throw new Failure(1, "fatal: sshd no longer running"); From 868081722294693adc2a931c2d01cdf9da11be22 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:24:43 +0200 Subject: [PATCH 07/43] Register graceful shutdown for create account command Change-Id: Ic09bd038de934d54189ad3a4bb6da0bfc4fb2940 --- java/com/google/gerrit/sshd/commands/CreateAccountCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java b/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java index 8875f07a84..00fc20fc02 100644 --- a/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java +++ b/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java @@ -72,6 +72,7 @@ final class CreateAccountCommand extends SshCommand { @Override protected void run() throws IOException, ConfigInvalidException, UnloggedFailure, PermissionBackendException { + enableGracefulStop(); AccountInput input = new AccountInput(); input.username = username; input.email = email; From ae09b5a9b01b6637e4cb78e0ba4b773d701538ef Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:25:52 +0200 Subject: [PATCH 08/43] Register graceful shutdown for create branch command Change-Id: Ifefdb252c8698b0e62f6ff6735274039d94fd032 --- java/com/google/gerrit/sshd/commands/CreateBranchCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java b/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java index aad96a171d..a837ecda79 100644 --- a/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java +++ b/java/com/google/gerrit/sshd/commands/CreateBranchCommand.java @@ -44,6 +44,7 @@ public final class CreateBranchCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); try { BranchInput in = new BranchInput(); in.revision = revision; From b83cf176e430398ce50392d9846db8f0fe16d537 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:26:25 +0200 Subject: [PATCH 09/43] Register graceful shutdown for create group command Change-Id: I35c460b3a4b1781a9a4b8092689d13201d2252e0 --- java/com/google/gerrit/sshd/commands/CreateGroupCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java b/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java index f9a04a072e..8169901677 100644 --- a/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java +++ b/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java @@ -102,6 +102,7 @@ final class CreateGroupCommand extends SshCommand { @Override protected void run() throws Failure, IOException, ConfigInvalidException, PermissionBackendException { + enableGracefulStop(); try { GroupResource rsrc = createGroup(); From 7892f5320df752883b47e1b29591313303f7b8eb Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:26:55 +0200 Subject: [PATCH 10/43] Register graceful shutdown for create project command Change-Id: I8fbcae4e57dbbb91f841db19b4bbbb1de7beb6d0 --- java/com/google/gerrit/sshd/commands/CreateProjectCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java index df86d63807..ad7021b12c 100644 --- a/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java +++ b/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java @@ -166,6 +166,7 @@ final class CreateProjectCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); try { if (!suggestParent) { if (projectName == null) { From 4635158cef7dd3f4f45917c0ed94e34fce12c056 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:29:38 +0200 Subject: [PATCH 11/43] Register graceful shutdown for flush caches command Change-Id: I487015c59a0787b10047b81ad1f9b73aa10dbd88 --- java/com/google/gerrit/sshd/commands/FlushCaches.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/FlushCaches.java b/java/com/google/gerrit/sshd/commands/FlushCaches.java index 3a06660513..e048eae557 100644 --- a/java/com/google/gerrit/sshd/commands/FlushCaches.java +++ b/java/com/google/gerrit/sshd/commands/FlushCaches.java @@ -56,6 +56,7 @@ final class FlushCaches extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); try { if (list) { if (all || !caches.isEmpty()) { From 224b95e7778cbcbf5f52613ad5bacd40cf8da3f8 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:30:12 +0200 Subject: [PATCH 12/43] Register graceful shutdown for gc command Change-Id: Ib7fb8c3a20c0b7ae376bfffb4eee7f3ead5a4b9f --- .../google/gerrit/sshd/commands/GarbageCollectionCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java index ecbb3733c1..97737b0e01 100644 --- a/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java +++ b/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java @@ -62,6 +62,7 @@ public class GarbageCollectionCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); verifyCommandLine(); runGC(); } From 574342abe44c319d49411be7276b9794152bea31 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:30:45 +0200 Subject: [PATCH 13/43] Register graceful shutdown for index activate command Change-Id: I40f414ce86ed3ee486ee9c90c01bbcbf394cea7f --- java/com/google/gerrit/sshd/commands/IndexActivateCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java b/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java index 0804d08c3e..30dc5c485b 100644 --- a/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java +++ b/java/com/google/gerrit/sshd/commands/IndexActivateCommand.java @@ -34,6 +34,7 @@ public class IndexActivateCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); try { if (versionManager.isKnownIndex(name)) { if (versionManager.activateLatestIndex(name)) { From 257199a2d19aea0d9e24bd53a59125951b85a2a4 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:31:30 +0200 Subject: [PATCH 14/43] Register graceful shutdown for index changes command Change-Id: Ifce8627912878e989c36f765ce5b5847e87d48ac --- java/com/google/gerrit/sshd/commands/IndexChangesCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java b/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java index 5aa2ec814d..376b8370fa 100644 --- a/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java +++ b/java/com/google/gerrit/sshd/commands/IndexChangesCommand.java @@ -53,6 +53,7 @@ final class IndexChangesCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); boolean ok = true; for (ChangeResource rsrc : changes.values()) { try { From 77bcb13bfb83debda62fc6f2a4a1a053c65a92e9 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:32:22 +0200 Subject: [PATCH 15/43] Register graceful shutdown for index changes in project command Change-Id: I4b987489ec4146253ca2a491d850de6f2dd0cd1e --- .../gerrit/sshd/commands/IndexChangesInProjectCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java b/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java index 56b00a573d..168dc19755 100644 --- a/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java +++ b/java/com/google/gerrit/sshd/commands/IndexChangesInProjectCommand.java @@ -43,6 +43,7 @@ final class IndexChangesInProjectCommand extends SshCommand { @Override protected void run() throws UnloggedFailure, Failure, Exception { + enableGracefulStop(); if (projects.isEmpty()) { throw die("needs at least one project as command arguments"); } From 36822261266fbe6dc1868edf3151af49d31dcd9e Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:32:55 +0200 Subject: [PATCH 16/43] Register graceful shutdown for index start command Change-Id: I6363054c7be1568c4a0c29da289fc2baeee27c76 --- java/com/google/gerrit/sshd/commands/IndexStartCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/IndexStartCommand.java b/java/com/google/gerrit/sshd/commands/IndexStartCommand.java index f3d349c809..5433b174d3 100644 --- a/java/com/google/gerrit/sshd/commands/IndexStartCommand.java +++ b/java/com/google/gerrit/sshd/commands/IndexStartCommand.java @@ -38,6 +38,7 @@ public class IndexStartCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); try { if (versionManager.isKnownIndex(name)) { if (versionManager.startReindexer(name, force)) { From b016e3acf9b98617e30d7bc407f18c77689ca666 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:33:15 +0200 Subject: [PATCH 17/43] Register graceful shutdown for kill command Change-Id: I24dfff06ee04fd5fe67846e2084749d3f700af03 --- java/com/google/gerrit/sshd/commands/KillCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/KillCommand.java b/java/com/google/gerrit/sshd/commands/KillCommand.java index df74f86366..a633a8a932 100644 --- a/java/com/google/gerrit/sshd/commands/KillCommand.java +++ b/java/com/google/gerrit/sshd/commands/KillCommand.java @@ -47,6 +47,7 @@ final class KillCommand extends SshCommand { @Override protected void run() { + enableGracefulStop(); ConfigResource cfgRsrc = new ConfigResource(); for (String id : taskIds) { try { From 42e806ed66ea3cf39aa2caaa1430552fffa5d238 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:36:50 +0200 Subject: [PATCH 18/43] Register graceful shutdown for list groups command Change-Id: Ie9d336a9bc278b21026b7094387d5b9d40a053e8 --- java/com/google/gerrit/sshd/commands/ListGroupsCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java b/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java index f3ba308277..a6fe833479 100644 --- a/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java +++ b/java/com/google/gerrit/sshd/commands/ListGroupsCommand.java @@ -52,6 +52,7 @@ public class ListGroupsCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); if (listGroups.getUser() != null && !listGroups.getProjects().isEmpty()) { throw die("--user and --project options are not compatible."); } From 168fe9de6d4a9e8cc9a648ab7af4f4d717f46d33 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:37:17 +0200 Subject: [PATCH 19/43] Register graceful shutdown for list logging level command Change-Id: I987e8462caede27cd4a3ff8dc816ad7c5d3f73c6 --- .../com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java b/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java index c8b8fa111d..1a7be32338 100644 --- a/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java +++ b/java/com/google/gerrit/sshd/commands/ListLoggingLevelCommand.java @@ -40,6 +40,7 @@ public class ListLoggingLevelCommand extends SshCommand { @SuppressWarnings("unchecked") @Override protected void run() { + enableGracefulStop(); Map logs = new TreeMap<>(); for (Enumeration logger = LogManager.getCurrentLoggers(); logger.hasMoreElements(); ) { Logger log = logger.nextElement(); From c17a526ea525c16a40e68412122b57f6cbc92ca1 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:38:21 +0200 Subject: [PATCH 20/43] Register graceful shutdown for list members command Change-Id: I5d7c5bbf9da2b788d8127b581a21fbd4d56e4f8a --- java/com/google/gerrit/sshd/commands/ListMembersCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ListMembersCommand.java b/java/com/google/gerrit/sshd/commands/ListMembersCommand.java index 1565ecb8bc..53d4ac6407 100644 --- a/java/com/google/gerrit/sshd/commands/ListMembersCommand.java +++ b/java/com/google/gerrit/sshd/commands/ListMembersCommand.java @@ -45,6 +45,7 @@ public class ListMembersCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); impl.display(stdout); } From 27962d347acd7d2d5098b68d00ce69152f61e947 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:40:16 +0200 Subject: [PATCH 21/43] Register graceful shutdown for list projects command Change-Id: I6821eb0a6f4c165a1500c265ee45059202f07f9b --- java/com/google/gerrit/sshd/commands/ListProjectsCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java index 9f2ffa9772..e711d57a97 100644 --- a/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java +++ b/java/com/google/gerrit/sshd/commands/ListProjectsCommand.java @@ -32,6 +32,7 @@ public class ListProjectsCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); if (!impl.getFormat().isJson()) { List showBranch = impl.getShowBranch(); if (impl.isShowTree() && (showBranch != null) && !showBranch.isEmpty()) { From b2ca23f3f6e5af1cfdb7f34b73b4e0af54c3f91b Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:46:59 +0200 Subject: [PATCH 22/43] Register graceful shutdown for list user refs command Change-Id: I7065715347d869a9c6a8b558e2950b6137523450 --- java/com/google/gerrit/sshd/commands/LsUserRefs.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/java/com/google/gerrit/sshd/commands/LsUserRefs.java index f26a4fa5d7..a1af9a084b 100644 --- a/java/com/google/gerrit/sshd/commands/LsUserRefs.java +++ b/java/com/google/gerrit/sshd/commands/LsUserRefs.java @@ -74,6 +74,7 @@ public class LsUserRefs extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); Account.Id userAccountId; try { userAccountId = accountResolver.resolve(userName).asUnique().getAccount().getId(); From 401bebf2d966a49bacd1404242ac2a1b205b1e82 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:48:20 +0200 Subject: [PATCH 23/43] Register graceful shutdown for plugin admin commands Change-Id: I9ed4cd92b6bbd43a335721b1f9f22b62ddf8a070 --- java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java b/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java index 7e32615180..086081c6d3 100644 --- a/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java +++ b/java/com/google/gerrit/sshd/commands/PluginAdminSshCommand.java @@ -28,6 +28,7 @@ public abstract class PluginAdminSshCommand extends SshCommand { @Override protected final void run() throws UnloggedFailure { + enableGracefulStop(); if (!loader.isRemoteAdminEnabled()) { throw die("remote plugin administration is disabled"); } From 4e1b483034cb81fc12c9a3d6d912fbac65c970c1 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:48:57 +0200 Subject: [PATCH 24/43] Register graceful shutdown for list plugins command Change-Id: I13d8e93b81154e772bc0b8a255a3a9284aa73e39 --- java/com/google/gerrit/sshd/commands/PluginLsCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/PluginLsCommand.java b/java/com/google/gerrit/sshd/commands/PluginLsCommand.java index 4effa3aeba..7216ed9bbd 100644 --- a/java/com/google/gerrit/sshd/commands/PluginLsCommand.java +++ b/java/com/google/gerrit/sshd/commands/PluginLsCommand.java @@ -41,6 +41,7 @@ public class PluginLsCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); Map output = list.apply(TopLevelResource.INSTANCE); if (format.isJson()) { From b7241a8e2f40193876e815a48563753ebb6be206 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:49:48 +0200 Subject: [PATCH 25/43] Register graceful shutdown for query command Change-Id: Ia9982740a041ad579f4fbeda5e4b204d0e1be4d9 --- java/com/google/gerrit/sshd/commands/Query.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/Query.java b/java/com/google/gerrit/sshd/commands/Query.java index 78485d3442..772eabe085 100644 --- a/java/com/google/gerrit/sshd/commands/Query.java +++ b/java/com/google/gerrit/sshd/commands/Query.java @@ -106,6 +106,7 @@ public class Query extends SshCommand implements DynamicOptions.BeanReceiver { @Override protected void run() throws Exception { + enableGracefulStop(); processor.query(join(query, " ")); } From 492b1cfb5512e001078ff6a20b87675a7318316c Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:52:33 +0200 Subject: [PATCH 26/43] Register graceful shutdown for reload config command Change-Id: I80163c71e67a671482975bab5c35705f659374af --- java/com/google/gerrit/sshd/commands/ReloadConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ReloadConfig.java b/java/com/google/gerrit/sshd/commands/ReloadConfig.java index cbe3c57031..eeb48bb864 100644 --- a/java/com/google/gerrit/sshd/commands/ReloadConfig.java +++ b/java/com/google/gerrit/sshd/commands/ReloadConfig.java @@ -38,6 +38,7 @@ public class ReloadConfig extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); Multimap updates = gerritServerConfigReloader.reloadConfig(); if (updates.isEmpty()) { stdout.println("No config entries updated!"); From d06ea9ce3907d7268638281e02fa7f968b354813 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:53:25 +0200 Subject: [PATCH 27/43] Register graceful shutdown for rename group command Change-Id: I8b82ddc169583d97e7bf79a89dd0c09d7c900202 --- java/com/google/gerrit/sshd/commands/RenameGroupCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java b/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java index 166ad68c67..976e7bd789 100644 --- a/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java +++ b/java/com/google/gerrit/sshd/commands/RenameGroupCommand.java @@ -46,6 +46,7 @@ public class RenameGroupCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); try { GroupResource rsrc = groups.parse(TopLevelResource.INSTANCE, IdString.fromDecoded(groupName)); NameInput input = new NameInput(); From 39e23e6052282fe2af103e8ed41451cf27525819 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:53:59 +0200 Subject: [PATCH 28/43] Register graceful shutdown for review command Change-Id: I6d1300b409d7847b9c31921341c575c9f80aad67 --- java/com/google/gerrit/sshd/commands/ReviewCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/java/com/google/gerrit/sshd/commands/ReviewCommand.java index 0af8936555..4202aac9d4 100644 --- a/java/com/google/gerrit/sshd/commands/ReviewCommand.java +++ b/java/com/google/gerrit/sshd/commands/ReviewCommand.java @@ -166,6 +166,7 @@ public class ReviewCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); if (abandonChange) { if (restoreChange) { throw die("abandon and restore actions are mutually exclusive"); From bb966d818cd81ce2e323b3e27571687cf2df24db Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:54:23 +0200 Subject: [PATCH 29/43] Register graceful shutdown for set account command Change-Id: Ifcaf64faef608e8fe7a793993469e72b7730badd --- java/com/google/gerrit/sshd/commands/SetAccountCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/java/com/google/gerrit/sshd/commands/SetAccountCommand.java index 8a72de6a15..1ecb591d8d 100644 --- a/java/com/google/gerrit/sshd/commands/SetAccountCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetAccountCommand.java @@ -154,6 +154,7 @@ final class SetAccountCommand extends SshCommand { @Override public void run() throws Exception { + enableGracefulStop(); user = genericUserFactory.create(id); validate(); From f46ba3536260304e552a4ab2c2511934bbffd2b9 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:54:42 +0200 Subject: [PATCH 30/43] Register graceful shutdown for set head command Change-Id: I69ef1999edc4505cbc38f04ccf997164f0fb70d8 --- java/com/google/gerrit/sshd/commands/SetHeadCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetHeadCommand.java b/java/com/google/gerrit/sshd/commands/SetHeadCommand.java index fd7ef75e55..b6d283eb02 100644 --- a/java/com/google/gerrit/sshd/commands/SetHeadCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetHeadCommand.java @@ -43,6 +43,7 @@ public class SetHeadCommand extends SshCommand { @Override protected void run() throws Exception { + enableGracefulStop(); HeadInput input = new HeadInput(); input.ref = newHead; try { From df97caf5c796da733716eb31b0ff78425c294900 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:55:06 +0200 Subject: [PATCH 31/43] Register graceful shutdown for set logging level command Change-Id: I6017221ba6549f2d792f26f8fef409eac40fcd2e --- java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java b/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java index cfdd73562c..3faf5989a4 100644 --- a/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetLoggingLevelCommand.java @@ -61,6 +61,7 @@ public class SetLoggingLevelCommand extends SshCommand { @SuppressWarnings("unchecked") @Override protected void run() throws MalformedURLException { + enableGracefulStop(); if (level == LevelOption.RESET) { reset(); } else { From 0bb4db5f25e70f46531e2f2eac013495170f14a8 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:55:32 +0200 Subject: [PATCH 32/43] Register graceful shutdown for set members command Change-Id: I587e5f5f198e5479fed4eb1ab40cd501510d48a1 --- java/com/google/gerrit/sshd/commands/SetMembersCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetMembersCommand.java b/java/com/google/gerrit/sshd/commands/SetMembersCommand.java index 324257b93a..5557b16ace 100644 --- a/java/com/google/gerrit/sshd/commands/SetMembersCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetMembersCommand.java @@ -102,6 +102,7 @@ public class SetMembersCommand extends SshCommand { @Override protected void run() throws UnloggedFailure, Failure, Exception { + enableGracefulStop(); try { for (AccountGroup.UUID groupUuid : groups) { GroupResource resource = From 107cb1742b2eb8f7c0f3545596665fd819a97895 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:56:01 +0200 Subject: [PATCH 33/43] Register graceful shutdown for set parent command Change-Id: I4cef5226721f3484f7467770eae515ae1107ca50 --- java/com/google/gerrit/sshd/commands/SetParentCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetParentCommand.java b/java/com/google/gerrit/sshd/commands/SetParentCommand.java index dfdf7f25c1..87722d926b 100644 --- a/java/com/google/gerrit/sshd/commands/SetParentCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetParentCommand.java @@ -90,6 +90,7 @@ final class SetParentCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); if (oldParent == null && children.isEmpty()) { throw die( "child projects have to be specified as " From a82be3a383aa4608c91c1c4b9abe08f5c61f04ab Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:56:28 +0200 Subject: [PATCH 34/43] Register graceful shutdown for set project command Change-Id: Ic29c374c63706f8b773b982b3e427720bc531848 --- java/com/google/gerrit/sshd/commands/SetProjectCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetProjectCommand.java b/java/com/google/gerrit/sshd/commands/SetProjectCommand.java index 8c9fc9fa5b..9866c4e4e8 100644 --- a/java/com/google/gerrit/sshd/commands/SetProjectCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetProjectCommand.java @@ -132,6 +132,7 @@ final class SetProjectCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); ConfigInput configInput = new ConfigInput(); configInput.requireChangeId = requireChangeID; configInput.submitType = submitType; From 72722e2a423161a22fa6b7ce2193ff8ae02d26dc Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:56:52 +0200 Subject: [PATCH 35/43] Register graceful shutdown for set reviewers command Change-Id: If1786afae874140204c466ea58a5a0ae92a955bf --- java/com/google/gerrit/sshd/commands/SetReviewersCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java index 30caa434fc..5a04026638 100644 --- a/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java +++ b/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java @@ -96,6 +96,7 @@ public class SetReviewersCommand extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); boolean ok = true; for (ChangeResource rsrc : changes.values()) { try { From b347a4d0c3a9effe948df5b2a6106cb2fd12f901 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:57:53 +0200 Subject: [PATCH 36/43] Register graceful shutdown for show caches command Change-Id: Ibcb051910ed07a4c3368fbbdc3b215a85657457b --- java/com/google/gerrit/sshd/commands/ShowCaches.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ShowCaches.java b/java/com/google/gerrit/sshd/commands/ShowCaches.java index f2a983158b..039b74e3d6 100644 --- a/java/com/google/gerrit/sshd/commands/ShowCaches.java +++ b/java/com/google/gerrit/sshd/commands/ShowCaches.java @@ -111,6 +111,7 @@ final class ShowCaches extends SshCommand { @Override protected void run() throws UnloggedFailure { + enableGracefulStop(); nw = columns - 50; Date now = new Date(); stdout.format( From 5b8ac0fb5e6973411eb934e42e1f696f59b69991 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:58:16 +0200 Subject: [PATCH 37/43] Register graceful shutdown for show connections command Change-Id: I24bfe9c6ea4a43ad10c294ae44d5d3fa1b3a7bec --- java/com/google/gerrit/sshd/commands/ShowConnections.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ShowConnections.java b/java/com/google/gerrit/sshd/commands/ShowConnections.java index d579ef68a7..52e824b483 100644 --- a/java/com/google/gerrit/sshd/commands/ShowConnections.java +++ b/java/com/google/gerrit/sshd/commands/ShowConnections.java @@ -85,6 +85,7 @@ final class ShowConnections extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); final IoAcceptor acceptor = daemon.getIoAcceptor(); if (acceptor == null) { throw new Failure(1, "fatal: sshd no longer running"); From 4048e47eb420be2b42fc997a6756ec0dffbd589d Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:58:39 +0200 Subject: [PATCH 38/43] Register graceful shutdown for show queue command Change-Id: I9511c966379e77877e872b59f50c3e8d1e9ce3da --- java/com/google/gerrit/sshd/commands/ShowQueue.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/ShowQueue.java b/java/com/google/gerrit/sshd/commands/ShowQueue.java index 2a7bd6e0a5..04d06eebb9 100644 --- a/java/com/google/gerrit/sshd/commands/ShowQueue.java +++ b/java/com/google/gerrit/sshd/commands/ShowQueue.java @@ -84,6 +84,7 @@ final class ShowQueue extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); maxCommandWidth = wide ? Integer.MAX_VALUE : columns - 8 - 12 - 12 - 4 - 4; stdout.print( String.format( From 0d535305cdac06ff3b71c6f329fb2ef873c63720 Mon Sep 17 00:00:00 2001 From: Thomas Draebing Date: Wed, 12 Aug 2020 15:59:09 +0200 Subject: [PATCH 39/43] Register graceful shutdown for version command Change-Id: I0522561d9153f4963289bbc69fdb23b383ea0809 --- java/com/google/gerrit/sshd/commands/VersionCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/com/google/gerrit/sshd/commands/VersionCommand.java b/java/com/google/gerrit/sshd/commands/VersionCommand.java index 8fac979be2..f8771fb21f 100644 --- a/java/com/google/gerrit/sshd/commands/VersionCommand.java +++ b/java/com/google/gerrit/sshd/commands/VersionCommand.java @@ -25,6 +25,7 @@ final class VersionCommand extends SshCommand { @Override protected void run() throws Failure { + enableGracefulStop(); String v = Version.getVersion(); if (v == null) { throw new Failure(1, "fatal: version unavailable"); From 7eb5e38d123d0f93e2c78b463d4a584510ad60d4 Mon Sep 17 00:00:00 2001 From: Nasser Grainawi Date: Fri, 2 Oct 2020 09:34:58 -0600 Subject: [PATCH 40/43] Update git submodules * Update plugins/replication from branch 'stable-3.1' to 4eb0b9c0335ed702f6679bfdce17ddbaf143eee9 - Remove disableDeleteForTesting flag Instrumenting the actual code to make tests work is generally a bad practice that can let real issues slip into production code. Removing this flag "Just Works" after fixing one ReplicationFanoutIT test with buggy replicationDelay settings (the parent change of this one). Change-Id: Ia93192eeff0fb76c5c100de597a017b8b1f86025 --- plugins/replication | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/replication b/plugins/replication index b947f25418..4eb0b9c033 160000 --- a/plugins/replication +++ b/plugins/replication @@ -1 +1 @@ -Subproject commit b947f25418737f604d85543595026837e1fabb60 +Subproject commit 4eb0b9c0335ed702f6679bfdce17ddbaf143eee9 From 0326b51e7fdffeda1240f93e7f82b3bc51ade583 Mon Sep 17 00:00:00 2001 From: Marco Miller Date: Fri, 2 Oct 2020 13:59:58 -0400 Subject: [PATCH 41/43] Upgrade jackson-core to 2.11.3 Change-Id: I085b9a39f6203192d1edbd78d9a85d8db8db4c89 --- tools/nongoogle.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/nongoogle.bzl b/tools/nongoogle.bzl index 9c664310ad..e4faf18c21 100644 --- a/tools/nongoogle.bzl +++ b/tools/nongoogle.bzl @@ -100,8 +100,8 @@ def declare_nongoogle_deps(): maven_jar( name = "jackson-core", - artifact = "com.fasterxml.jackson.core:jackson-core:2.11.2", - sha1 = "bc022ab0f0c83c07f9c52c5ab9a6a4932b15cc35", + artifact = "com.fasterxml.jackson.core:jackson-core:2.11.3", + sha1 = "c2351800432bdbdd8284c3f5a7f0782a352aa84a", ) # Google internal dependencies: these are developed at Google, so there is From 891f1e1cf2d60caf3622232e45df8eec0a313fda Mon Sep 17 00:00:00 2001 From: Marco Miller Date: Fri, 2 Oct 2020 14:36:36 -0400 Subject: [PATCH 42/43] Bump Bazel version to 3.5.1 This latest release includes cherry picks, a new feature and some important changes [1]. [1] https://github.com/bazelbuild/bazel/releases/tag/3.5.1 Change-Id: I07c9c954102b6ae9117b4495ef68ee4fb69a5212 --- .bazelversion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelversion b/.bazelversion index 1545d96657..d5c0c99142 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -3.5.0 +3.5.1 From f091a0da13b45e9a6ced6df011c55a1d290cdb2d Mon Sep 17 00:00:00 2001 From: Marco Miller Date: Mon, 5 Oct 2020 10:21:42 -0400 Subject: [PATCH 43/43] Update git submodules * Update plugins/replication from branch 'stable-3.1' to b6796ac413055b05ff599f08e020321d9195f2b6 - Merge branch 'stable-3.0' into stable-3.1 * stable-3.0: Make the shouldReplicateNewProject test more reliable Change-Id: I40ecf25a108f2dfd0926b3fb6ba166a77cf0f039 - Merge branch 'stable-2.16' into stable-3.0 * stable-2.16: Make the shouldReplicateNewProject test more reliable Change-Id: I447043d502987070bc395936484a1cb23a5ddabc - Make the shouldReplicateNewProject test more reliable The ReplicationIT shouldReplicateNewProject was failing regularly on my machine. Improve the timeout for this test so that it explicitly includes the time needed to wait for the project to be created, not just the scheduling and retry times. Change-Id: Ibf3cc3506991b222ded3ee4ddfbd7e2d60341d60 --- plugins/replication | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/replication b/plugins/replication index 4eb0b9c033..b6796ac413 160000 --- a/plugins/replication +++ b/plugins/replication @@ -1 +1 @@ -Subproject commit 4eb0b9c0335ed702f6679bfdce17ddbaf143eee9 +Subproject commit b6796ac413055b05ff599f08e020321d9195f2b6