44
44
import org .elasticsearch .common .settings .Settings ;
45
45
import org .elasticsearch .common .unit .TimeValue ;
46
46
import org .elasticsearch .common .util .concurrent .EsRejectedExecutionException ;
47
+ import org .elasticsearch .monitor .fs .FsHealthService ;
47
48
import org .elasticsearch .monitor .fs .FsInfo ;
48
49
import org .elasticsearch .threadpool .ThreadPool ;
49
50
import org .elasticsearch .transport .ReceiveTimeoutTransportException ;
@@ -80,6 +81,7 @@ public class InternalClusterInfoService implements ClusterInfoService, LocalNode
80
81
81
82
private volatile ImmutableOpenMap <String , DiskUsage > leastAvailableSpaceUsages ;
82
83
private volatile ImmutableOpenMap <String , DiskUsage > mostAvailableSpaceUsages ;
84
+ private volatile ImmutableOpenMap <String , Boolean > allPathsWritable ;
83
85
private volatile ImmutableOpenMap <ShardRouting , String > shardRoutingToDataPath ;
84
86
private volatile ImmutableOpenMap <String , Long > shardSizes ;
85
87
private volatile boolean isMaster = false ;
@@ -94,6 +96,7 @@ public InternalClusterInfoService(Settings settings, ClusterService clusterServi
94
96
this .leastAvailableSpaceUsages = ImmutableOpenMap .of ();
95
97
this .mostAvailableSpaceUsages = ImmutableOpenMap .of ();
96
98
this .shardRoutingToDataPath = ImmutableOpenMap .of ();
99
+ this .allPathsWritable = ImmutableOpenMap .of ();
97
100
this .shardSizes = ImmutableOpenMap .of ();
98
101
this .clusterService = clusterService ;
99
102
this .threadPool = threadPool ;
@@ -105,16 +108,16 @@ public InternalClusterInfoService(Settings settings, ClusterService clusterServi
105
108
clusterSettings .addSettingsUpdateConsumer (INTERNAL_CLUSTER_INFO_TIMEOUT_SETTING , this ::setFetchTimeout );
106
109
clusterSettings .addSettingsUpdateConsumer (INTERNAL_CLUSTER_INFO_UPDATE_INTERVAL_SETTING , this ::setUpdateFrequency );
107
110
clusterSettings .addSettingsUpdateConsumer (DiskThresholdSettings .CLUSTER_ROUTING_ALLOCATION_DISK_THRESHOLD_ENABLED_SETTING ,
108
- this ::setEnabled );
111
+ FsHealthService . ENABLED_SETTING , this ::setEnabled );
109
112
110
113
// Add InternalClusterInfoService to listen for Master changes
111
114
this .clusterService .addLocalNodeMasterListener (this );
112
115
// Add to listen for state changes (when nodes are added)
113
116
this .clusterService .addListener (this );
114
117
}
115
118
116
- private void setEnabled (boolean enabled ) {
117
- this .enabled = enabled ;
119
+ private void setEnabled (boolean diskThresholdEnabled , boolean fsHealthEnabled ) {
120
+ this .enabled = diskThresholdEnabled || fsHealthEnabled ;
118
121
}
119
122
120
123
private void setFetchTimeout (TimeValue fetchTimeout ) {
@@ -200,7 +203,7 @@ public void clusterChanged(ClusterChangedEvent event) {
200
203
201
204
@ Override
202
205
public ClusterInfo getClusterInfo () {
203
- return new ClusterInfo (leastAvailableSpaceUsages , mostAvailableSpaceUsages , shardSizes , shardRoutingToDataPath );
206
+ return new ClusterInfo (leastAvailableSpaceUsages , mostAvailableSpaceUsages , shardSizes , shardRoutingToDataPath , allPathsWritable );
204
207
}
205
208
206
209
/**
@@ -242,7 +245,7 @@ public void run() {
242
245
*/
243
246
protected CountDownLatch updateNodeStats (final ActionListener <NodesStatsResponse > listener ) {
244
247
final CountDownLatch latch = new CountDownLatch (1 );
245
- final NodesStatsRequest nodesStatsRequest = new NodesStatsRequest ("data:true" );
248
+ final NodesStatsRequest nodesStatsRequest = new NodesStatsRequest ();
246
249
nodesStatsRequest .clear ();
247
250
nodesStatsRequest .fs (true );
248
251
nodesStatsRequest .timeout (fetchTimeout );
@@ -293,10 +296,12 @@ public final ClusterInfo refresh() {
293
296
public void onResponse (NodesStatsResponse nodesStatsResponse ) {
294
297
ImmutableOpenMap .Builder <String , DiskUsage > leastAvailableUsagesBuilder = ImmutableOpenMap .builder ();
295
298
ImmutableOpenMap .Builder <String , DiskUsage > mostAvailableUsagesBuilder = ImmutableOpenMap .builder ();
296
- fillDiskUsagePerNode (logger , adjustNodesStats (nodesStatsResponse .getNodes ()),
297
- leastAvailableUsagesBuilder , mostAvailableUsagesBuilder );
299
+ ImmutableOpenMap .Builder <String , Boolean > allPathsWritableBuilder = ImmutableOpenMap .builder ();
300
+ fillDiskStatsPerNode (logger , adjustNodesStats (nodesStatsResponse .getNodes ()), clusterService ,
301
+ leastAvailableUsagesBuilder , mostAvailableUsagesBuilder , allPathsWritableBuilder );
298
302
leastAvailableSpaceUsages = leastAvailableUsagesBuilder .build ();
299
303
mostAvailableSpaceUsages = mostAvailableUsagesBuilder .build ();
304
+ allPathsWritable = allPathsWritableBuilder .build ();
300
305
}
301
306
302
307
@ Override
@@ -396,51 +401,57 @@ static void buildShardLevelInfo(Logger logger, ShardStats[] stats, ImmutableOpen
396
401
}
397
402
}
398
403
399
- static void fillDiskUsagePerNode (Logger logger , List <NodeStats > nodeStatsArray ,
404
+ static void fillDiskStatsPerNode (Logger logger , List <NodeStats > nodeStatsArray , ClusterService clusterService ,
400
405
ImmutableOpenMap .Builder <String , DiskUsage > newLeastAvaiableUsages ,
401
- ImmutableOpenMap .Builder <String , DiskUsage > newMostAvaiableUsages ) {
406
+ ImmutableOpenMap .Builder <String , DiskUsage > newMostAvaiableUsages ,
407
+ ImmutableOpenMap .Builder <String , Boolean > allPathsWritableBuilder ) {
402
408
for (NodeStats nodeStats : nodeStatsArray ) {
403
409
if (nodeStats .getFs () == null ) {
404
410
logger .warn ("Unable to retrieve node FS stats for {}" , nodeStats .getNode ().getName ());
405
411
} else {
406
412
FsInfo .Path leastAvailablePath = null ;
407
413
FsInfo .Path mostAvailablePath = null ;
408
- for (FsInfo .Path info : nodeStats .getFs ()) {
409
- if (leastAvailablePath == null ) {
410
- assert mostAvailablePath == null ;
411
- mostAvailablePath = leastAvailablePath = info ;
412
- } else if (leastAvailablePath .getAvailable ().getBytes () > info .getAvailable ().getBytes ()) {
413
- leastAvailablePath = info ;
414
- } else if (mostAvailablePath .getAvailable ().getBytes () < info .getAvailable ().getBytes ()) {
415
- mostAvailablePath = info ;
416
- }
417
- }
418
414
String nodeId = nodeStats .getNode ().getId ();
419
415
String nodeName = nodeStats .getNode ().getName ();
420
- if (logger .isTraceEnabled ()) {
421
- logger .trace ("node: [{}], most available: total disk: {}," +
422
- " available disk: {} / least available: total disk: {}, available disk: {}" ,
416
+ Boolean allPathsWritable = nodeStats .getFs ().getTotal ().isWritable ();
417
+ if (clusterService .state ().getNodes ().getMasterNodes ().containsKey (nodeStats .getNode ().getId ()) == false ) {
418
+ for (FsInfo .Path info : nodeStats .getFs ()) {
419
+ if (leastAvailablePath == null ) {
420
+ assert mostAvailablePath == null ;
421
+ mostAvailablePath = leastAvailablePath = info ;
422
+ } else if (leastAvailablePath .getAvailable ().getBytes () > info .getAvailable ().getBytes ()) {
423
+ leastAvailablePath = info ;
424
+ } else if (mostAvailablePath .getAvailable ().getBytes () < info .getAvailable ().getBytes ()) {
425
+ mostAvailablePath = info ;
426
+ }
427
+ }
428
+ if (logger .isTraceEnabled ()) {
429
+ logger .trace ("node: [{}], most available: total disk: {}," +
430
+ " available disk: {} / least available: total disk: {}, available disk: {}" ,
423
431
nodeId , mostAvailablePath .getTotal (), leastAvailablePath .getAvailable (),
424
432
leastAvailablePath .getTotal (), leastAvailablePath .getAvailable ());
425
- }
426
- if (leastAvailablePath .getTotal ().getBytes () < 0 ) {
427
- if (logger .isTraceEnabled ()) {
428
- logger .trace ("node: [{}] least available path has less than 0 total bytes of disk [{}], skipping" ,
433
+ }
434
+ if (leastAvailablePath .getTotal ().getBytes () < 0 ) {
435
+ if (logger .isTraceEnabled ()) {
436
+ logger .trace ("node: [{}] least available path has less than 0 total bytes of disk [{}], skipping" ,
429
437
nodeId , leastAvailablePath .getTotal ().getBytes ());
438
+ }
439
+ } else {
440
+ newLeastAvaiableUsages .put (nodeId , new DiskUsage (nodeId , nodeName , leastAvailablePath .getPath (),
441
+ leastAvailablePath .getTotal ().getBytes (), leastAvailablePath .getAvailable ().getBytes ()));
430
442
}
431
- } else {
432
- newLeastAvaiableUsages .put (nodeId , new DiskUsage (nodeId , nodeName , leastAvailablePath .getPath (),
433
- leastAvailablePath .getTotal ().getBytes (), leastAvailablePath .getAvailable ().getBytes ()));
434
- }
435
- if (mostAvailablePath .getTotal ().getBytes () < 0 ) {
436
- if (logger .isTraceEnabled ()) {
437
- logger .trace ("node: [{}] most available path has less than 0 total bytes of disk [{}], skipping" ,
443
+ if (mostAvailablePath .getTotal ().getBytes () < 0 ) {
444
+ if (logger .isTraceEnabled ()) {
445
+ logger .trace ("node: [{}] most available path has less than 0 total bytes of disk [{}], skipping" ,
438
446
nodeId , mostAvailablePath .getTotal ().getBytes ());
447
+ }
448
+ } else {
449
+ newMostAvaiableUsages .put (nodeId , new DiskUsage (nodeId , nodeName , mostAvailablePath .getPath (),
450
+ mostAvailablePath .getTotal ().getBytes (), mostAvailablePath .getAvailable ().getBytes ()));
439
451
}
440
- } else {
441
- newMostAvaiableUsages .put (nodeId , new DiskUsage (nodeId , nodeName , mostAvailablePath .getPath (),
442
- mostAvailablePath .getTotal ().getBytes (), mostAvailablePath .getAvailable ().getBytes ()));
452
+
443
453
}
454
+ allPathsWritableBuilder .put (nodeId , allPathsWritable );
444
455
445
456
}
446
457
}
0 commit comments