This is an automated email from the ASF dual-hosted git repository. akuznetsov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new f3e481f IGNITE-11354 Web console: Actualized cluster configuration. f3e481f is described below commit f3e481f9dcc6d533fa83d08aef84d6211051792f Author: Vasiliy Sisko <vsi...@gridgain.com> AuthorDate: Fri Apr 5 18:45:15 2019 +0700 IGNITE-11354 Web console: Actualized cluster configuration. --- modules/web-console/backend/app/schemas.js | 16 ++++-- .../cluster-edit-form/templates/atomic.pug | 36 ++++++++------ .../cluster-edit-form/templates/communication.pug | 32 ++++++++++++ .../cluster-edit-form/templates/data-storage.pug | 58 +++++++++++++++------- .../cluster-edit-form/templates/discovery.pug | 27 ++++++++++ .../generator/generator/ConfigurationGenerator.js | 50 +++++++++++++++---- .../generator/defaults/Cluster.service.js | 14 ++++-- .../WebConsoleConfigurationSelfTest.java | 28 +++++++---- 8 files changed, 200 insertions(+), 61 deletions(-) diff --git a/modules/web-console/backend/app/schemas.js b/modules/web-console/backend/app/schemas.js index 29493a5..50b97f3 100644 --- a/modules/web-console/backend/app/schemas.js +++ b/modules/web-console/backend/app/schemas.js @@ -494,6 +494,9 @@ module.exports.factory = function(mongoose) { authenticator: String, forceServerMode: Boolean, clientReconnectDisabled: Boolean, + connectionRecoveryTimeout: Number, + reconnectDelay: Number, + soLinger: Number, kind: { type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs', 'ZooKeeper', 'Kubernetes'] @@ -655,7 +658,8 @@ module.exports.factory = function(mongoose) { Custom: { className: String } - } + }, + groupName: String }, binaryConfiguration: { idMapper: String, @@ -730,7 +734,11 @@ module.exports.factory = function(mongoose) { unacknowledgedMessagesBufferSize: Number, socketWriteTimeout: Number, selectorsCount: Number, - addressResolver: String + addressResolver: String, + selectorSpins: Number, + connectionsPerNode: Number, + usePairedConnections: Boolean, + filterReachableAddresses: Boolean }, connector: { enabled: Boolean, @@ -1146,7 +1154,9 @@ module.exports.factory = function(mongoose) { walAutoArchiveAfterInactivity: Number, writeThrottlingEnabled: Boolean, walCompactionEnabled: Boolean, - checkpointReadLockTimeout: Number + checkpointReadLockTimeout: Number, + maxWalArchiveSize: Number, + walCompactionLevel: Number }, memoryConfiguration: { systemCacheInitialSize: Number, diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug index d227c27..b27ada9 100644 --- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug +++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/atomic.pug @@ -38,16 +38,16 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) name: '"cacheMode"', placeholder: 'PARTITIONED', options: '[\ - {value: "LOCAL", label: "LOCAL"},\ - {value: "REPLICATED", label: "REPLICATED"},\ - {value: "PARTITIONED", label: "PARTITIONED"}\ - ]', + {value: "LOCAL", label: "LOCAL"},\ + {value: "REPLICATED", label: "REPLICATED"},\ + {value: "PARTITIONED", label: "PARTITIONED"}\ + ]', tip: 'Cache modes:\ - <ul>\ - <li>Partitioned - in this mode the overall key set will be divided into partitions and all partitions will be split equally between participating nodes</li>\ - <li>Replicated - in this mode all the keys are distributed to all participating nodes</li>\ - <li>Local - in this mode caches residing on different grid nodes will not know about each other</li>\ - </ul>' + <ul>\ + <li>Partitioned - in this mode the overall key set will be divided into partitions and all partitions will be split equally between participating nodes</li>\ + <li>Replicated - in this mode all the keys are distributed to all participating nodes</li>\ + <li>Local - in this mode caches residing on different grid nodes will not know about each other</li>\ + </ul>' }) .pc-form-grid-col-30 +form-field__number({ @@ -77,11 +77,11 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) placeholder: 'Default', options: '$ctrl.Clusters.affinityFunctions', tip: 'Key topology resolver to provide mapping from keys to nodes\ - <ul>\ - <li>Rendezvous - Based on Highest Random Weight algorithm<br/></li>\ - <li>Custom - Custom implementation of key affinity function<br/></li>\ - <li>Default - By default rendezvous affinity function with 1024 partitions is used<br/></li>\ - </ul>' + <ul>\ + <li>Rendezvous - Based on Highest Random Weight algorithm<br/></li>\ + <li>Custom - Custom implementation of key affinity function<br/></li>\ + <li>Default - By default rendezvous affinity function with 1024 partitions is used<br/></li>\ + </ul>' }) .pc-form-group(ng-if-end ng-if=rendezvousAff + ' || ' + customAff) .pc-form-grid-row @@ -117,5 +117,13 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) required: customAff, tip: 'Custom key affinity function implementation class name' }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.1.0")') + +form-field__text({ + label: 'Default group name:', + model: `${model}.groupName`, + name: '"AtomicGroupName"', + placeholder: 'Input group name', + tip: 'Group name' + }) .pca-form-column-6 +preview-xml-java(model, 'clusterAtomics') diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug index 6a3de5b..0f7ce23 100644 --- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug +++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/communication.pug @@ -236,6 +236,24 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) min: '1', tip: 'Count of selectors te be used in TCP server' }) + .pc-form-grid-col-30 + +form-field__number({ + label: 'Selectors spins:', + model: `${communication}.selectorSpins`, + name: '"selectorSpins"', + placeholder: '0', + min: '0', + tip: 'Defines how many non-blocking selector.selectNow() should be made before falling into selector.select(long) in NIO server' + }) + .pc-form-grid-col-30 + +form-field__number({ + label: 'Connections per node:', + model: `${communication}.connectionsPerNode`, + name: '"connectionsPerNode"', + placeholder: '1', + min: '1', + tip: 'Number of connections to each remote node' + }) .pc-form-grid-col-60 +form-field__java-class({ label: 'Address resolver:', @@ -265,5 +283,19 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) name: '"tcpNoDelay"', tip: 'Value for TCP_NODELAY socket option' }) + .pc-form-grid-col-60 + +form-field__checkbox({ + label: 'Use paired connections', + model: `${communication}.usePairedConnections`, + name: '"usePairedConnections"', + tip: 'Maintain connection for outgoing and incoming messages separately' + }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.3.0")') + +form-field__checkbox({ + label: 'Filter reachable addresses', + model: `${communication}.filterReachableAddresses`, + name: '"filterReachableAddresses"', + tip: 'Filter for reachable addresses on creating tcp client' + }) .pca-form-column-6 +preview-xml-java(model, 'clusterCommunication') diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug index a7f0891..caab4ea 100644 --- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug +++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug @@ -319,14 +319,6 @@ panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form on-open=`ui.lo placeholder: 'db/wal', tip: 'A path to the directory where WAL is stored' }) - .pc-form-grid-col-60 - +form-field__text({ - label: 'WAL archive path:', - model: `${model}.walArchivePath`, - name: '"DataStorageWalArchivePath"', - placeholder: 'db/wal/archive', - tip: 'A path to the WAL archive directory' - }) .pc-form-grid-col-20 +form-field__number({ label: 'WAL segments:', @@ -354,6 +346,44 @@ panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form on-open=`ui.lo min: '1', tip: 'A total number of checkpoints to keep in the WAL history' }) + .pc-form-grid-col-60 + +form-field__text({ + label: 'WAL archive path:', + model: `${model}.walArchivePath`, + name: '"DataStorageWalArchivePath"', + placeholder: 'db/wal/archive', + tip: 'A path to the WAL archive directory' + }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")') + form-field-size( + label='Max allowed size of WAL archives:' + ng-model=`${model}.maxWalArchiveSize` + name='DataStorageMaxWalArchiveSize' + placeholder='1' + min='1' + tip='Max allowed size of WAL archives' + size-scale-label='gb' + size-type='bytes' + ) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")') + +form-field__number({ + label: 'WAL compaction level:', + model: `${model}.walCompactionLevel`, + name: '"DataStorageWalCompactionLevel"', + placeholder: '1', + min: '0', + max: '9', + tip: 'ZIP level to WAL compaction (0-9)' + }) + .pc-form-grid-col-60 + +form-field__number({ + label: 'WAL auto archive after inactivity:', + model: `${model}.walAutoArchiveAfterInactivity`, + name: '"DataStorageWalAutoArchiveAfterInactivity"', + placeholder: '-1', + min: '-1', + tip: 'Time in millis to run auto archiving segment after last record logging' + }) .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")') +form-field__number({ label: 'WAL buffer size:', @@ -426,7 +456,7 @@ panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form on-open=`ui.lo min: '1000', tip: 'The length of the time interval for rate - based metrics. This interval defines a window over which hits will be tracked' }) - .pc-form-grid-col-30 + .pc-form-grid-col-60 +form-field__dropdown({ label: 'File IO factory:', model: `${model}.fileIOFactory`, @@ -443,16 +473,6 @@ panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form on-open=`ui.lo <li>SEQUENTIAL - All checkpoint pages are collected into single list and sorted by page index</li>\ </ul>' }) - - .pc-form-grid-col-30 - +form-field__number({ - label: 'WAL auto archive after inactivity:', - model: `${model}.walAutoArchiveAfterInactivity`, - name: '"DataStorageWalAutoArchiveAfterInactivity"', - placeholder: '-1', - min: '-1', - tip: 'Time in millis to run auto archiving segment after last record logging' - }) .pc-form-grid-col-60 +form-field__checkbox({ label: 'Metrics enabled', diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug index 0ff6313..2d5b017 100644 --- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug +++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug @@ -214,6 +214,33 @@ panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`) name: '"authenticator"', tip: 'Class name of node authenticator implementation' }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")') + +form-field__number({ + label: 'Reconnect delay:', + model: `${model}.reconnectDelay`, + name: '"reconnectDelay"', + placeholder: '2000', + min: '0', + tip: 'Amount of time in milliseconds that node waits before retrying to (re)connect to the cluster' + }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.7.0")') + +form-field__number({ + label: 'Connection recovery timeout:', + model: `${model}.connectionRecoveryTimeout`, + name: '"connectionRecoveryTimeout"', + placeholder: '10000', + min: '0', + tip: 'Defines how long server node would try to recovery connection' + }) + .pc-form-grid-col-60(ng-if='$ctrl.available("2.8.0")') + +form-field__number({ + label: 'SO Linger timeout:', + model: `${model}.soLinger`, + name: '"soLinger"', + placeholder: '5', + min: '-1', + tip: 'SO_LINGER timeout for socket' + }) .pc-form-grid-col-60 +form-field__checkbox({ label: 'Force server mode', diff --git a/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js b/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js index 98bfaf2..3b24f14 100644 --- a/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js +++ b/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js @@ -220,8 +220,7 @@ export default class IgniteConfigurationGenerator { if (isNil(cluster.discovery)) return cfg; - const discovery = new Bean('org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi', 'discovery', - cluster.discovery, clusterDflts.discovery); + const discovery = IgniteConfigurationGenerator.discoveryConfigurationBean(cluster.discovery); let ipFinder; @@ -483,6 +482,8 @@ export default class IgniteConfigurationGenerator { // Generate atomics group. static clusterAtomics(atomics, available, cfg = this.igniteConfigurationBean()) { + const available2_1 = available('2.1.0'); + const acfg = new Bean('org.apache.ignite.configuration.AtomicConfiguration', 'atomicCfg', atomics, clusterDflts.atomics); @@ -492,9 +493,12 @@ export default class IgniteConfigurationGenerator { if (acfg.valueOf('cacheMode') === 'PARTITIONED') acfg.intProperty('backups'); - if (available('2.1.0') && nonNil(atomics)) + if (available2_1 && nonNil(atomics)) this.affinity(atomics.affinity, acfg); + if (available2_1) + acfg.stringProperty('groupName'); + if (acfg.isEmpty()) return cfg; @@ -960,7 +964,13 @@ export default class IgniteConfigurationGenerator { .intProperty('unacknowledgedMessagesBufferSize') .longProperty('socketWriteTimeout') .intProperty('selectorsCount') - .emptyBeanProperty('addressResolver'); + .longProperty('selectorSpins') + .intProperty('connectionsPerNode') + .emptyBeanProperty('addressResolver') + .boolProperty('usePairedConnections'); + + if (available('2.3.0')) + commSpi.boolProperty('filterReachableAddresses'); if (commSpi.nonEmpty()) cfg.beanProperty('communicationSpi', commSpi); @@ -1096,8 +1106,18 @@ export default class IgniteConfigurationGenerator { .intProperty('reconnectCount') .longProperty('statisticsPrintFrequency') .longProperty('ipFinderCleanFrequency') - .emptyBeanProperty('authenticator') - .intProperty('forceServerMode') + .emptyBeanProperty('authenticator'); + + if (available('2.4.0')) + discoSpi.longProperty('reconnectDelay'); + + if (available('2.7.0')) + discoSpi.longProperty('connectionRecoveryTimeout'); + + if (available('2.8.0')) + discoSpi.intProperty('soLinger'); + + discoSpi.intProperty('forceServerMode') .intProperty('clientReconnectDisabled'); if (discoSpi.nonEmpty()) @@ -1495,6 +1515,8 @@ export default class IgniteConfigurationGenerator { if (!available('2.3.0')) return cfg; + const available2_4 = available('2.4.0'); + const available2_7 = available('2.7.0'); const storageBean = new Bean('org.apache.ignite.configuration.DataStorageConfiguration', 'dataStorageCfg', dataStorageCfg, clusterDflts.dataStorageConfiguration); storageBean.intProperty('pageSize') @@ -1524,7 +1546,7 @@ export default class IgniteConfigurationGenerator { storageBean.stringProperty('storagePath') .longProperty('checkpointFrequency'); - if (available('2.7.0')) { + if (available2_7) { storageBean .longProperty('checkpointReadLockTimeout'); } @@ -1533,12 +1555,19 @@ export default class IgniteConfigurationGenerator { .enumProperty('checkpointWriteOrder') .enumProperty('walMode') .stringProperty('walPath') - .stringProperty('walArchivePath') + .stringProperty('walArchivePath'); + + if (available2_7) { + storageBean.longProperty('maxWalArchiveSize') + .intProperty('walCompactionLevel'); + } + + storageBean.longProperty('walAutoArchiveAfterInactivity') .intProperty('walSegments') .intProperty('walSegmentSize') .intProperty('walHistorySize'); - if (available('2.4.0')) + if (available2_4) storageBean.intProperty('walBufferSize'); storageBean.longProperty('walFlushFrequency') @@ -1548,12 +1577,11 @@ export default class IgniteConfigurationGenerator { .intProperty('walThreadLocalBufferSize') .intProperty('metricsSubIntervalCount') .longProperty('metricsRateTimeInterval') - .longProperty('walAutoArchiveAfterInactivity') .boolProperty('metricsEnabled') .boolProperty('alwaysWriteFullPages') .boolProperty('writeThrottlingEnabled'); - if (available('2.4.0')) + if (available2_4) storageBean.boolProperty('walCompactionEnabled'); const fileIOFactory = _.get(dataStorageCfg, 'fileIOFactory'); diff --git a/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js b/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js index fac2cc5..e486ee6 100644 --- a/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js +++ b/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js @@ -37,6 +37,9 @@ const DFLT_CLUSTER = { ipFinderCleanFrequency: 60000, forceServerMode: false, clientReconnectDisabled: false, + reconnectDelay: 2000, + connectionRecoveryTimeout: 10000, + soLinger: 5, Multicast: { multicastGroup: '228.1.2.4', multicastPort: 47400, @@ -87,7 +90,6 @@ const DFLT_CLUSTER = { }, atomics: { atomicSequenceReserveSize: 1000, - backups: 0, cacheMode: { clsName: 'org.apache.ignite.cache.CacheMode', value: 'PARTITIONED' @@ -142,7 +144,11 @@ const DFLT_CLUSTER = { tcpNoDelay: true, ackSendThreshold: 16, unacknowledgedMessagesBufferSize: 0, - socketWriteTimeout: 2000 + socketWriteTimeout: 2000, + selectorSpins: 0, + connectionsPerNode: 1, + usePairedConnections: false, + filterReachableAddresses: false }, networkTimeout: 5000, networkSendRetryDelay: 1000, @@ -369,7 +375,9 @@ const DFLT_CLUSTER = { lockWaitTime: 10000, walThreadLocalBufferSize: 131072, metricsSubIntervalCount: 5, - metricsRateTimeInterval: 60000 + metricsRateTimeInterval: 60000, + maxWalArchiveSize: 1073741824, + walCompactionLevel: 1 }, utilityCacheKeepAliveTime: 60000, hadoopConfiguration: { diff --git a/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java b/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java index a163a39..a7fbc25 100644 --- a/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java +++ b/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java @@ -223,6 +223,7 @@ public class WebConsoleConfigurationSelfTest { atomicCfgProps.add("atomicSequenceReserveSize"); atomicCfgProps.add("backups"); atomicCfgProps.add("affinity"); + atomicCfgProps.add("groupName"); metadata.put(AtomicConfiguration.class, new MetadataInfo(atomicCfgProps, EMPTY_FIELDS, EMPTY_FIELDS)); @@ -346,17 +347,13 @@ public class WebConsoleConfigurationSelfTest { commProps.add("directBuffer"); commProps.add("directSendBuffer"); commProps.add("tcpNoDelay"); + commProps.add("selectorSpins"); + commProps.add("connectionsPerNode"); + commProps.add("usePairedConnections"); + commProps.add("filterReachableAddresses"); + commProps.add("soLinger"); - Set<String> commPropsDep = new HashSet<>(); - commPropsDep.add("discoveryStartupDelay"); - - // Removed from configuration since ignite 2.3 - Set<String> commPropsExcl = new HashSet<>(); - commPropsExcl.add("discoveryStartupDelay"); - commPropsExcl.addAll(SPI_EXCLUDED_FIELDS); - - metadata.put(TcpCommunicationSpi.class, - new MetadataInfo(commProps, commPropsDep, commPropsExcl)); + metadata.put(TcpCommunicationSpi.class, new MetadataInfo(commProps, EMPTY_FIELDS, SPI_EXCLUDED_FIELDS)); Set<String> discoverySpiProps = new HashSet<>(); discoverySpiProps.add("ipFinder"); @@ -384,7 +381,13 @@ public class WebConsoleConfigurationSelfTest { discoverySpiProps.add("authenticator"); discoverySpiProps.add("forceServerMode"); discoverySpiProps.add("clientReconnectDisabled"); - metadata.put(TcpDiscoverySpi.class, new MetadataInfo(discoverySpiProps, EMPTY_FIELDS, SPI_EXCLUDED_FIELDS)); + discoverySpiProps.add("connectionRecoveryTimeout"); + discoverySpiProps.add("reconnectDelay"); + + Set<String> discoverySpiExclProps = new HashSet<>(); + discoverySpiExclProps.addAll(SPI_EXCLUDED_FIELDS); + discoverySpiExclProps.add("nodeAttributes"); + metadata.put(TcpDiscoverySpi.class, new MetadataInfo(discoverySpiProps, EMPTY_FIELDS, discoverySpiExclProps)); Set<String> connectorProps = new HashSet<>(); connectorProps.add("jettyPath"); @@ -441,7 +444,10 @@ public class WebConsoleConfigurationSelfTest { dataStorageProps.add("metricsEnabled"); dataStorageProps.add("alwaysWriteFullPages"); dataStorageProps.add("writeThrottlingEnabled"); + dataStorageProps.add("checkpointReadLockTimeout"); + dataStorageProps.add("maxWalArchiveSize"); dataStorageProps.add("walCompactionEnabled"); + dataStorageProps.add("walCompactionLevel"); metadata.put(DataStorageConfiguration.class, new MetadataInfo(dataStorageProps, EMPTY_FIELDS, EMPTY_FIELDS)); Set<String> dataRegionProps = new HashSet<>();