sb.append("state uuid: ").append(stateUUID).append("\n"); sb.append("from_diff: ").append(wasReadFromDiff).append("\n"); sb.append("meta data version: ").append(metaData.version()).append("\n"); final String TAB = " "; for (IndexMetaData indexMetaData : metaData) {
builder.field("version", metaData.version()); builder.field("cluster_uuid", metaData.clusterUUID);
return clusterState.metaData().version() >= request.waitForMetaDataVersion(); }; final ClusterStateObserver observer =
private ClusterState patchVersions(ClusterState previousClusterState, ClusterTasksResult<?> executionResult) { ClusterState newClusterState = executionResult.resultingState; if (previousClusterState != newClusterState) { // only the master controls the version numbers Builder builder = ClusterState.builder(newClusterState).incrementVersion(); if (previousClusterState.routingTable() != newClusterState.routingTable()) { builder.routingTable(RoutingTable.builder(newClusterState.routingTable()) .version(newClusterState.routingTable().version() + 1).build()); } if (previousClusterState.metaData() != newClusterState.metaData()) { builder.metaData(MetaData.builder(newClusterState.metaData()).version(newClusterState.metaData().version() + 1)); } newClusterState = builder.build(); } return newClusterState; }
public String prettyPrint() { StringBuilder sb = new StringBuilder(); sb.append("version: ").append(version).append("\n"); sb.append("state uuid: ").append(stateUUID).append("\n"); sb.append("from_diff: ").append(wasReadFromDiff).append("\n"); sb.append("meta data version: ").append(metaData.version()).append("\n"); sb.append(blocks().prettyPrint()); sb.append(nodes().prettyPrint()); sb.append(routingTable().prettyPrint()); sb.append(getRoutingNodes().prettyPrint()); return sb.toString(); }
/** * Try to read fresher metadata from cassandra. */ public MetaData checkForNewMetaData(Long expectedVersion) throws NoPersistedMetaDataException { MetaData localMetaData = readMetaDataAsRow(ConsistencyLevel.ONE); if (localMetaData != null && localMetaData.version() >= expectedVersion) { return localMetaData; } if (localMetaData == null) { throw new NoPersistedMetaDataException("No cluster metadata in "+this.elasticAdminKeyspaceName); } MetaData quorumMetaData = readMetaDataAsRow(this.metadataReadCL); if (quorumMetaData.version() >= expectedVersion) { return quorumMetaData; } return null; }
public void writeMetaDataAsComment(MetaData metaData) throws ConfigurationException, IOException { writeMetaDataAsComment( MetaData.Builder.toXContent(metaData, MetaData.CASSANDRA_FORMAT_PARAMS), metaData.version()); }
Void insertFirstMetaRow(final MetaData metadata, final String metaDataString) { try { logger.info(insertMetadataQuery); process(ConsistencyLevel.LOCAL_ONE, ClientState.forInternalCalls(), insertMetadataQuery, DatabaseDescriptor.getClusterName(), UUID.fromString(StorageService.instance.getLocalHostId()), metadata.version(), metaDataString); } catch (Exception e) { logger.error((Supplier<?>) () -> new ParameterizedMessage("Failed insert first row into table {}.{}", elasticAdminKeyspaceName, ELASTIC_ADMIN_METADATA_TABLE), e); throw e; } return null; }
/** * Writes the global state, *without* the indices states. */ void writeGlobalState(String reason, MetaData metaData) throws Exception { logger.trace("[_global] writing state, reason [{}]", reason); try { globalStateFormat.write(metaData, metaData.version(), nodeEnv.nodeDataPaths()); } catch (Throwable ex) { logger.warn("[_global]: failed to write global state", ex); throw new IOException("failed to write global state", ex); } }
@Override public void userKeyspaceInitialized() { if (node != null && !bootstrapping) { // try to read a newer metadata from the local elastic_admin.metadata table. MetaData metaData = this.node.clusterService().readInternalMetaDataAsRow(); if (metaData != null && metaData.version() > systemMetadata.version()) { try { logger.warn("Refreshing newer metadata found in {}.{} metaData uuid={} version={}", ClusterService.ELASTIC_ADMIN_KEYSPACE, ClusterService.ELASTIC_ADMIN_METADATA_TABLE, metaData.clusterUUID(), metaData.version()); node.clusterService().submitRefreshMetaData(metaData, "metadatarefresh"); if (metaData.clusterUUID() == this.node.clusterService().localNode().getId()) { logger.warn("Saving the new metadata metaData.uuid={} version={} in the CQL schema", metaData.clusterUUID(), metaData.version()); node.clusterService().writeMetaDataAsComment(metaData); } } catch (Exception e) { logger.error("Unexpected error",e); } } node.clusterService().submitNumberOfShardsAndReplicasUpdate("user-keyspaces-initialized"); } }
public void publishX2(ClusterState clusterState, boolean force) { String clusterStateSting = clusterState.metaData().clusterUUID() + '/' + clusterState.metaData().version(); if (Gossiper.instance.isEnabled() || force) { Gossiper.instance.addLocalApplicationState(ELASTIC_META_DATA, StorageService.instance.valueFactory.datacenter(clusterStateSting)); if (logger.isTraceEnabled()) logger.trace("X2={} published in gossip state", clusterStateSting); } }
@Override public void clusterChanged(ClusterChangedEvent event) { if (event.metaDataChanged()) { final long lostTimeMillis = System.currentTimeMillis() - resubmitTimeMillis; Priority priority = Priority.URGENT; TimeValue timeout = TimeValue.timeValueSeconds(30*1000 - lostTimeMillis); ClusterStateTaskConfig config; Map<Object, ClusterStateTaskListener> map = new HashMap<Object, ClusterStateTaskListener>(); for (final ClusterServiceTaskBatcher.UpdateTask updateTask : taskInputs.updateTasks) { map.put( updateTask.task, updateTask.listener); priority = updateTask.priority(); if (updateTask.task instanceof ClusterStateUpdateTask) { timeout = TimeValue.timeValueMillis( ((ClusterStateUpdateTask)updateTask.task).timeout().getMillis() - lostTimeMillis); } else if (updateTask.task instanceof ClusterStateUpdateRequest) { timeout = TimeValue.timeValueMillis( ((ClusterStateUpdateRequest)updateTask.task).masterNodeTimeout().getMillis() - lostTimeMillis); } } logger.warn("metadata.version={} => resubmit delayed update source={} tasks={} priority={} remaing timeout={}", ClusterService.this.state().metaData().version(), taskInputs.summary, taskInputs.updateTasks, priority, timeout); ClusterService.this.submitStateUpdateTasks(taskInputs.summary, map, ClusterStateTaskConfig.build(priority, timeout), taskInputs.executor); ClusterService.this.removeListener(this); // replay only once. } } });
@Override public void applyClusterState(ClusterChangedEvent event) { // create cassandra 2i on coordinator node only. for(Pair<String,MappingMetaData> mapping : updatedMapping) { String index = mapping.left; IndexMetaData indexMetaData = event.state().metaData().index(index); if (indexMetaData != null) { try { String clazz = indexMetaData.getSettings().get(IndexMetaData.SETTING_SECONDARY_INDEX_CLASS, event.state().metaData().settings().get(ClusterService.SETTING_CLUSTER_SECONDARY_INDEX_CLASS, ClusterService.defaultSecondaryIndexClass.getName())); logger.debug("Creating secondary indices for table={}.{} with class={}", indexMetaData.keyspace(), mapping.right.type(),clazz); this.clusterService.createSecondaryIndex(indexMetaData.keyspace(), mapping.right, clazz); } catch (IOException e) { logger.error("Failed to create secondary indices for table={}.{}", e, indexMetaData.keyspace(), mapping.right.type()); } } else { logger.warn("Index [{}] not found in new state metadata version={}", index, event.state().metaData().version()); } } if (updatedMapping.size() > 0) updatedMapping.clear(); }
@Override public ClusterTasksResult<LocalClusterUpdateTask> execute(ClusterState currentState) { if (currentState.supersedes(nodeSpecificClusterState)) { return unchanged(); } if (currentState.blocks().hasGlobalBlock(discoverySettings.getNoMasterBlock())) { // its a fresh update from the master as we transition from a start of not having a master to having one logger.debug("got first state from fresh master [{}]", nodeSpecificClusterState.nodes().getMasterNodeId()); return newState(nodeSpecificClusterState); } ClusterState.Builder builder = ClusterState.builder(nodeSpecificClusterState); // if the routing table did not change, use the original one if (nodeSpecificClusterState.routingTable().version() == currentState.routingTable().version()) { builder.routingTable(currentState.routingTable()); } if (nodeSpecificClusterState.metaData().version() == currentState.metaData().version()) { builder.metaData(currentState.metaData()); } return newState(builder.build()); }
@Override public ClusterState execute(ClusterState currentState) { if (nodeSpecificClusterState.version() < currentState.version() && Objects.equals(nodeSpecificClusterState.nodes().masterNodeId(), currentState.nodes().masterNodeId())) { return currentState; } if (currentState.blocks().hasGlobalBlock(discoverySettings.getNoMasterBlock())) { // its a fresh update from the master as we transition from a start of not having a master to having one logger.debug("got first state from fresh master [{}]", nodeSpecificClusterState.nodes().masterNodeId()); return nodeSpecificClusterState; } ClusterState.Builder builder = ClusterState.builder(nodeSpecificClusterState); // if the routing table did not change, use the original one if (nodeSpecificClusterState.routingTable().version() == currentState.routingTable().version()) { builder.routingTable(currentState.routingTable()); } if (nodeSpecificClusterState.metaData().version() == currentState.metaData().version()) { builder.metaData(currentState.metaData()); } return builder.build(); }
@Override public ClusterState execute(ClusterState currentState) { latestDiscoNodes = newState.nodes(); ClusterState.Builder builder = ClusterState.builder().state(newState); // if the routing table did not change, use the original one if (newState.routingTable().version() == currentState.routingTable().version()) { builder.routingTable(currentState.routingTable()); } // same for metadata if (newState.metaData().version() == currentState.metaData().version()) { builder.metaData(currentState.metaData()); } else { // if its not the same version, only copy over new indices or ones that changed the version MetaData.Builder metaDataBuilder = MetaData.builder().metaData(newState.metaData()).removeAllIndices(); for (IndexMetaData indexMetaData : newState.metaData()) { IndexMetaData currentIndexMetaData = currentState.metaData().index(indexMetaData.index()); if (currentIndexMetaData == null || currentIndexMetaData.version() != indexMetaData.version()) { metaDataBuilder.put(indexMetaData, false); } else { metaDataBuilder.put(currentIndexMetaData, false); } } builder.metaData(metaDataBuilder); } return builder.build(); }
private ClusterState patchVersions(ClusterState previousClusterState, ClusterTasksResult<?> executionResult) { ClusterState newClusterState = executionResult.resultingState; if (previousClusterState != newClusterState) { // only the master controls the version numbers Builder builder = ClusterState.builder(newClusterState).incrementVersion(); if (previousClusterState.routingTable() != newClusterState.routingTable()) { builder.routingTable(RoutingTable.builder(newClusterState.routingTable()) .version(newClusterState.routingTable().version() + 1).build()); } if (previousClusterState.metaData() != newClusterState.metaData()) { builder.metaData(MetaData.builder(newClusterState.metaData()).version(newClusterState.metaData().version() + 1)); } newClusterState = builder.build(); } return newClusterState; }
private ClusterState patchVersions(ClusterState previousClusterState, ClusterTasksResult<?> executionResult) { ClusterState newClusterState = executionResult.resultingState; if (previousClusterState != newClusterState) { // only the master controls the version numbers Builder builder = ClusterState.builder(newClusterState).incrementVersion(); if (previousClusterState.routingTable() != newClusterState.routingTable()) { builder.routingTable(RoutingTable.builder(newClusterState.routingTable()) .version(newClusterState.routingTable().version() + 1).build()); } if (previousClusterState.metaData() != newClusterState.metaData()) { builder.metaData(MetaData.builder(newClusterState.metaData()).version(newClusterState.metaData().version() + 1)); } newClusterState = builder.build(); } return newClusterState; }
/** As of 2.0 we require units for time and byte-sized settings. This methods adds default units to any * persistent settings and template settings that don't specify a unit. **/ public static MetaData addDefaultUnitsIfNeeded(ESLogger logger, MetaData metaData) { Settings newPersistentSettings = addDefaultUnitsIfNeeded( CLUSTER_TIME_SETTINGS, CLUSTER_BYTES_SIZE_SETTINGS, logger, metaData.persistentSettings()); ImmutableOpenMap<String, IndexTemplateMetaData> templates = updateTemplates(logger, metaData.getTemplates()); if (newPersistentSettings != null || templates != null) { return new MetaData( metaData.clusterUUID(), metaData.version(), metaData.transientSettings(), MoreObjects.firstNonNull(newPersistentSettings, metaData.persistentSettings()), metaData.getIndices(), MoreObjects.firstNonNull(templates, metaData.getTemplates()), metaData.getCustoms(), metaData.concreteAllIndices(), metaData.concreteAllOpenIndices(), metaData.concreteAllClosedIndices(), metaData.getAliasAndIndexLookup()); } else { // No changes: return metaData; } }