11
11
import org .apache .logging .log4j .LogManager ;
12
12
import org .apache .logging .log4j .Logger ;
13
13
import org .elasticsearch .ResourceAlreadyExistsException ;
14
+ import org .elasticsearch .ResourceNotFoundException ;
14
15
import org .elasticsearch .action .ActionListener ;
15
16
import org .elasticsearch .client .Client ;
17
+ import org .elasticsearch .client .OriginSettingClient ;
16
18
import org .elasticsearch .cluster .ClusterChangedEvent ;
17
19
import org .elasticsearch .cluster .ClusterStateListener ;
18
20
import org .elasticsearch .cluster .service .ClusterService ;
19
21
import org .elasticsearch .common .settings .Setting ;
20
22
import org .elasticsearch .common .settings .Settings ;
23
+ import org .elasticsearch .gateway .GatewayService ;
24
+ import org .elasticsearch .ingest .IngestService ;
21
25
import org .elasticsearch .persistent .AllocatedPersistentTask ;
22
26
import org .elasticsearch .persistent .PersistentTaskState ;
23
27
import org .elasticsearch .persistent .PersistentTasksCustomMetadata ;
29
33
import java .util .Map ;
30
34
import java .util .concurrent .atomic .AtomicReference ;
31
35
36
+ import static org .elasticsearch .ingest .geoip .GeoIpDownloader .DATABASES_INDEX ;
32
37
import static org .elasticsearch .ingest .geoip .GeoIpDownloader .GEOIP_DOWNLOADER ;
33
38
34
39
/**
@@ -54,15 +59,14 @@ public final class GeoIpDownloaderTaskExecutor extends PersistentTasksExecutor<G
54
59
55
60
GeoIpDownloaderTaskExecutor (Client client , HttpClient httpClient , ClusterService clusterService , ThreadPool threadPool ) {
56
61
super (GEOIP_DOWNLOADER , ThreadPool .Names .GENERIC );
57
- this .client = client ;
62
+ this .client = new OriginSettingClient ( client , IngestService . INGEST_ORIGIN ) ;
58
63
this .httpClient = httpClient ;
59
64
this .clusterService = clusterService ;
60
65
this .threadPool = threadPool ;
61
66
this .settings = clusterService .getSettings ();
62
67
persistentTasksService = new PersistentTasksService (clusterService , threadPool , client );
63
- if (ENABLED_SETTING .get (settings )) {
64
- clusterService .addListener (this );
65
- }
68
+ clusterService .addListener (this );
69
+
66
70
clusterService .getClusterSettings ().addSettingsUpdateConsumer (ENABLED_SETTING , this ::setEnabled );
67
71
}
68
72
@@ -75,8 +79,8 @@ private void setEnabled(boolean enabled) {
75
79
startTask (() -> {
76
80
});
77
81
} else {
78
- persistentTasksService . sendRemoveRequest ( GEOIP_DOWNLOADER , ActionListener . wrap ( r -> {
79
- }, e -> logger . error ( "failed to remove geoip task" , e )) );
82
+ stopTask (() -> {
83
+ });
80
84
}
81
85
}
82
86
@@ -86,23 +90,33 @@ protected void nodeOperation(AllocatedPersistentTask task, GeoIpTaskParams param
86
90
currentTask .set (downloader );
87
91
GeoIpTaskState geoIpTaskState = state == null ? GeoIpTaskState .EMPTY : (GeoIpTaskState ) state ;
88
92
downloader .setState (geoIpTaskState );
89
- downloader .runDownloader ();
93
+ if (ENABLED_SETTING .get (clusterService .state ().metadata ().settings (), settings )) {
94
+ downloader .runDownloader ();
95
+ }
90
96
}
91
97
92
98
@ Override
93
99
protected GeoIpDownloader createTask (long id , String type , String action , TaskId parentTaskId ,
94
- PersistentTasksCustomMetadata .PersistentTask <GeoIpTaskParams > taskInProgress ,
95
- Map <String , String > headers ) {
100
+ PersistentTasksCustomMetadata .PersistentTask <GeoIpTaskParams > taskInProgress ,
101
+ Map <String , String > headers ) {
96
102
return new GeoIpDownloader (client , httpClient , clusterService , threadPool , settings , id , type , action ,
97
103
getDescription (taskInProgress ), parentTaskId , headers );
98
104
}
99
105
100
106
@ Override
101
107
public void clusterChanged (ClusterChangedEvent event ) {
108
+ if (event .state ().blocks ().hasGlobalBlock (GatewayService .STATE_NOT_RECOVERED_BLOCK )){
109
+ //wait for state recovered
110
+ return ;
111
+ }
102
112
//bootstrap downloader after first cluster start
103
113
clusterService .removeListener (this );
104
- if (event .localNodeMaster () && ENABLED_SETTING .get (event .state ().getMetadata ().settings ())) {
105
- startTask (() -> clusterService .addListener (this ));
114
+ if (event .localNodeMaster ()) {
115
+ if (ENABLED_SETTING .get (event .state ().getMetadata ().settings (), settings )) {
116
+ startTask (() -> clusterService .addListener (this ));
117
+ } else {
118
+ stopTask (() -> clusterService .addListener (this ));
119
+ }
106
120
}
107
121
}
108
122
@@ -116,7 +130,24 @@ private void startTask(Runnable onFailure) {
116
130
}));
117
131
}
118
132
119
- public GeoIpDownloader getCurrentTask (){
133
+ private void stopTask (Runnable onFailure ) {
134
+ ActionListener <PersistentTasksCustomMetadata .PersistentTask <?>> listener = ActionListener .wrap (r -> {
135
+ }, e -> {
136
+ if (e instanceof ResourceNotFoundException == false ) {
137
+ logger .error ("failed to remove geoip downloader task" , e );
138
+ onFailure .run ();
139
+ }
140
+ });
141
+ persistentTasksService .sendRemoveRequest (GEOIP_DOWNLOADER , ActionListener .runAfter (listener , () ->
142
+ client .admin ().indices ().prepareDelete (DATABASES_INDEX ).execute (ActionListener .wrap (rr -> {
143
+ }, e -> {
144
+ if (e instanceof ResourceNotFoundException == false ) {
145
+ logger .warn ("failed to remove " + DATABASES_INDEX , e );
146
+ }
147
+ }))));
148
+ }
149
+
150
+ public GeoIpDownloader getCurrentTask () {
120
151
return currentTask .get ();
121
152
}
122
153
}
0 commit comments