23
23
import com .carrotsearch .hppc .cursors .ObjectCursor ;
24
24
import org .apache .logging .log4j .LogManager ;
25
25
import org .apache .logging .log4j .Logger ;
26
- import org .apache .logging .log4j .message .ParameterizedMessage ;
27
26
import org .elasticsearch .action .FailedNodeException ;
28
27
import org .elasticsearch .cluster .ClusterState ;
29
28
import org .elasticsearch .cluster .metadata .IndexMetaData ;
30
29
import org .elasticsearch .cluster .metadata .MetaData ;
31
30
import org .elasticsearch .cluster .service .ClusterService ;
32
- import org .elasticsearch .common .settings .ClusterSettings ;
33
31
import org .elasticsearch .common .settings .Settings ;
34
32
import org .elasticsearch .discovery .zen .ElectMasterService ;
35
33
import org .elasticsearch .index .Index ;
36
34
import org .elasticsearch .indices .IndicesService ;
37
35
38
36
import java .util .Arrays ;
39
- import java .util .Map ;
37
+ import java .util .function . Function ;
40
38
41
39
public class Gateway {
42
40
@@ -49,34 +47,32 @@ public class Gateway {
49
47
private final int minimumMasterNodes ;
50
48
private final IndicesService indicesService ;
51
49
52
- public Gateway (Settings settings , ClusterService clusterService ,
53
- TransportNodesListGatewayMetaState listGatewayMetaState ,
54
- IndicesService indicesService ) {
50
+ public Gateway (final Settings settings , final ClusterService clusterService ,
51
+ final TransportNodesListGatewayMetaState listGatewayMetaState ,
52
+ final IndicesService indicesService ) {
55
53
this .indicesService = indicesService ;
56
54
this .clusterService = clusterService ;
57
55
this .listGatewayMetaState = listGatewayMetaState ;
58
56
this .minimumMasterNodes = ElectMasterService .DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING .get (settings );
59
57
}
60
58
61
59
public void performStateRecovery (final GatewayStateRecoveredListener listener ) throws GatewayException {
62
- String [] nodesIds = clusterService .state ().nodes ().getMasterNodes ().keys ().toArray (String .class );
60
+ final String [] nodesIds = clusterService .state ().nodes ().getMasterNodes ().keys ().toArray (String .class );
63
61
logger .trace ("performing state recovery from {}" , Arrays .toString (nodesIds ));
64
- TransportNodesListGatewayMetaState .NodesGatewayMetaState nodesState = listGatewayMetaState .list (nodesIds , null ).actionGet ();
65
-
66
-
67
- int requiredAllocation = Math .max (1 , minimumMasterNodes );
62
+ final TransportNodesListGatewayMetaState .NodesGatewayMetaState nodesState = listGatewayMetaState .list (nodesIds , null ).actionGet ();
68
63
64
+ final int requiredAllocation = Math .max (1 , minimumMasterNodes );
69
65
70
66
if (nodesState .hasFailures ()) {
71
- for (FailedNodeException failedNodeException : nodesState .failures ()) {
67
+ for (final FailedNodeException failedNodeException : nodesState .failures ()) {
72
68
logger .warn ("failed to fetch state from node" , failedNodeException );
73
69
}
74
70
}
75
71
76
- ObjectFloatHashMap <Index > indices = new ObjectFloatHashMap <>();
72
+ final ObjectFloatHashMap <Index > indices = new ObjectFloatHashMap <>();
77
73
MetaData electedGlobalState = null ;
78
74
int found = 0 ;
79
- for (TransportNodesListGatewayMetaState .NodeGatewayMetaState nodeState : nodesState .getNodes ()) {
75
+ for (final TransportNodesListGatewayMetaState .NodeGatewayMetaState nodeState : nodesState .getNodes ()) {
80
76
if (nodeState .metaData () == null ) {
81
77
continue ;
82
78
}
@@ -86,7 +82,7 @@ public void performStateRecovery(final GatewayStateRecoveredListener listener) t
86
82
} else if (nodeState .metaData ().version () > electedGlobalState .version ()) {
87
83
electedGlobalState = nodeState .metaData ();
88
84
}
89
- for (ObjectCursor <IndexMetaData > cursor : nodeState .metaData ().indices ().values ()) {
85
+ for (final ObjectCursor <IndexMetaData > cursor : nodeState .metaData ().indices ().values ()) {
90
86
indices .addTo (cursor .value .getIndex (), 1 );
91
87
}
92
88
}
@@ -95,20 +91,20 @@ public void performStateRecovery(final GatewayStateRecoveredListener listener) t
95
91
return ;
96
92
}
97
93
// update the global state, and clean the indices, we elect them in the next phase
98
- MetaData .Builder metaDataBuilder = MetaData .builder (electedGlobalState ).removeAllIndices ();
94
+ final MetaData .Builder metaDataBuilder = MetaData .builder (electedGlobalState ).removeAllIndices ();
99
95
100
96
assert !indices .containsKey (null );
101
97
final Object [] keys = indices .keys ;
102
98
for (int i = 0 ; i < keys .length ; i ++) {
103
99
if (keys [i ] != null ) {
104
- Index index = (Index ) keys [i ];
100
+ final Index index = (Index ) keys [i ];
105
101
IndexMetaData electedIndexMetaData = null ;
106
102
int indexMetaDataCount = 0 ;
107
- for (TransportNodesListGatewayMetaState .NodeGatewayMetaState nodeState : nodesState .getNodes ()) {
103
+ for (final TransportNodesListGatewayMetaState .NodeGatewayMetaState nodeState : nodesState .getNodes ()) {
108
104
if (nodeState .metaData () == null ) {
109
105
continue ;
110
106
}
111
- IndexMetaData indexMetaData = nodeState .metaData ().index (index );
107
+ final IndexMetaData indexMetaData = nodeState .metaData ().index (index );
112
108
if (indexMetaData == null ) {
113
109
continue ;
114
110
}
@@ -123,49 +119,17 @@ public void performStateRecovery(final GatewayStateRecoveredListener listener) t
123
119
if (indexMetaDataCount < requiredAllocation ) {
124
120
logger .debug ("[{}] found [{}], required [{}], not adding" , index , indexMetaDataCount , requiredAllocation );
125
121
} // TODO if this logging statement is correct then we are missing an else here
126
- try {
127
- if (electedIndexMetaData .getState () == IndexMetaData .State .OPEN ) {
128
- // verify that we can actually create this index - if not we recover it as closed with lots of warn logs
129
- indicesService .verifyIndexMetadata (electedIndexMetaData , electedIndexMetaData );
130
- }
131
- } catch (Exception e ) {
132
- final Index electedIndex = electedIndexMetaData .getIndex ();
133
- logger .warn (() -> new ParameterizedMessage ("recovering index {} failed - recovering as closed" , electedIndex ), e );
134
- electedIndexMetaData = IndexMetaData .builder (electedIndexMetaData ).state (IndexMetaData .State .CLOSE ).build ();
135
- }
136
122
137
123
metaDataBuilder .put (electedIndexMetaData , false );
138
124
}
139
125
}
140
126
}
141
- final ClusterState .Builder builder = upgradeAndArchiveUnknownOrInvalidSettings (metaDataBuilder );
142
- listener .onSuccess (builder .build ());
143
- }
144
-
145
- ClusterState .Builder upgradeAndArchiveUnknownOrInvalidSettings (MetaData .Builder metaDataBuilder ) {
146
- final ClusterSettings clusterSettings = clusterService .getClusterSettings ();
147
- metaDataBuilder .persistentSettings (
148
- clusterSettings .archiveUnknownOrInvalidSettings (
149
- clusterSettings .upgradeSettings (metaDataBuilder .persistentSettings ()),
150
- e -> logUnknownSetting ("persistent" , e ),
151
- (e , ex ) -> logInvalidSetting ("persistent" , e , ex )));
152
- metaDataBuilder .transientSettings (
153
- clusterSettings .archiveUnknownOrInvalidSettings (
154
- clusterSettings .upgradeSettings (metaDataBuilder .transientSettings ()),
155
- e -> logUnknownSetting ("transient" , e ),
156
- (e , ex ) -> logInvalidSetting ("transient" , e , ex )));
157
- ClusterState .Builder builder = ClusterState .builder (clusterService .getClusterName ());
158
- builder .metaData (metaDataBuilder );
159
- return builder ;
160
- }
161
-
162
- private void logUnknownSetting (String settingType , Map .Entry <String , String > e ) {
163
- logger .warn ("ignoring unknown {} setting: [{}] with value [{}]; archiving" , settingType , e .getKey (), e .getValue ());
164
- }
127
+ ClusterState recoveredState = Function .<ClusterState >identity ()
128
+ .andThen (state -> ClusterStateUpdaters .upgradeAndArchiveUnknownOrInvalidSettings (state , clusterService .getClusterSettings ()))
129
+ .andThen (state -> ClusterStateUpdaters .closeBadIndices (state , indicesService ))
130
+ .apply (ClusterState .builder (clusterService .getClusterName ()).metaData (metaDataBuilder ).build ());
165
131
166
- private void logInvalidSetting (String settingType , Map .Entry <String , String > e , IllegalArgumentException ex ) {
167
- logger .warn (() -> new ParameterizedMessage ("ignoring invalid {} setting: [{}] with value [{}]; archiving" ,
168
- settingType , e .getKey (), e .getValue ()), ex );
132
+ listener .onSuccess (recoveredState );
169
133
}
170
134
171
135
public interface GatewayStateRecoveredListener {
0 commit comments