88
99package org .elasticsearch .ingest .geoip ;
1010
11+ import org .elasticsearch .ElasticsearchException ;
1112import org .elasticsearch .action .ActionListener ;
1213import org .elasticsearch .action .ActionRequest ;
1314import org .elasticsearch .action .ActionResponse ;
2223import org .elasticsearch .action .index .IndexAction ;
2324import org .elasticsearch .action .index .IndexRequest ;
2425import org .elasticsearch .action .index .IndexResponse ;
25- import org .elasticsearch .cluster .ClusterName ;
2626import org .elasticsearch .cluster .ClusterState ;
27+ import org .elasticsearch .cluster .block .ClusterBlockException ;
28+ import org .elasticsearch .cluster .block .ClusterBlocks ;
29+ import org .elasticsearch .cluster .metadata .IndexMetadata ;
2730import org .elasticsearch .cluster .service .ClusterService ;
2831import org .elasticsearch .common .settings .ClusterSettings ;
2932import org .elasticsearch .common .settings .Settings ;
3033import org .elasticsearch .node .Node ;
3134import org .elasticsearch .persistent .PersistentTaskState ;
35+ import org .elasticsearch .persistent .PersistentTasksCustomMetadata ;
3236import org .elasticsearch .persistent .PersistentTasksCustomMetadata .PersistentTask ;
3337import org .elasticsearch .test .ESTestCase ;
3438import org .elasticsearch .test .client .NoOpClient ;
5256import java .util .concurrent .atomic .AtomicInteger ;
5357import java .util .function .BiConsumer ;
5458
59+ import static org .elasticsearch .ingest .geoip .DatabaseNodeServiceTests .createClusterState ;
5560import static org .elasticsearch .ingest .geoip .GeoIpDownloader .ENDPOINT_SETTING ;
5661import static org .elasticsearch .ingest .geoip .GeoIpDownloader .MAX_CHUNK_SIZE ;
5762import static org .elasticsearch .tasks .TaskId .EMPTY_TASK_ID ;
63+ import static org .hamcrest .Matchers .equalTo ;
5864import static org .mockito .Mockito .mock ;
65+ import static org .mockito .Mockito .verifyNoInteractions ;
5966import static org .mockito .Mockito .when ;
6067
6168public class GeoIpDownloaderTests extends ESTestCase {
@@ -77,7 +84,7 @@ public void setup() {
7784 Set .of (GeoIpDownloader .ENDPOINT_SETTING , GeoIpDownloader .POLL_INTERVAL_SETTING , GeoIpDownloaderTaskExecutor .ENABLED_SETTING )
7885 )
7986 );
80- ClusterState state = ClusterState . builder ( ClusterName . DEFAULT ). build ( );
87+ ClusterState state = createClusterState ( new PersistentTasksCustomMetadata ( 1L , Map . of ()) );
8188 when (clusterService .state ()).thenReturn (state );
8289 client = new MockClient (threadPool );
8390 geoIpDownloader = new GeoIpDownloader (
@@ -455,6 +462,38 @@ void processDatabase(Map<String, Object> databaseInfo) {
455462 assertFalse (it .hasNext ());
456463 }
457464
465+ public void testUpdateDatabasesWriteBlock () {
466+ ClusterState state = createClusterState (new PersistentTasksCustomMetadata (1L , Map .of ()));
467+ var geoIpIndex = state .getMetadata ().getIndicesLookup ().get (GeoIpDownloader .DATABASES_INDEX ).getWriteIndex ().getName ();
468+ state = ClusterState .builder (state )
469+ .blocks (new ClusterBlocks .Builder ().addIndexBlock (geoIpIndex , IndexMetadata .INDEX_READ_ONLY_ALLOW_DELETE_BLOCK ))
470+ .build ();
471+ when (clusterService .state ()).thenReturn (state );
472+ var e = expectThrows (ClusterBlockException .class , () -> geoIpDownloader .updateDatabases ());
473+ assertThat (
474+ e .getMessage (),
475+ equalTo (
476+ "index ["
477+ + geoIpIndex
478+ + "] blocked by: [TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, "
479+ + "index has read-only-allow-delete block];"
480+ )
481+ );
482+ verifyNoInteractions (httpClient );
483+ }
484+
485+ public void testUpdateDatabasesIndexNotReady () {
486+ ClusterState state = createClusterState (new PersistentTasksCustomMetadata (1L , Map .of ()), true );
487+ var geoIpIndex = state .getMetadata ().getIndicesLookup ().get (GeoIpDownloader .DATABASES_INDEX ).getWriteIndex ().getName ();
488+ state = ClusterState .builder (state )
489+ .blocks (new ClusterBlocks .Builder ().addIndexBlock (geoIpIndex , IndexMetadata .INDEX_READ_ONLY_ALLOW_DELETE_BLOCK ))
490+ .build ();
491+ when (clusterService .state ()).thenReturn (state );
492+ var e = expectThrows (ElasticsearchException .class , () -> geoIpDownloader .updateDatabases ());
493+ assertThat (e .getMessage (), equalTo ("not all primary shards of [.geoip_databases] index are active" ));
494+ verifyNoInteractions (httpClient );
495+ }
496+
458497 private static class MockClient extends NoOpClient {
459498
460499 private final Map <ActionType <?>, BiConsumer <? extends ActionRequest , ? extends ActionListener <?>>> handlers = new HashMap <>();
0 commit comments