8
8
9
9
package org .elasticsearch .ingest .geoip ;
10
10
11
+ import org .elasticsearch .ElasticsearchException ;
11
12
import org .elasticsearch .action .ActionListener ;
12
13
import org .elasticsearch .action .ActionRequest ;
13
14
import org .elasticsearch .action .ActionResponse ;
22
23
import org .elasticsearch .action .index .IndexAction ;
23
24
import org .elasticsearch .action .index .IndexRequest ;
24
25
import org .elasticsearch .action .index .IndexResponse ;
25
- import org .elasticsearch .cluster .ClusterName ;
26
26
import 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 ;
27
30
import org .elasticsearch .cluster .service .ClusterService ;
28
31
import org .elasticsearch .common .settings .ClusterSettings ;
29
32
import org .elasticsearch .common .settings .Settings ;
30
33
import org .elasticsearch .node .Node ;
31
34
import org .elasticsearch .persistent .PersistentTaskState ;
35
+ import org .elasticsearch .persistent .PersistentTasksCustomMetadata ;
32
36
import org .elasticsearch .persistent .PersistentTasksCustomMetadata .PersistentTask ;
33
37
import org .elasticsearch .test .ESTestCase ;
34
38
import org .elasticsearch .test .client .NoOpClient ;
52
56
import java .util .concurrent .atomic .AtomicInteger ;
53
57
import java .util .function .BiConsumer ;
54
58
59
+ import static org .elasticsearch .ingest .geoip .DatabaseNodeServiceTests .createClusterState ;
55
60
import static org .elasticsearch .ingest .geoip .GeoIpDownloader .ENDPOINT_SETTING ;
56
61
import static org .elasticsearch .ingest .geoip .GeoIpDownloader .MAX_CHUNK_SIZE ;
57
62
import static org .elasticsearch .tasks .TaskId .EMPTY_TASK_ID ;
63
+ import static org .hamcrest .Matchers .equalTo ;
58
64
import static org .mockito .Mockito .mock ;
65
+ import static org .mockito .Mockito .verifyNoInteractions ;
59
66
import static org .mockito .Mockito .when ;
60
67
61
68
public class GeoIpDownloaderTests extends ESTestCase {
@@ -77,7 +84,7 @@ public void setup() {
77
84
Set .of (GeoIpDownloader .ENDPOINT_SETTING , GeoIpDownloader .POLL_INTERVAL_SETTING , GeoIpDownloaderTaskExecutor .ENABLED_SETTING )
78
85
)
79
86
);
80
- ClusterState state = ClusterState . builder ( ClusterName . DEFAULT ). build ( );
87
+ ClusterState state = createClusterState ( new PersistentTasksCustomMetadata ( 1L , Map . of ()) );
81
88
when (clusterService .state ()).thenReturn (state );
82
89
client = new MockClient (threadPool );
83
90
geoIpDownloader = new GeoIpDownloader (
@@ -455,6 +462,38 @@ void processDatabase(Map<String, Object> databaseInfo) {
455
462
assertFalse (it .hasNext ());
456
463
}
457
464
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
+
458
497
private static class MockClient extends NoOpClient {
459
498
460
499
private final Map <ActionType <?>, BiConsumer <? extends ActionRequest , ? extends ActionListener <?>>> handlers = new HashMap <>();
0 commit comments