This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new 02fce57f08d SOLR-16398 | Added V2 APIs to enable and disable polling
(#5272)
02fce57f08d is described below
commit 02fce57f08dcb2ca5e930f60446dbe60dce382e4
Author: Jalaz Kumar <[email protected]>
AuthorDate: Tue Nov 3 19:59:11 2026 +0530
SOLR-16398 | Added V2 APIs to enable and disable polling (#5272)
Co-authored-by: Eric Pugh <[email protected]>
Co-authored-by: Claude Sonnet 5 <[email protected]>
---
.../unreleased/SOLR-16398-disable-enable-poll.yml | 8 ++
.../solr/client/api/endpoint/ReplicationApis.java | 10 ++
.../api/model/ReplicationPollingRequestBody.java | 26 ++++
.../apache/solr/handler/ReplicationHandler.java | 38 +++---
.../solr/handler/admin/api/CoreReplication.java | 7 ++
.../solr/handler/admin/api/ReplicationAPIBase.java | 12 ++
.../handler/admin/api/CoreReplicationAPITest.java | 38 ++++++
.../admin/api/SetReplicationPollingAPITest.java | 133 +++++++++++++++++++++
.../pages/user-managed-index-replication.adoc | 38 ++++++
.../web/js/angular/controllers/replication.js | 9 ++
solr/webapp/web/partials/replication.html | 4 +-
11 files changed, 305 insertions(+), 18 deletions(-)
diff --git a/changelog/unreleased/SOLR-16398-disable-enable-poll.yml
b/changelog/unreleased/SOLR-16398-disable-enable-poll.yml
new file mode 100644
index 00000000000..a9c95729cb5
--- /dev/null
+++ b/changelog/unreleased/SOLR-16398-disable-enable-poll.yml
@@ -0,0 +1,8 @@
+title: Added V2 APIs to enable and disable polling of a leader from its
follower
+type: added
+authors:
+ - name: Jalaz Kumar
+ nick: jaykay12
+links:
+ - name: SOLR-16398
+ url: https://issues.apache.org/jira/browse/SOLR-16398
diff --git
a/solr/api/src/java/org/apache/solr/client/api/endpoint/ReplicationApis.java
b/solr/api/src/java/org/apache/solr/client/api/endpoint/ReplicationApis.java
index 3457528fa2f..27f7c42621a 100644
--- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ReplicationApis.java
+++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ReplicationApis.java
@@ -36,6 +36,7 @@ import org.apache.solr.client.api.model.FileListResponse;
import org.apache.solr.client.api.model.IndexVersionResponse;
import org.apache.solr.client.api.model.ReplicationDetailsResponse;
import org.apache.solr.client.api.model.ReplicationEnabledRequestBody;
+import org.apache.solr.client.api.model.ReplicationPollingRequestBody;
import org.apache.solr.client.api.model.RestoreStatusResponse;
import org.apache.solr.client.api.model.SolrJerseyResponse;
import org.apache.solr.client.api.util.CoreApiParameters;
@@ -136,4 +137,13 @@ public interface ReplicationApis {
tags = {"replication"})
SolrJerseyResponse setReplicationEnabled(
@RequestBody(required = true) ReplicationEnabledRequestBody requestBody);
+
+ @PUT
+ @CoreApiParameters
+ @Path("/polling")
+ @Operation(
+ summary = "Enable or disable polling of the leader by a follower.",
+ tags = {"replication"})
+ SolrJerseyResponse setReplicationPolling(
+ @RequestBody(required = true) ReplicationPollingRequestBody requestBody);
}
diff --git
a/solr/api/src/java/org/apache/solr/client/api/model/ReplicationPollingRequestBody.java
b/solr/api/src/java/org/apache/solr/client/api/model/ReplicationPollingRequestBody.java
new file mode 100644
index 00000000000..8d550206a3a
--- /dev/null
+++
b/solr/api/src/java/org/apache/solr/client/api/model/ReplicationPollingRequestBody.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.solr.client.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/** Request body for enabling and disabling polling of the leader by a
follower. */
+public class ReplicationPollingRequestBody {
+
+ @JsonProperty(required = true)
+ public Boolean enabled;
+}
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index 40943072223..d9e6658fc9f 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -83,6 +83,7 @@ import
org.apache.solr.client.api.model.ReplicationDetailsResponse;
import
org.apache.solr.client.api.model.ReplicationDetailsResponse.FollowerDetails;
import
org.apache.solr.client.api.model.ReplicationDetailsResponse.LeaderDetails;
import
org.apache.solr.client.api.model.ReplicationDetailsResponse.ReplicationDetails;
+import org.apache.solr.client.api.model.ReplicationPollingRequestBody;
import org.apache.solr.client.api.model.RestoreStatusResponse;
import org.apache.solr.client.api.model.RestoreStatusResponse.RestoreState;
import org.apache.solr.client.api.model.RestoreStatusResponse.RestoreStatus;
@@ -331,9 +332,9 @@ public class ReplicationHandler extends RequestHandlerBase
} else if (command.equalsIgnoreCase(CMD_FETCH_INDEX)) {
fetchIndex(solrParams, rsp);
} else if (command.equalsIgnoreCase(CMD_DISABLE_POLL)) {
- disablePoll(rsp);
+ respondWithPollingEnabled(false, req, rsp);
} else if (command.equalsIgnoreCase(CMD_ENABLE_POLL)) {
- enablePoll(rsp);
+ respondWithPollingEnabled(true, req, rsp);
} else if (command.equalsIgnoreCase(CMD_ABORT_FETCH)) {
if (abortFetch()) {
rsp.add(STATUS, OK_STATUS);
@@ -856,23 +857,28 @@ public class ReplicationHandler extends RequestHandlerBase
}
}
- private void disablePoll(SolrQueryResponse rsp) {
- if (pollingIndexFetcher != null) {
- pollDisabled.set(true);
- log.info("inside disable poll, value of pollDisabled = {}",
pollDisabled);
- rsp.add(STATUS, OK_STATUS);
- } else {
- reportErrorOnResponse(rsp, "No follower configured", null);
- }
+ /**
+ * Enables or disables polling of the leader.
+ *
+ * @return false if this core is not configured as a follower
+ */
+ public boolean setPollingEnabled(boolean enabled) {
+ if (pollingIndexFetcher == null) return false;
+ pollDisabled.set(!enabled);
+ log.info(
+ "polling {}, value of pollDisabled = {}", enabled ? "enabled" :
"disabled", pollDisabled);
+ return true;
}
- private void enablePoll(SolrQueryResponse rsp) {
- if (pollingIndexFetcher != null) {
- pollDisabled.set(false);
- log.info("inside enable poll, value of pollDisabled = {}", pollDisabled);
+ private void respondWithPollingEnabled(
+ boolean enabled, SolrQueryRequest req, SolrQueryResponse rsp) {
+ final ReplicationPollingRequestBody requestBody = new
ReplicationPollingRequestBody();
+ requestBody.enabled = enabled;
+ try {
+ new CoreReplication(core, req, rsp).setReplicationPolling(requestBody);
rsp.add(STATUS, OK_STATUS);
- } else {
- reportErrorOnResponse(rsp, "No follower configured", null);
+ } catch (SolrException e) {
+ reportErrorOnResponse(rsp, e.getMessage(), null);
}
}
diff --git
a/solr/core/src/java/org/apache/solr/handler/admin/api/CoreReplication.java
b/solr/core/src/java/org/apache/solr/handler/admin/api/CoreReplication.java
index ea5de6768ed..4e55f5ebc44 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/CoreReplication.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/CoreReplication.java
@@ -28,6 +28,7 @@ import org.apache.solr.client.api.model.FileListResponse;
import org.apache.solr.client.api.model.IndexVersionResponse;
import org.apache.solr.client.api.model.ReplicationDetailsResponse;
import org.apache.solr.client.api.model.ReplicationEnabledRequestBody;
+import org.apache.solr.client.api.model.ReplicationPollingRequestBody;
import org.apache.solr.client.api.model.RestoreStatusResponse;
import org.apache.solr.client.api.model.SolrJerseyResponse;
import org.apache.solr.common.SolrException;
@@ -103,4 +104,10 @@ public class CoreReplication extends ReplicationAPIBase
implements ReplicationAp
public SolrJerseyResponse
setReplicationEnabled(ReplicationEnabledRequestBody requestBody) {
return doSetReplicationEnabled(requestBody);
}
+
+ @Override
+ @PermissionName(CORE_EDIT_PERM)
+ public SolrJerseyResponse
setReplicationPolling(ReplicationPollingRequestBody requestBody) {
+ return doSetReplicationPolling(requestBody);
+ }
}
diff --git
a/solr/core/src/java/org/apache/solr/handler/admin/api/ReplicationAPIBase.java
b/solr/core/src/java/org/apache/solr/handler/admin/api/ReplicationAPIBase.java
index 107d8818ecb..7468d108a4f 100644
---
a/solr/core/src/java/org/apache/solr/handler/admin/api/ReplicationAPIBase.java
+++
b/solr/core/src/java/org/apache/solr/handler/admin/api/ReplicationAPIBase.java
@@ -51,6 +51,7 @@ import org.apache.solr.client.api.model.FileMetaData;
import org.apache.solr.client.api.model.IndexVersionResponse;
import org.apache.solr.client.api.model.ReplicationDetailsResponse;
import org.apache.solr.client.api.model.ReplicationEnabledRequestBody;
+import org.apache.solr.client.api.model.ReplicationPollingRequestBody;
import org.apache.solr.client.api.model.RestoreStatusResponse;
import org.apache.solr.client.api.model.SolrJerseyResponse;
import org.apache.solr.common.SolrException;
@@ -113,6 +114,17 @@ public abstract class ReplicationAPIBase extends
JerseyResource {
return instantiateJerseyResponse(SolrJerseyResponse.class);
}
+ protected SolrJerseyResponse
doSetReplicationPolling(ReplicationPollingRequestBody requestBody) {
+ ensureRequiredRequestBodyProvided(requestBody);
+ ensureRequiredParameterProvided("enabled", requestBody.enabled);
+ ReplicationHandler replicationHandler =
+ (ReplicationHandler)
solrCore.getRequestHandler(ReplicationHandler.PATH);
+ if (!replicationHandler.setPollingEnabled(requestBody.enabled)) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No
follower configured");
+ }
+ return instantiateJerseyResponse(SolrJerseyResponse.class);
+ }
+
protected RestoreStatusResponse doFetchRestoreStatus() {
ReplicationHandler replicationHandler =
(ReplicationHandler)
solrCore.getRequestHandler(ReplicationHandler.PATH);
diff --git
a/solr/core/src/test/org/apache/solr/handler/admin/api/CoreReplicationAPITest.java
b/solr/core/src/test/org/apache/solr/handler/admin/api/CoreReplicationAPITest.java
index 0cd932f8c4e..b1fab305f3e 100644
---
a/solr/core/src/test/org/apache/solr/handler/admin/api/CoreReplicationAPITest.java
+++
b/solr/core/src/test/org/apache/solr/handler/admin/api/CoreReplicationAPITest.java
@@ -18,6 +18,7 @@
package org.apache.solr.handler.admin.api;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.api.trace.Span;
@@ -38,6 +39,7 @@ import org.apache.solr.client.api.model.IndexVersionResponse;
import org.apache.solr.client.api.model.ReplicationDetailsResponse;
import
org.apache.solr.client.api.model.ReplicationDetailsResponse.ReplicationDetails;
import org.apache.solr.client.api.model.ReplicationEnabledRequestBody;
+import org.apache.solr.client.api.model.ReplicationPollingRequestBody;
import org.apache.solr.client.api.model.RestoreStatusResponse;
import org.apache.solr.common.SolrException;
import org.apache.solr.core.SolrCore;
@@ -129,6 +131,42 @@ public class CoreReplicationAPITest extends SolrTestCaseJ4
{
assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
}
+ @Test
+ public void testSetReplicationPolling() {
+ for (boolean enabled : new boolean[] {true, false}) {
+ when(mockReplicationHandler.setPollingEnabled(enabled)).thenReturn(true);
+ final var body = new ReplicationPollingRequestBody();
+ body.enabled = enabled;
+ assertNotNull(coreReplicationAPI.setReplicationPolling(body));
+ verify(mockReplicationHandler).setPollingEnabled(enabled);
+ }
+ }
+
+ @Test
+ public void testSetReplicationPollingRejectsNoFollower() {
+ final var body = new ReplicationPollingRequestBody();
+ body.enabled = true;
+ SolrException ex =
+ expectThrows(SolrException.class, () ->
coreReplicationAPI.setReplicationPolling(body));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+ }
+
+ @Test
+ public void testSetReplicationPollingRejectsNullBody() {
+ SolrException ex =
+ expectThrows(SolrException.class, () ->
coreReplicationAPI.setReplicationPolling(null));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+ }
+
+ @Test
+ public void testSetReplicationPollingRejectsBadBody() {
+ final var emptyBody = new ReplicationPollingRequestBody();
+ SolrException ex =
+ expectThrows(
+ SolrException.class, () ->
coreReplicationAPI.setReplicationPolling(emptyBody));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+ }
+
@Test
public void testGetRestoreStatus() {
RestoreStatusResponse expected = new RestoreStatusResponse();
diff --git
a/solr/core/src/test/org/apache/solr/handler/admin/api/SetReplicationPollingAPITest.java
b/solr/core/src/test/org/apache/solr/handler/admin/api/SetReplicationPollingAPITest.java
new file mode 100644
index 00000000000..7adf3aacd77
--- /dev/null
+++
b/solr/core/src/test/org/apache/solr/handler/admin/api/SetReplicationPollingAPITest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.solr.handler.admin.api;
+
+import static org.apache.solr.core.CoreContainer.ALLOW_PATHS_SYSPROP;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.apache.commons.io.file.PathUtils;
+import org.apache.solr.SolrTestCase;
+import org.apache.solr.client.solrj.RemoteSolrException;
+import org.apache.solr.client.solrj.request.ReplicationApi;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.util.ExternalPaths;
+import org.apache.solr.util.SolrJettyTestRule;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+/**
+ * HTTP tests for {@code PUT /api/cores/coreName/replication/polling} via the
generated SolrJ
+ * request.
+ */
+public class SetReplicationPollingAPITest extends SolrTestCase {
+
+ private static final String CORE_NAME = "setReplicationPollingApiTestCore";
+ private static final String FOLLOWER_CORE_NAME =
"setReplicationPollingApiTestFollowerCore";
+
+ @ClassRule public static final SolrJettyTestRule solrTestRule = new
SolrJettyTestRule();
+
+ @BeforeClass
+ public static void setupSolr() throws Exception {
+ System.setProperty(ALLOW_PATHS_SYSPROP,
ExternalPaths.SERVER_HOME.toAbsolutePath().toString());
+ System.setProperty("solr.security.allow.urls.enabled", "false");
+ final Path solrHome = createTempDir();
+ solrTestRule.startSolr(solrHome);
+
solrTestRule.newCollection(CORE_NAME).withConfigSet(ExternalPaths.DEFAULT_CONFIGSET).create();
+
+ final Path followerConfigSet = solrHome.resolve("followerConfigSet");
+ PathUtils.copyDirectory(ExternalPaths.DEFAULT_CONFIGSET,
followerConfigSet);
+ final Path solrConfig = followerConfigSet.resolve("solrconfig.xml");
+ final String followerHandler =
+ "<requestHandler name=\"/replication\"
class=\"solr.ReplicationHandler\">"
+ + "<lst name=\"follower\"><str name=\"leaderUrl\">"
+ + solrTestRule.getBaseUrl()
+ + "/"
+ + CORE_NAME
+ + "</str><str
name=\"pollInterval\">01:00:00</str></lst></requestHandler></config>";
+ Files.writeString(
+ solrConfig, Files.readString(solrConfig).replace("</config>",
followerHandler));
+
solrTestRule.newCollection(FOLLOWER_CORE_NAME).withConfigSet(followerConfigSet).create();
+ }
+
+ @Before
+ public void beforeEach() throws Exception {
+ setPolling(true);
+ }
+
+ @Test
+ public void testDisableThenEnablePolling() throws Exception {
+ assertEquals(Boolean.FALSE, fetchPollingDisabled());
+
+ setPolling(false);
+ assertEquals(Boolean.TRUE, fetchPollingDisabled());
+
+ setPolling(true);
+ assertEquals(Boolean.FALSE, fetchPollingDisabled());
+ }
+
+ @Test
+ public void testMissingEnabledIsRejectedAndStateUnchanged() throws Exception
{
+ var request = new ReplicationApi.SetReplicationPolling(FOLLOWER_CORE_NAME);
+ RemoteSolrException ex =
+ expectThrows(
+ RemoteSolrException.class,
+ () ->
request.process(solrTestRule.getSolrClient(FOLLOWER_CORE_NAME)));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+
+ assertEquals(Boolean.FALSE, fetchPollingDisabled());
+ }
+
+ @Test
+ public void testNoFollowerIsRejected() {
+ var request = new ReplicationApi.SetReplicationPolling(CORE_NAME);
+ request.setEnabled(true);
+ RemoteSolrException ex =
+ expectThrows(
+ RemoteSolrException.class,
+ () -> request.process(solrTestRule.getSolrClient(CORE_NAME)));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+ }
+
+ @Test
+ public void testNullEnabledIsRejected() {
+ var request = new ReplicationApi.SetReplicationPolling(FOLLOWER_CORE_NAME);
+ request.setEnabled(null);
+ RemoteSolrException ex =
+ expectThrows(
+ RemoteSolrException.class,
+ () ->
request.process(solrTestRule.getSolrClient(FOLLOWER_CORE_NAME)));
+ assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+ }
+
+ private static void setPolling(boolean enabled) throws Exception {
+ var request = new ReplicationApi.SetReplicationPolling(FOLLOWER_CORE_NAME);
+ request.setEnabled(enabled);
+ var response =
request.process(solrTestRule.getSolrClient(FOLLOWER_CORE_NAME));
+ assertNull(response.error);
+ }
+
+ private static Boolean fetchPollingDisabled() throws Exception {
+ var request = new
ReplicationApi.FetchReplicationDetails(FOLLOWER_CORE_NAME);
+ return request.process(solrTestRule.getSolrClient(FOLLOWER_CORE_NAME))
+ .details
+ .follower
+ .isPollingDisabled;
+ }
+}
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/user-managed-index-replication.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/user-managed-index-replication.adoc
index 277038c3686..785e0dccdb3 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/user-managed-index-replication.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/user-managed-index-replication.adoc
@@ -456,14 +456,52 @@
http://{followerHost}:{port}/solr/{coreName}/replication?command=abortfetch
`enablepoll`::
Enable the specified follower to poll for changes on the leader.
+
+[tabs#enablepoll-request]
+======
+V1 API::
++
+====
[source,bash]
+----
http://{followerHost}:{port}/solr/{coreName}/replication?command=enablepoll
+----
+====
+
+V2 API::
++
+====
+[source,bash]
+----
+curl -X PUT -H 'Content-Type: application/json' -d '{"enabled": true}' \
+http://{followerHost}:{port}/api/cores/{coreName}/replication/polling
+----
+====
+======
`disablepoll`::
Disable the specified follower from polling for changes on the leader.
+
+[tabs#disablepoll-request]
+======
+V1 API::
++
+====
[source,bash]
+----
http://{followerHost}:{port}/solr/{coreName}/replication?command=disablepoll
+----
+====
+
+V2 API::
++
+====
+[source,bash]
+----
+curl -X PUT -H 'Content-Type: application/json' -d '{"enabled": false}' \
+http://{followerHost}:{port}/api/cores/{coreName}/replication/polling
+----
+====
+======
`commits`::
Retrieve the index commit points currently retained by the core, with each
commit's index version, generation, and the file list.
diff --git a/solr/webapp/web/js/angular/controllers/replication.js
b/solr/webapp/web/js/angular/controllers/replication.js
index 0badbcf2b27..393d9d8506e 100644
--- a/solr/webapp/web/js/angular/controllers/replication.js
+++ b/solr/webapp/web/js/angular/controllers/replication.js
@@ -71,6 +71,15 @@ solrAdminApp.controller('ReplicationController',
});
}
+ $scope.setReplicationPolling = function(enabled) {
+ ReplicationV2.setReplicationPolling($routeParams.core, {enabled:
enabled}, function(error, data, response) {
+ $timeout(function() {
+ if (error) { ApiErrorHandler.handle(response); return; }
+ $scope.refresh();
+ });
+ });
+ }
+
$scope.showIterations = function() { $scope.iterationCount = 100000};
// limitTo should accept undefined, but doesn't work.
$scope.hideIterations = function() { $scope.iterationCount = 1};
diff --git a/solr/webapp/web/partials/replication.html
b/solr/webapp/web/partials/replication.html
index 62946841269..ed5a68029f6 100644
--- a/solr/webapp/web/partials/replication.html
+++ b/solr/webapp/web/partials/replication.html
@@ -225,8 +225,8 @@ limitations under the License.
<button class="optional replicate-now primary"
ng-click="execute('fetchindex')"
ng-show="!settings.isReplicating"><span>Replicate now</span></button>
<button class="optional abort-replication warn"
ng-click="execute('abortfetch')" ng-show="settings.isReplicating"><span>Abort
Replication</span></button>
- <button class="optional disable-polling"
ng-click="execute('disablepoll')"
ng-show="!settings.isPollingDisabled"><span>Disable Polling</span></button>
- <button class="optional enable-polling" ng-click="execute('enablepoll')"
ng-show="settings.isPollingDisabled"><span>Enable Polling</span></button>
+ <button class="optional disable-polling"
ng-click="setReplicationPolling(false)"
ng-show="!settings.isPollingDisabled"><span>Disable Polling</span></button>
+ <button class="optional enable-polling"
ng-click="setReplicationPolling(true)"
ng-show="settings.isPollingDisabled"><span>Enable Polling</span></button>
</div>
<div class="leaderOnly" ng-show="!isFollower">