From 25c6cec267213b963f9b9bdd45cbf63acff52330 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Mon, 21 Nov 2016 10:26:15 +0100 Subject: [PATCH 1/3] Add BWC layer for Exceptions Today it's not possible to add exceptions to the serialization layer without breaking BWC. This commit adds the ability to specify the Version an exception was added that allows to fall back not NotSerializableExceptionWrapper if the expection is not present in the streams version. Relates to #21656 --- .../elasticsearch/ElasticsearchException.java | 291 ++++++++++-------- .../common/io/stream/StreamOutput.java | 2 +- .../env/ShardLockObtainFailedException.java | 24 +- .../org/elasticsearch/index/store/Store.java | 2 - .../ExceptionSerializationTests.java | 40 ++- .../java/org/elasticsearch/VersionTests.java | 1 + 6 files changed, 210 insertions(+), 150 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/ElasticsearchException.java b/core/src/main/java/org/elasticsearch/ElasticsearchException.java index 9b6bc54b045a8..0caad0d884404 100644 --- a/core/src/main/java/org/elasticsearch/ElasticsearchException.java +++ b/core/src/main/java/org/elasticsearch/ElasticsearchException.java @@ -49,6 +49,8 @@ */ public class ElasticsearchException extends RuntimeException implements ToXContent, Writeable { + public static final Version V_5_1_0_UNRELEASED = Version.fromId(5010099); + public static final Version UNKNOWN_VERSION_ADDED = Version.fromId(0); public static final String REST_EXCEPTION_SKIP_CAUSE = "rest.exception.cause.skip"; public static final String REST_EXCEPTION_SKIP_STACK_TRACE = "rest.exception.stacktrace.skip"; public static final boolean REST_EXCEPTION_SKIP_STACK_TRACE_DEFAULT = true; @@ -210,8 +212,12 @@ public static ElasticsearchException readException(StreamInput input, int id) th /** * Returns true iff the given class is a registered for an exception to be read. */ - public static boolean isRegistered(Class exception) { - return CLASS_TO_ELASTICSEARCH_EXCEPTION_HANDLE.containsKey(exception); + public static boolean isRegistered(Class exception, Version version) { + ElasticsearchExceptionHandle elasticsearchExceptionHandle = CLASS_TO_ELASTICSEARCH_EXCEPTION_HANDLE.get(exception); + if (elasticsearchExceptionHandle != null) { + return version.onOrAfter(elasticsearchExceptionHandle.versionAdded); + } + return false; } static Set> getRegisteredKeys() { // for testing @@ -432,279 +438,294 @@ public static T writeStackTraces(T throwable, StreamOutput */ enum ElasticsearchExceptionHandle { INDEX_SHARD_SNAPSHOT_FAILED_EXCEPTION(org.elasticsearch.index.snapshots.IndexShardSnapshotFailedException.class, - org.elasticsearch.index.snapshots.IndexShardSnapshotFailedException::new, 0), + org.elasticsearch.index.snapshots.IndexShardSnapshotFailedException::new, 0, UNKNOWN_VERSION_ADDED), DFS_PHASE_EXECUTION_EXCEPTION(org.elasticsearch.search.dfs.DfsPhaseExecutionException.class, - org.elasticsearch.search.dfs.DfsPhaseExecutionException::new, 1), + org.elasticsearch.search.dfs.DfsPhaseExecutionException::new, 1, UNKNOWN_VERSION_ADDED), EXECUTION_CANCELLED_EXCEPTION(org.elasticsearch.common.util.CancellableThreads.ExecutionCancelledException.class, - org.elasticsearch.common.util.CancellableThreads.ExecutionCancelledException::new, 2), + org.elasticsearch.common.util.CancellableThreads.ExecutionCancelledException::new, 2, UNKNOWN_VERSION_ADDED), MASTER_NOT_DISCOVERED_EXCEPTION(org.elasticsearch.discovery.MasterNotDiscoveredException.class, - org.elasticsearch.discovery.MasterNotDiscoveredException::new, 3), + org.elasticsearch.discovery.MasterNotDiscoveredException::new, 3, UNKNOWN_VERSION_ADDED), ELASTICSEARCH_SECURITY_EXCEPTION(org.elasticsearch.ElasticsearchSecurityException.class, - org.elasticsearch.ElasticsearchSecurityException::new, 4), + org.elasticsearch.ElasticsearchSecurityException::new, 4, UNKNOWN_VERSION_ADDED), INDEX_SHARD_RESTORE_EXCEPTION(org.elasticsearch.index.snapshots.IndexShardRestoreException.class, - org.elasticsearch.index.snapshots.IndexShardRestoreException::new, 5), + org.elasticsearch.index.snapshots.IndexShardRestoreException::new, 5, UNKNOWN_VERSION_ADDED), INDEX_CLOSED_EXCEPTION(org.elasticsearch.indices.IndexClosedException.class, - org.elasticsearch.indices.IndexClosedException::new, 6), + org.elasticsearch.indices.IndexClosedException::new, 6, UNKNOWN_VERSION_ADDED), BIND_HTTP_EXCEPTION(org.elasticsearch.http.BindHttpException.class, - org.elasticsearch.http.BindHttpException::new, 7), + org.elasticsearch.http.BindHttpException::new, 7, UNKNOWN_VERSION_ADDED), REDUCE_SEARCH_PHASE_EXCEPTION(org.elasticsearch.action.search.ReduceSearchPhaseException.class, - org.elasticsearch.action.search.ReduceSearchPhaseException::new, 8), + org.elasticsearch.action.search.ReduceSearchPhaseException::new, 8, UNKNOWN_VERSION_ADDED), NODE_CLOSED_EXCEPTION(org.elasticsearch.node.NodeClosedException.class, - org.elasticsearch.node.NodeClosedException::new, 9), + org.elasticsearch.node.NodeClosedException::new, 9, UNKNOWN_VERSION_ADDED), SNAPSHOT_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.SnapshotFailedEngineException.class, - org.elasticsearch.index.engine.SnapshotFailedEngineException::new, 10), + org.elasticsearch.index.engine.SnapshotFailedEngineException::new, 10, UNKNOWN_VERSION_ADDED), SHARD_NOT_FOUND_EXCEPTION(org.elasticsearch.index.shard.ShardNotFoundException.class, - org.elasticsearch.index.shard.ShardNotFoundException::new, 11), + org.elasticsearch.index.shard.ShardNotFoundException::new, 11, UNKNOWN_VERSION_ADDED), CONNECT_TRANSPORT_EXCEPTION(org.elasticsearch.transport.ConnectTransportException.class, - org.elasticsearch.transport.ConnectTransportException::new, 12), + org.elasticsearch.transport.ConnectTransportException::new, 12, UNKNOWN_VERSION_ADDED), NOT_SERIALIZABLE_TRANSPORT_EXCEPTION(org.elasticsearch.transport.NotSerializableTransportException.class, - org.elasticsearch.transport.NotSerializableTransportException::new, 13), + org.elasticsearch.transport.NotSerializableTransportException::new, 13, UNKNOWN_VERSION_ADDED), RESPONSE_HANDLER_FAILURE_TRANSPORT_EXCEPTION(org.elasticsearch.transport.ResponseHandlerFailureTransportException.class, - org.elasticsearch.transport.ResponseHandlerFailureTransportException::new, 14), + org.elasticsearch.transport.ResponseHandlerFailureTransportException::new, 14, UNKNOWN_VERSION_ADDED), INDEX_CREATION_EXCEPTION(org.elasticsearch.indices.IndexCreationException.class, - org.elasticsearch.indices.IndexCreationException::new, 15), + org.elasticsearch.indices.IndexCreationException::new, 15, UNKNOWN_VERSION_ADDED), INDEX_NOT_FOUND_EXCEPTION(org.elasticsearch.index.IndexNotFoundException.class, - org.elasticsearch.index.IndexNotFoundException::new, 16), + org.elasticsearch.index.IndexNotFoundException::new, 16, UNKNOWN_VERSION_ADDED), ILLEGAL_SHARD_ROUTING_STATE_EXCEPTION(org.elasticsearch.cluster.routing.IllegalShardRoutingStateException.class, - org.elasticsearch.cluster.routing.IllegalShardRoutingStateException::new, 17), + org.elasticsearch.cluster.routing.IllegalShardRoutingStateException::new, 17, UNKNOWN_VERSION_ADDED), BROADCAST_SHARD_OPERATION_FAILED_EXCEPTION(org.elasticsearch.action.support.broadcast.BroadcastShardOperationFailedException.class, - org.elasticsearch.action.support.broadcast.BroadcastShardOperationFailedException::new, 18), + org.elasticsearch.action.support.broadcast.BroadcastShardOperationFailedException::new, 18, UNKNOWN_VERSION_ADDED), RESOURCE_NOT_FOUND_EXCEPTION(org.elasticsearch.ResourceNotFoundException.class, - org.elasticsearch.ResourceNotFoundException::new, 19), + org.elasticsearch.ResourceNotFoundException::new, 19, UNKNOWN_VERSION_ADDED), ACTION_TRANSPORT_EXCEPTION(org.elasticsearch.transport.ActionTransportException.class, - org.elasticsearch.transport.ActionTransportException::new, 20), + org.elasticsearch.transport.ActionTransportException::new, 20, UNKNOWN_VERSION_ADDED), ELASTICSEARCH_GENERATION_EXCEPTION(org.elasticsearch.ElasticsearchGenerationException.class, - org.elasticsearch.ElasticsearchGenerationException::new, 21), + org.elasticsearch.ElasticsearchGenerationException::new, 21, UNKNOWN_VERSION_ADDED), // 22 was CreateFailedEngineException INDEX_SHARD_STARTED_EXCEPTION(org.elasticsearch.index.shard.IndexShardStartedException.class, - org.elasticsearch.index.shard.IndexShardStartedException::new, 23), + org.elasticsearch.index.shard.IndexShardStartedException::new, 23, UNKNOWN_VERSION_ADDED), SEARCH_CONTEXT_MISSING_EXCEPTION(org.elasticsearch.search.SearchContextMissingException.class, - org.elasticsearch.search.SearchContextMissingException::new, 24), + org.elasticsearch.search.SearchContextMissingException::new, 24, UNKNOWN_VERSION_ADDED), GENERAL_SCRIPT_EXCEPTION(org.elasticsearch.script.GeneralScriptException.class, - org.elasticsearch.script.GeneralScriptException::new, 25), + org.elasticsearch.script.GeneralScriptException::new, 25, UNKNOWN_VERSION_ADDED), BATCH_OPERATION_EXCEPTION(org.elasticsearch.index.shard.TranslogRecoveryPerformer.BatchOperationException.class, - org.elasticsearch.index.shard.TranslogRecoveryPerformer.BatchOperationException::new, 26), + org.elasticsearch.index.shard.TranslogRecoveryPerformer.BatchOperationException::new, 26, UNKNOWN_VERSION_ADDED), SNAPSHOT_CREATION_EXCEPTION(org.elasticsearch.snapshots.SnapshotCreationException.class, - org.elasticsearch.snapshots.SnapshotCreationException::new, 27), + org.elasticsearch.snapshots.SnapshotCreationException::new, 27, UNKNOWN_VERSION_ADDED), DELETE_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.DeleteFailedEngineException.class, - org.elasticsearch.index.engine.DeleteFailedEngineException::new, 28),// deprecated in 6.0, remove in 7.0 + org.elasticsearch.index.engine.DeleteFailedEngineException::new, 28, UNKNOWN_VERSION_ADDED),// deprecated in 6.0, remove in 7.0 DOCUMENT_MISSING_EXCEPTION(org.elasticsearch.index.engine.DocumentMissingException.class, - org.elasticsearch.index.engine.DocumentMissingException::new, 29), + org.elasticsearch.index.engine.DocumentMissingException::new, 29, UNKNOWN_VERSION_ADDED), SNAPSHOT_EXCEPTION(org.elasticsearch.snapshots.SnapshotException.class, - org.elasticsearch.snapshots.SnapshotException::new, 30), + org.elasticsearch.snapshots.SnapshotException::new, 30, UNKNOWN_VERSION_ADDED), INVALID_ALIAS_NAME_EXCEPTION(org.elasticsearch.indices.InvalidAliasNameException.class, - org.elasticsearch.indices.InvalidAliasNameException::new, 31), + org.elasticsearch.indices.InvalidAliasNameException::new, 31, UNKNOWN_VERSION_ADDED), INVALID_INDEX_NAME_EXCEPTION(org.elasticsearch.indices.InvalidIndexNameException.class, - org.elasticsearch.indices.InvalidIndexNameException::new, 32), + org.elasticsearch.indices.InvalidIndexNameException::new, 32, UNKNOWN_VERSION_ADDED), INDEX_PRIMARY_SHARD_NOT_ALLOCATED_EXCEPTION(org.elasticsearch.indices.IndexPrimaryShardNotAllocatedException.class, - org.elasticsearch.indices.IndexPrimaryShardNotAllocatedException::new, 33), + org.elasticsearch.indices.IndexPrimaryShardNotAllocatedException::new, 33, UNKNOWN_VERSION_ADDED), TRANSPORT_EXCEPTION(org.elasticsearch.transport.TransportException.class, - org.elasticsearch.transport.TransportException::new, 34), + org.elasticsearch.transport.TransportException::new, 34, UNKNOWN_VERSION_ADDED), ELASTICSEARCH_PARSE_EXCEPTION(org.elasticsearch.ElasticsearchParseException.class, - org.elasticsearch.ElasticsearchParseException::new, 35), + org.elasticsearch.ElasticsearchParseException::new, 35, UNKNOWN_VERSION_ADDED), SEARCH_EXCEPTION(org.elasticsearch.search.SearchException.class, - org.elasticsearch.search.SearchException::new, 36), + org.elasticsearch.search.SearchException::new, 36, UNKNOWN_VERSION_ADDED), MAPPER_EXCEPTION(org.elasticsearch.index.mapper.MapperException.class, - org.elasticsearch.index.mapper.MapperException::new, 37), + org.elasticsearch.index.mapper.MapperException::new, 37, UNKNOWN_VERSION_ADDED), INVALID_TYPE_NAME_EXCEPTION(org.elasticsearch.indices.InvalidTypeNameException.class, - org.elasticsearch.indices.InvalidTypeNameException::new, 38), + org.elasticsearch.indices.InvalidTypeNameException::new, 38, UNKNOWN_VERSION_ADDED), SNAPSHOT_RESTORE_EXCEPTION(org.elasticsearch.snapshots.SnapshotRestoreException.class, - org.elasticsearch.snapshots.SnapshotRestoreException::new, 39), - PARSING_EXCEPTION(org.elasticsearch.common.ParsingException.class, org.elasticsearch.common.ParsingException::new, 40), + org.elasticsearch.snapshots.SnapshotRestoreException::new, 39, UNKNOWN_VERSION_ADDED), + PARSING_EXCEPTION(org.elasticsearch.common.ParsingException.class, org.elasticsearch.common.ParsingException::new, 40, + UNKNOWN_VERSION_ADDED), INDEX_SHARD_CLOSED_EXCEPTION(org.elasticsearch.index.shard.IndexShardClosedException.class, - org.elasticsearch.index.shard.IndexShardClosedException::new, 41), + org.elasticsearch.index.shard.IndexShardClosedException::new, 41, UNKNOWN_VERSION_ADDED), RECOVER_FILES_RECOVERY_EXCEPTION(org.elasticsearch.indices.recovery.RecoverFilesRecoveryException.class, - org.elasticsearch.indices.recovery.RecoverFilesRecoveryException::new, 42), + org.elasticsearch.indices.recovery.RecoverFilesRecoveryException::new, 42, UNKNOWN_VERSION_ADDED), TRUNCATED_TRANSLOG_EXCEPTION(org.elasticsearch.index.translog.TruncatedTranslogException.class, - org.elasticsearch.index.translog.TruncatedTranslogException::new, 43), + org.elasticsearch.index.translog.TruncatedTranslogException::new, 43, UNKNOWN_VERSION_ADDED), RECOVERY_FAILED_EXCEPTION(org.elasticsearch.indices.recovery.RecoveryFailedException.class, - org.elasticsearch.indices.recovery.RecoveryFailedException::new, 44), + org.elasticsearch.indices.recovery.RecoveryFailedException::new, 44, UNKNOWN_VERSION_ADDED), INDEX_SHARD_RELOCATED_EXCEPTION(org.elasticsearch.index.shard.IndexShardRelocatedException.class, - org.elasticsearch.index.shard.IndexShardRelocatedException::new, 45), + org.elasticsearch.index.shard.IndexShardRelocatedException::new, 45, UNKNOWN_VERSION_ADDED), NODE_SHOULD_NOT_CONNECT_EXCEPTION(org.elasticsearch.transport.NodeShouldNotConnectException.class, - org.elasticsearch.transport.NodeShouldNotConnectException::new, 46), + org.elasticsearch.transport.NodeShouldNotConnectException::new, 46, UNKNOWN_VERSION_ADDED), // 47 used to be for IndexTemplateAlreadyExistsException which was deprecated in 5.1 removed in 6.0 TRANSLOG_CORRUPTED_EXCEPTION(org.elasticsearch.index.translog.TranslogCorruptedException.class, - org.elasticsearch.index.translog.TranslogCorruptedException::new, 48), + org.elasticsearch.index.translog.TranslogCorruptedException::new, 48, UNKNOWN_VERSION_ADDED), CLUSTER_BLOCK_EXCEPTION(org.elasticsearch.cluster.block.ClusterBlockException.class, - org.elasticsearch.cluster.block.ClusterBlockException::new, 49), + org.elasticsearch.cluster.block.ClusterBlockException::new, 49, UNKNOWN_VERSION_ADDED), FETCH_PHASE_EXECUTION_EXCEPTION(org.elasticsearch.search.fetch.FetchPhaseExecutionException.class, - org.elasticsearch.search.fetch.FetchPhaseExecutionException::new, 50), + org.elasticsearch.search.fetch.FetchPhaseExecutionException::new, 50, UNKNOWN_VERSION_ADDED), // 51 used to be for IndexShardAlreadyExistsException which was deprecated in 5.1 removed in 6.0 VERSION_CONFLICT_ENGINE_EXCEPTION(org.elasticsearch.index.engine.VersionConflictEngineException.class, - org.elasticsearch.index.engine.VersionConflictEngineException::new, 52), - ENGINE_EXCEPTION(org.elasticsearch.index.engine.EngineException.class, org.elasticsearch.index.engine.EngineException::new, 53), + org.elasticsearch.index.engine.VersionConflictEngineException::new, 52, UNKNOWN_VERSION_ADDED), + ENGINE_EXCEPTION(org.elasticsearch.index.engine.EngineException.class, org.elasticsearch.index.engine.EngineException::new, 53, + UNKNOWN_VERSION_ADDED), // 54 was DocumentAlreadyExistsException, which is superseded by VersionConflictEngineException - NO_SUCH_NODE_EXCEPTION(org.elasticsearch.action.NoSuchNodeException.class, org.elasticsearch.action.NoSuchNodeException::new, 55), + NO_SUCH_NODE_EXCEPTION(org.elasticsearch.action.NoSuchNodeException.class, org.elasticsearch.action.NoSuchNodeException::new, 55, + UNKNOWN_VERSION_ADDED), SETTINGS_EXCEPTION(org.elasticsearch.common.settings.SettingsException.class, - org.elasticsearch.common.settings.SettingsException::new, 56), + org.elasticsearch.common.settings.SettingsException::new, 56, UNKNOWN_VERSION_ADDED), INDEX_TEMPLATE_MISSING_EXCEPTION(org.elasticsearch.indices.IndexTemplateMissingException.class, - org.elasticsearch.indices.IndexTemplateMissingException::new, 57), + org.elasticsearch.indices.IndexTemplateMissingException::new, 57, UNKNOWN_VERSION_ADDED), SEND_REQUEST_TRANSPORT_EXCEPTION(org.elasticsearch.transport.SendRequestTransportException.class, - org.elasticsearch.transport.SendRequestTransportException::new, 58), + org.elasticsearch.transport.SendRequestTransportException::new, 58, UNKNOWN_VERSION_ADDED), ES_REJECTED_EXECUTION_EXCEPTION(org.elasticsearch.common.util.concurrent.EsRejectedExecutionException.class, - org.elasticsearch.common.util.concurrent.EsRejectedExecutionException::new, 59), + org.elasticsearch.common.util.concurrent.EsRejectedExecutionException::new, 59, UNKNOWN_VERSION_ADDED), EARLY_TERMINATION_EXCEPTION(org.elasticsearch.common.lucene.Lucene.EarlyTerminationException.class, - org.elasticsearch.common.lucene.Lucene.EarlyTerminationException::new, 60), + org.elasticsearch.common.lucene.Lucene.EarlyTerminationException::new, 60, UNKNOWN_VERSION_ADDED), // 61 used to be for RoutingValidationException NOT_SERIALIZABLE_EXCEPTION_WRAPPER(org.elasticsearch.common.io.stream.NotSerializableExceptionWrapper.class, - org.elasticsearch.common.io.stream.NotSerializableExceptionWrapper::new, 62), + org.elasticsearch.common.io.stream.NotSerializableExceptionWrapper::new, 62, UNKNOWN_VERSION_ADDED), ALIAS_FILTER_PARSING_EXCEPTION(org.elasticsearch.indices.AliasFilterParsingException.class, - org.elasticsearch.indices.AliasFilterParsingException::new, 63), + org.elasticsearch.indices.AliasFilterParsingException::new, 63, UNKNOWN_VERSION_ADDED), // 64 was DeleteByQueryFailedEngineException, which was removed in 5.0 - GATEWAY_EXCEPTION(org.elasticsearch.gateway.GatewayException.class, org.elasticsearch.gateway.GatewayException::new, 65), + GATEWAY_EXCEPTION(org.elasticsearch.gateway.GatewayException.class, org.elasticsearch.gateway.GatewayException::new, 65, + UNKNOWN_VERSION_ADDED), INDEX_SHARD_NOT_RECOVERING_EXCEPTION(org.elasticsearch.index.shard.IndexShardNotRecoveringException.class, - org.elasticsearch.index.shard.IndexShardNotRecoveringException::new, 66), - HTTP_EXCEPTION(org.elasticsearch.http.HttpException.class, org.elasticsearch.http.HttpException::new, 67), + org.elasticsearch.index.shard.IndexShardNotRecoveringException::new, 66, UNKNOWN_VERSION_ADDED), + HTTP_EXCEPTION(org.elasticsearch.http.HttpException.class, org.elasticsearch.http.HttpException::new, 67, UNKNOWN_VERSION_ADDED), ELASTICSEARCH_EXCEPTION(org.elasticsearch.ElasticsearchException.class, - org.elasticsearch.ElasticsearchException::new, 68), + org.elasticsearch.ElasticsearchException::new, 68, UNKNOWN_VERSION_ADDED), SNAPSHOT_MISSING_EXCEPTION(org.elasticsearch.snapshots.SnapshotMissingException.class, - org.elasticsearch.snapshots.SnapshotMissingException::new, 69), + org.elasticsearch.snapshots.SnapshotMissingException::new, 69, UNKNOWN_VERSION_ADDED), PRIMARY_MISSING_ACTION_EXCEPTION(org.elasticsearch.action.PrimaryMissingActionException.class, - org.elasticsearch.action.PrimaryMissingActionException::new, 70), - FAILED_NODE_EXCEPTION(org.elasticsearch.action.FailedNodeException.class, org.elasticsearch.action.FailedNodeException::new, 71), - SEARCH_PARSE_EXCEPTION(org.elasticsearch.search.SearchParseException.class, org.elasticsearch.search.SearchParseException::new, 72), + org.elasticsearch.action.PrimaryMissingActionException::new, 70, UNKNOWN_VERSION_ADDED), + FAILED_NODE_EXCEPTION(org.elasticsearch.action.FailedNodeException.class, org.elasticsearch.action.FailedNodeException::new, 71, + UNKNOWN_VERSION_ADDED), + SEARCH_PARSE_EXCEPTION(org.elasticsearch.search.SearchParseException.class, org.elasticsearch.search.SearchParseException::new, 72, + UNKNOWN_VERSION_ADDED), CONCURRENT_SNAPSHOT_EXECUTION_EXCEPTION(org.elasticsearch.snapshots.ConcurrentSnapshotExecutionException.class, - org.elasticsearch.snapshots.ConcurrentSnapshotExecutionException::new, 73), + org.elasticsearch.snapshots.ConcurrentSnapshotExecutionException::new, 73, UNKNOWN_VERSION_ADDED), BLOB_STORE_EXCEPTION(org.elasticsearch.common.blobstore.BlobStoreException.class, - org.elasticsearch.common.blobstore.BlobStoreException::new, 74), + org.elasticsearch.common.blobstore.BlobStoreException::new, 74, UNKNOWN_VERSION_ADDED), INCOMPATIBLE_CLUSTER_STATE_VERSION_EXCEPTION(org.elasticsearch.cluster.IncompatibleClusterStateVersionException.class, - org.elasticsearch.cluster.IncompatibleClusterStateVersionException::new, 75), + org.elasticsearch.cluster.IncompatibleClusterStateVersionException::new, 75, UNKNOWN_VERSION_ADDED), RECOVERY_ENGINE_EXCEPTION(org.elasticsearch.index.engine.RecoveryEngineException.class, - org.elasticsearch.index.engine.RecoveryEngineException::new, 76), + org.elasticsearch.index.engine.RecoveryEngineException::new, 76, UNKNOWN_VERSION_ADDED), UNCATEGORIZED_EXECUTION_EXCEPTION(org.elasticsearch.common.util.concurrent.UncategorizedExecutionException.class, - org.elasticsearch.common.util.concurrent.UncategorizedExecutionException::new, 77), + org.elasticsearch.common.util.concurrent.UncategorizedExecutionException::new, 77, UNKNOWN_VERSION_ADDED), TIMESTAMP_PARSING_EXCEPTION(org.elasticsearch.action.TimestampParsingException.class, - org.elasticsearch.action.TimestampParsingException::new, 78), + org.elasticsearch.action.TimestampParsingException::new, 78, UNKNOWN_VERSION_ADDED), ROUTING_MISSING_EXCEPTION(org.elasticsearch.action.RoutingMissingException.class, - org.elasticsearch.action.RoutingMissingException::new, 79), - INDEX_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.IndexFailedEngineException.class, - org.elasticsearch.index.engine.IndexFailedEngineException::new, 80), // deprecated in 6.0, remove in 7.0 + org.elasticsearch.action.RoutingMissingException::new, 79, UNKNOWN_VERSION_ADDED), + INDEX_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.IndexFailedEngineException.class, // deprecated in 6.0, remove in 7.0 + org.elasticsearch.index.engine.IndexFailedEngineException::new, 80, UNKNOWN_VERSION_ADDED), INDEX_SHARD_RESTORE_FAILED_EXCEPTION(org.elasticsearch.index.snapshots.IndexShardRestoreFailedException.class, - org.elasticsearch.index.snapshots.IndexShardRestoreFailedException::new, 81), + org.elasticsearch.index.snapshots.IndexShardRestoreFailedException::new, 81, UNKNOWN_VERSION_ADDED), REPOSITORY_EXCEPTION(org.elasticsearch.repositories.RepositoryException.class, - org.elasticsearch.repositories.RepositoryException::new, 82), + org.elasticsearch.repositories.RepositoryException::new, 82, UNKNOWN_VERSION_ADDED), RECEIVE_TIMEOUT_TRANSPORT_EXCEPTION(org.elasticsearch.transport.ReceiveTimeoutTransportException.class, - org.elasticsearch.transport.ReceiveTimeoutTransportException::new, 83), + org.elasticsearch.transport.ReceiveTimeoutTransportException::new, 83, UNKNOWN_VERSION_ADDED), NODE_DISCONNECTED_EXCEPTION(org.elasticsearch.transport.NodeDisconnectedException.class, - org.elasticsearch.transport.NodeDisconnectedException::new, 84), + org.elasticsearch.transport.NodeDisconnectedException::new, 84, UNKNOWN_VERSION_ADDED), ALREADY_EXPIRED_EXCEPTION(org.elasticsearch.index.AlreadyExpiredException.class, - org.elasticsearch.index.AlreadyExpiredException::new, 85), + org.elasticsearch.index.AlreadyExpiredException::new, 85, UNKNOWN_VERSION_ADDED), AGGREGATION_EXECUTION_EXCEPTION(org.elasticsearch.search.aggregations.AggregationExecutionException.class, - org.elasticsearch.search.aggregations.AggregationExecutionException::new, 86), + org.elasticsearch.search.aggregations.AggregationExecutionException::new, 86, UNKNOWN_VERSION_ADDED), // 87 used to be for MergeMappingException INVALID_INDEX_TEMPLATE_EXCEPTION(org.elasticsearch.indices.InvalidIndexTemplateException.class, - org.elasticsearch.indices.InvalidIndexTemplateException::new, 88), + org.elasticsearch.indices.InvalidIndexTemplateException::new, 88, UNKNOWN_VERSION_ADDED), REFRESH_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.RefreshFailedEngineException.class, - org.elasticsearch.index.engine.RefreshFailedEngineException::new, 90), + org.elasticsearch.index.engine.RefreshFailedEngineException::new, 90, UNKNOWN_VERSION_ADDED), AGGREGATION_INITIALIZATION_EXCEPTION(org.elasticsearch.search.aggregations.AggregationInitializationException.class, - org.elasticsearch.search.aggregations.AggregationInitializationException::new, 91), + org.elasticsearch.search.aggregations.AggregationInitializationException::new, 91, UNKNOWN_VERSION_ADDED), DELAY_RECOVERY_EXCEPTION(org.elasticsearch.indices.recovery.DelayRecoveryException.class, - org.elasticsearch.indices.recovery.DelayRecoveryException::new, 92), + org.elasticsearch.indices.recovery.DelayRecoveryException::new, 92, UNKNOWN_VERSION_ADDED), // 93 used to be for IndexWarmerMissingException NO_NODE_AVAILABLE_EXCEPTION(org.elasticsearch.client.transport.NoNodeAvailableException.class, - org.elasticsearch.client.transport.NoNodeAvailableException::new, 94), + org.elasticsearch.client.transport.NoNodeAvailableException::new, 94, UNKNOWN_VERSION_ADDED), INVALID_SNAPSHOT_NAME_EXCEPTION(org.elasticsearch.snapshots.InvalidSnapshotNameException.class, - org.elasticsearch.snapshots.InvalidSnapshotNameException::new, 96), + org.elasticsearch.snapshots.InvalidSnapshotNameException::new, 96, UNKNOWN_VERSION_ADDED), ILLEGAL_INDEX_SHARD_STATE_EXCEPTION(org.elasticsearch.index.shard.IllegalIndexShardStateException.class, - org.elasticsearch.index.shard.IllegalIndexShardStateException::new, 97), + org.elasticsearch.index.shard.IllegalIndexShardStateException::new, 97, UNKNOWN_VERSION_ADDED), INDEX_SHARD_SNAPSHOT_EXCEPTION(org.elasticsearch.index.snapshots.IndexShardSnapshotException.class, - org.elasticsearch.index.snapshots.IndexShardSnapshotException::new, 98), + org.elasticsearch.index.snapshots.IndexShardSnapshotException::new, 98, UNKNOWN_VERSION_ADDED), INDEX_SHARD_NOT_STARTED_EXCEPTION(org.elasticsearch.index.shard.IndexShardNotStartedException.class, - org.elasticsearch.index.shard.IndexShardNotStartedException::new, 99), + org.elasticsearch.index.shard.IndexShardNotStartedException::new, 99, UNKNOWN_VERSION_ADDED), SEARCH_PHASE_EXECUTION_EXCEPTION(org.elasticsearch.action.search.SearchPhaseExecutionException.class, - org.elasticsearch.action.search.SearchPhaseExecutionException::new, 100), + org.elasticsearch.action.search.SearchPhaseExecutionException::new, 100, UNKNOWN_VERSION_ADDED), ACTION_NOT_FOUND_TRANSPORT_EXCEPTION(org.elasticsearch.transport.ActionNotFoundTransportException.class, - org.elasticsearch.transport.ActionNotFoundTransportException::new, 101), + org.elasticsearch.transport.ActionNotFoundTransportException::new, 101, UNKNOWN_VERSION_ADDED), TRANSPORT_SERIALIZATION_EXCEPTION(org.elasticsearch.transport.TransportSerializationException.class, - org.elasticsearch.transport.TransportSerializationException::new, 102), + org.elasticsearch.transport.TransportSerializationException::new, 102, UNKNOWN_VERSION_ADDED), REMOTE_TRANSPORT_EXCEPTION(org.elasticsearch.transport.RemoteTransportException.class, - org.elasticsearch.transport.RemoteTransportException::new, 103), + org.elasticsearch.transport.RemoteTransportException::new, 103, UNKNOWN_VERSION_ADDED), ENGINE_CREATION_FAILURE_EXCEPTION(org.elasticsearch.index.engine.EngineCreationFailureException.class, - org.elasticsearch.index.engine.EngineCreationFailureException::new, 104), + org.elasticsearch.index.engine.EngineCreationFailureException::new, 104, UNKNOWN_VERSION_ADDED), ROUTING_EXCEPTION(org.elasticsearch.cluster.routing.RoutingException.class, - org.elasticsearch.cluster.routing.RoutingException::new, 105), + org.elasticsearch.cluster.routing.RoutingException::new, 105, UNKNOWN_VERSION_ADDED), INDEX_SHARD_RECOVERY_EXCEPTION(org.elasticsearch.index.shard.IndexShardRecoveryException.class, - org.elasticsearch.index.shard.IndexShardRecoveryException::new, 106), + org.elasticsearch.index.shard.IndexShardRecoveryException::new, 106, UNKNOWN_VERSION_ADDED), REPOSITORY_MISSING_EXCEPTION(org.elasticsearch.repositories.RepositoryMissingException.class, - org.elasticsearch.repositories.RepositoryMissingException::new, 107), + org.elasticsearch.repositories.RepositoryMissingException::new, 107, UNKNOWN_VERSION_ADDED), DOCUMENT_SOURCE_MISSING_EXCEPTION(org.elasticsearch.index.engine.DocumentSourceMissingException.class, - org.elasticsearch.index.engine.DocumentSourceMissingException::new, 109), + org.elasticsearch.index.engine.DocumentSourceMissingException::new, 109, UNKNOWN_VERSION_ADDED), // 110 used to be FlushNotAllowedEngineException NO_CLASS_SETTINGS_EXCEPTION(org.elasticsearch.common.settings.NoClassSettingsException.class, - org.elasticsearch.common.settings.NoClassSettingsException::new, 111), + org.elasticsearch.common.settings.NoClassSettingsException::new, 111, UNKNOWN_VERSION_ADDED), BIND_TRANSPORT_EXCEPTION(org.elasticsearch.transport.BindTransportException.class, - org.elasticsearch.transport.BindTransportException::new, 112), + org.elasticsearch.transport.BindTransportException::new, 112, UNKNOWN_VERSION_ADDED), ALIASES_NOT_FOUND_EXCEPTION(org.elasticsearch.rest.action.admin.indices.AliasesNotFoundException.class, - org.elasticsearch.rest.action.admin.indices.AliasesNotFoundException::new, 113), + org.elasticsearch.rest.action.admin.indices.AliasesNotFoundException::new, 113, UNKNOWN_VERSION_ADDED), INDEX_SHARD_RECOVERING_EXCEPTION(org.elasticsearch.index.shard.IndexShardRecoveringException.class, - org.elasticsearch.index.shard.IndexShardRecoveringException::new, 114), + org.elasticsearch.index.shard.IndexShardRecoveringException::new, 114, UNKNOWN_VERSION_ADDED), TRANSLOG_EXCEPTION(org.elasticsearch.index.translog.TranslogException.class, - org.elasticsearch.index.translog.TranslogException::new, 115), + org.elasticsearch.index.translog.TranslogException::new, 115, UNKNOWN_VERSION_ADDED), PROCESS_CLUSTER_EVENT_TIMEOUT_EXCEPTION(org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException.class, - org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException::new, 116), + org.elasticsearch.cluster.metadata.ProcessClusterEventTimeoutException::new, 116, UNKNOWN_VERSION_ADDED), RETRY_ON_PRIMARY_EXCEPTION(ReplicationOperation.RetryOnPrimaryException.class, - ReplicationOperation.RetryOnPrimaryException::new, 117), + ReplicationOperation.RetryOnPrimaryException::new, 117, UNKNOWN_VERSION_ADDED), ELASTICSEARCH_TIMEOUT_EXCEPTION(org.elasticsearch.ElasticsearchTimeoutException.class, - org.elasticsearch.ElasticsearchTimeoutException::new, 118), + org.elasticsearch.ElasticsearchTimeoutException::new, 118, UNKNOWN_VERSION_ADDED), QUERY_PHASE_EXECUTION_EXCEPTION(org.elasticsearch.search.query.QueryPhaseExecutionException.class, - org.elasticsearch.search.query.QueryPhaseExecutionException::new, 119), + org.elasticsearch.search.query.QueryPhaseExecutionException::new, 119, UNKNOWN_VERSION_ADDED), REPOSITORY_VERIFICATION_EXCEPTION(org.elasticsearch.repositories.RepositoryVerificationException.class, - org.elasticsearch.repositories.RepositoryVerificationException::new, 120), + org.elasticsearch.repositories.RepositoryVerificationException::new, 120, UNKNOWN_VERSION_ADDED), INVALID_AGGREGATION_PATH_EXCEPTION(org.elasticsearch.search.aggregations.InvalidAggregationPathException.class, - org.elasticsearch.search.aggregations.InvalidAggregationPathException::new, 121), + org.elasticsearch.search.aggregations.InvalidAggregationPathException::new, 121, UNKNOWN_VERSION_ADDED), // 123 used to be IndexAlreadyExistsException and was renamed RESOURCE_ALREADY_EXISTS_EXCEPTION(ResourceAlreadyExistsException.class, - ResourceAlreadyExistsException::new, 123), + ResourceAlreadyExistsException::new, 123, UNKNOWN_VERSION_ADDED), // 124 used to be Script.ScriptParseException HTTP_ON_TRANSPORT_EXCEPTION(TcpTransport.HttpOnTransportException.class, - TcpTransport.HttpOnTransportException::new, 125), + TcpTransport.HttpOnTransportException::new, 125, UNKNOWN_VERSION_ADDED), MAPPER_PARSING_EXCEPTION(org.elasticsearch.index.mapper.MapperParsingException.class, - org.elasticsearch.index.mapper.MapperParsingException::new, 126), + org.elasticsearch.index.mapper.MapperParsingException::new, 126, UNKNOWN_VERSION_ADDED), SEARCH_CONTEXT_EXCEPTION(org.elasticsearch.search.SearchContextException.class, - org.elasticsearch.search.SearchContextException::new, 127), + org.elasticsearch.search.SearchContextException::new, 127, UNKNOWN_VERSION_ADDED), SEARCH_SOURCE_BUILDER_EXCEPTION(org.elasticsearch.search.builder.SearchSourceBuilderException.class, - org.elasticsearch.search.builder.SearchSourceBuilderException::new, 128), + org.elasticsearch.search.builder.SearchSourceBuilderException::new, 128, UNKNOWN_VERSION_ADDED), ENGINE_CLOSED_EXCEPTION(org.elasticsearch.index.engine.EngineClosedException.class, - org.elasticsearch.index.engine.EngineClosedException::new, 129), + org.elasticsearch.index.engine.EngineClosedException::new, 129, UNKNOWN_VERSION_ADDED), NO_SHARD_AVAILABLE_ACTION_EXCEPTION(org.elasticsearch.action.NoShardAvailableActionException.class, - org.elasticsearch.action.NoShardAvailableActionException::new, 130), + org.elasticsearch.action.NoShardAvailableActionException::new, 130, UNKNOWN_VERSION_ADDED), UNAVAILABLE_SHARDS_EXCEPTION(org.elasticsearch.action.UnavailableShardsException.class, - org.elasticsearch.action.UnavailableShardsException::new, 131), + org.elasticsearch.action.UnavailableShardsException::new, 131, UNKNOWN_VERSION_ADDED), FLUSH_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.FlushFailedEngineException.class, - org.elasticsearch.index.engine.FlushFailedEngineException::new, 132), + org.elasticsearch.index.engine.FlushFailedEngineException::new, 132, UNKNOWN_VERSION_ADDED), CIRCUIT_BREAKING_EXCEPTION(org.elasticsearch.common.breaker.CircuitBreakingException.class, - org.elasticsearch.common.breaker.CircuitBreakingException::new, 133), + org.elasticsearch.common.breaker.CircuitBreakingException::new, 133, UNKNOWN_VERSION_ADDED), NODE_NOT_CONNECTED_EXCEPTION(org.elasticsearch.transport.NodeNotConnectedException.class, - org.elasticsearch.transport.NodeNotConnectedException::new, 134), + org.elasticsearch.transport.NodeNotConnectedException::new, 134, UNKNOWN_VERSION_ADDED), STRICT_DYNAMIC_MAPPING_EXCEPTION(org.elasticsearch.index.mapper.StrictDynamicMappingException.class, - org.elasticsearch.index.mapper.StrictDynamicMappingException::new, 135), + org.elasticsearch.index.mapper.StrictDynamicMappingException::new, 135, UNKNOWN_VERSION_ADDED), RETRY_ON_REPLICA_EXCEPTION(org.elasticsearch.action.support.replication.TransportReplicationAction.RetryOnReplicaException.class, - org.elasticsearch.action.support.replication.TransportReplicationAction.RetryOnReplicaException::new, 136), + org.elasticsearch.action.support.replication.TransportReplicationAction.RetryOnReplicaException::new, 136, + UNKNOWN_VERSION_ADDED), TYPE_MISSING_EXCEPTION(org.elasticsearch.indices.TypeMissingException.class, - org.elasticsearch.indices.TypeMissingException::new, 137), + org.elasticsearch.indices.TypeMissingException::new, 137, UNKNOWN_VERSION_ADDED), FAILED_TO_COMMIT_CLUSTER_STATE_EXCEPTION(org.elasticsearch.discovery.Discovery.FailedToCommitClusterStateException.class, - org.elasticsearch.discovery.Discovery.FailedToCommitClusterStateException::new, 140), + org.elasticsearch.discovery.Discovery.FailedToCommitClusterStateException::new, 140, UNKNOWN_VERSION_ADDED), QUERY_SHARD_EXCEPTION(org.elasticsearch.index.query.QueryShardException.class, - org.elasticsearch.index.query.QueryShardException::new, 141), + org.elasticsearch.index.query.QueryShardException::new, 141, UNKNOWN_VERSION_ADDED), NO_LONGER_PRIMARY_SHARD_EXCEPTION(ShardStateAction.NoLongerPrimaryShardException.class, - ShardStateAction.NoLongerPrimaryShardException::new, 142), - SCRIPT_EXCEPTION(org.elasticsearch.script.ScriptException.class, org.elasticsearch.script.ScriptException::new, 143), - NOT_MASTER_EXCEPTION(org.elasticsearch.cluster.NotMasterException.class, org.elasticsearch.cluster.NotMasterException::new, 144), - STATUS_EXCEPTION(org.elasticsearch.ElasticsearchStatusException.class, org.elasticsearch.ElasticsearchStatusException::new, 145), + ShardStateAction.NoLongerPrimaryShardException::new, 142, UNKNOWN_VERSION_ADDED), + SCRIPT_EXCEPTION(org.elasticsearch.script.ScriptException.class, org.elasticsearch.script.ScriptException::new, 143, + UNKNOWN_VERSION_ADDED), + NOT_MASTER_EXCEPTION(org.elasticsearch.cluster.NotMasterException.class, org.elasticsearch.cluster.NotMasterException::new, 144, + UNKNOWN_VERSION_ADDED), + STATUS_EXCEPTION(org.elasticsearch.ElasticsearchStatusException.class, org.elasticsearch.ElasticsearchStatusException::new, 145, + UNKNOWN_VERSION_ADDED), TASK_CANCELLED_EXCEPTION(org.elasticsearch.tasks.TaskCancelledException.class, - org.elasticsearch.tasks.TaskCancelledException::new, 146); + org.elasticsearch.tasks.TaskCancelledException::new, 146, UNKNOWN_VERSION_ADDED), + SHARD_LOCK_OBTAIN_FAILED_EXCEPTION(org.elasticsearch.env.ShardLockObtainFailedException.class, + org.elasticsearch.env.ShardLockObtainFailedException::new, 147, V_5_1_0_UNRELEASED); final Class exceptionClass; final FunctionThatThrowsIOException constructor; final int id; + final Version versionAdded; ElasticsearchExceptionHandle(Class exceptionClass, - FunctionThatThrowsIOException constructor, int id) { + FunctionThatThrowsIOException constructor, int id, + Version versionAdded) { // We need the exceptionClass because you can't dig it out of the constructor reliably. this.exceptionClass = exceptionClass; this.constructor = constructor; + this.versionAdded = versionAdded; this.id = id; } } diff --git a/core/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java b/core/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java index 3ba911ef9eebd..9e53c78bcfddc 100644 --- a/core/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java +++ b/core/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java @@ -783,7 +783,7 @@ public void writeException(Throwable throwable) throws IOException { writeVInt(17); } else { ElasticsearchException ex; - if (throwable instanceof ElasticsearchException && ElasticsearchException.isRegistered(throwable.getClass())) { + if (throwable instanceof ElasticsearchException && ElasticsearchException.isRegistered(throwable.getClass(), version)) { ex = (ElasticsearchException) throwable; } else { ex = new NotSerializableExceptionWrapper(throwable); diff --git a/core/src/main/java/org/elasticsearch/env/ShardLockObtainFailedException.java b/core/src/main/java/org/elasticsearch/env/ShardLockObtainFailedException.java index d1a8ce3b6d480..21bba81adbb1f 100644 --- a/core/src/main/java/org/elasticsearch/env/ShardLockObtainFailedException.java +++ b/core/src/main/java/org/elasticsearch/env/ShardLockObtainFailedException.java @@ -19,30 +19,36 @@ package org.elasticsearch.env; +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.index.shard.ShardId; +import java.io.IOException; + /** * Exception used when the in-memory lock for a shard cannot be obtained */ -public class ShardLockObtainFailedException extends Exception { - private final ShardId shardId; +public class ShardLockObtainFailedException extends ElasticsearchException { public ShardLockObtainFailedException(ShardId shardId, String message) { - super(message); - this.shardId = shardId; + super(buildMessage(shardId, message)); + this.setShard(shardId); } public ShardLockObtainFailedException(ShardId shardId, String message, Throwable cause) { - super(message, cause); - this.shardId = shardId; + super(buildMessage(shardId, message), cause); + this.setShard(shardId); + } + + public ShardLockObtainFailedException(StreamInput in) throws IOException { + super(in); } - @Override - public String getMessage() { + private static String buildMessage(ShardId shardId, String message) { StringBuilder sb = new StringBuilder(); sb.append(shardId.toString()); sb.append(": "); - sb.append(super.getMessage()); + sb.append(message); return sb.toString(); } } diff --git a/core/src/main/java/org/elasticsearch/index/store/Store.java b/core/src/main/java/org/elasticsearch/index/store/Store.java index 6f345b587979d..9c29c081ec807 100644 --- a/core/src/main/java/org/elasticsearch/index/store/Store.java +++ b/core/src/main/java/org/elasticsearch/index/store/Store.java @@ -388,8 +388,6 @@ public static MetadataSnapshot readMetadataSnapshot(Path indexLocation, ShardId // that's fine - happens all the time no need to log } catch (FileNotFoundException | NoSuchFileException ex) { logger.info("Failed to open / find files while reading metadata snapshot"); - } catch (ShardLockObtainFailedException ex) { - logger.info((Supplier) () -> new ParameterizedMessage("{}: failed to obtain shard lock", shardId), ex); } return MetadataSnapshot.EMPTY; } diff --git a/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java b/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java index ac42bb5cdcedd..603272126b4a4 100644 --- a/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java +++ b/core/src/test/java/org/elasticsearch/ExceptionSerializationTests.java @@ -49,6 +49,7 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentLocation; import org.elasticsearch.discovery.DiscoverySettings; +import org.elasticsearch.env.ShardLockObtainFailedException; import org.elasticsearch.index.AlreadyExpiredException; import org.elasticsearch.index.Index; import org.elasticsearch.index.engine.RecoveryEngineException; @@ -107,6 +108,7 @@ import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.instanceOf; public class ExceptionSerializationTests extends ESTestCase { @@ -160,10 +162,10 @@ private void checkClass(Class clazz) { if (isEsException(clazz) == false) { return; } - if (ElasticsearchException.isRegistered(clazz.asSubclass(Throwable.class)) == false + if (ElasticsearchException.isRegistered(clazz.asSubclass(Throwable.class), Version.CURRENT) == false && ElasticsearchException.class.equals(clazz.getEnclosingClass()) == false) { notRegistered.add(clazz); - } else if (ElasticsearchException.isRegistered(clazz.asSubclass(Throwable.class))) { + } else if (ElasticsearchException.isRegistered(clazz.asSubclass(Throwable.class), Version.CURRENT)) { registered.add(clazz); try { if (clazz.getMethod("writeTo", StreamOutput.class) != null) { @@ -218,10 +220,17 @@ public TestException(StreamInput in) throws IOException { } private T serialize(T exception) throws IOException { - ElasticsearchAssertions.assertVersionSerializable(VersionUtils.randomVersion(random()), exception); + return serialize(exception, VersionUtils.randomVersion(random())); + } + + private T serialize(T exception, Version version) throws IOException { + ElasticsearchAssertions.assertVersionSerializable(version, exception); BytesStreamOutput out = new BytesStreamOutput(); + out.setVersion(version); out.writeException(exception); + StreamInput in = out.bytes().streamInput(); + in.setVersion(version); return in.readException(); } @@ -769,6 +778,7 @@ public void testIds() { ids.put(144, org.elasticsearch.cluster.NotMasterException.class); ids.put(145, org.elasticsearch.ElasticsearchStatusException.class); ids.put(146, org.elasticsearch.tasks.TaskCancelledException.class); + ids.put(147, org.elasticsearch.env.ShardLockObtainFailedException.class); Map, Integer> reverse = new HashMap<>(); for (Map.Entry> entry : ids.entrySet()) { @@ -826,4 +836,28 @@ public void testElasticsearchRemoteException() throws IOException { assertEquals(ex.status(), e.status()); assertEquals(RestStatus.TOO_MANY_REQUESTS, e.status()); } + + public void testShardLockObtainFailedException() throws IOException { + ShardId shardId = new ShardId("foo", "_na_", 1); + ShardLockObtainFailedException orig = new ShardLockObtainFailedException(shardId, "boom"); + Version version = VersionUtils.randomVersionBetween(random(), + Version.V_5_0_0, Version.CURRENT); + if (version.before(ElasticsearchException.V_5_1_0_UNRELEASED)) { + // remove this once 5_1_0 is released randomVersionBetween asserts that this version is in the constant table.. + version = ElasticsearchException.V_5_1_0_UNRELEASED; + } + ShardLockObtainFailedException ex = serialize(orig, version); + assertEquals(orig.getMessage(), ex.getMessage()); + assertEquals(orig.getShardId(), ex.getShardId()); + } + + public void testBWCShardLockObtainFailedException() throws IOException { + ShardId shardId = new ShardId("foo", "_na_", 1); + ShardLockObtainFailedException orig = new ShardLockObtainFailedException(shardId, "boom"); + Exception ex = serialize((Exception)orig, Version.V_5_0_0); + assertThat(ex, instanceOf(NotSerializableExceptionWrapper.class)); + assertEquals("shard_lock_obtain_failed_exception: [foo][1]: boom", ex.getMessage()); + } + + } diff --git a/core/src/test/java/org/elasticsearch/VersionTests.java b/core/src/test/java/org/elasticsearch/VersionTests.java index 9499b79432c4c..1e87f7eeb3151 100644 --- a/core/src/test/java/org/elasticsearch/VersionTests.java +++ b/core/src/test/java/org/elasticsearch/VersionTests.java @@ -284,6 +284,7 @@ public void testUnknownVersions() { assertUnknownVersion(OsStats.V_5_1_0); // once we released 5.1.0 and it's added to Version.java we need to remove this constant assertUnknownVersion(QueryStringQueryBuilder.V_5_1_0_UNRELEASED); assertUnknownVersion(SimpleQueryStringBuilder.V_5_1_0_UNRELEASED); + assertUnknownVersion(ElasticsearchException.V_5_1_0_UNRELEASED); // once we released 5.0.0 and it's added to Version.java we need to remove this constant assertUnknownVersion(Script.V_5_1_0_UNRELEASED); // once we released 5.0.0 and it's added to Version.java we need to remove this constant From 3d927936290e339ceebc574dd4584adcc1bacf32 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Mon, 21 Nov 2016 10:47:17 +0100 Subject: [PATCH 2/3] fix line len --- .../main/java/org/elasticsearch/ElasticsearchException.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/ElasticsearchException.java b/core/src/main/java/org/elasticsearch/ElasticsearchException.java index 0caad0d884404..a4befb67d4a18 100644 --- a/core/src/main/java/org/elasticsearch/ElasticsearchException.java +++ b/core/src/main/java/org/elasticsearch/ElasticsearchException.java @@ -492,8 +492,8 @@ enum ElasticsearchExceptionHandle { org.elasticsearch.index.shard.TranslogRecoveryPerformer.BatchOperationException::new, 26, UNKNOWN_VERSION_ADDED), SNAPSHOT_CREATION_EXCEPTION(org.elasticsearch.snapshots.SnapshotCreationException.class, org.elasticsearch.snapshots.SnapshotCreationException::new, 27, UNKNOWN_VERSION_ADDED), - DELETE_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.DeleteFailedEngineException.class, - org.elasticsearch.index.engine.DeleteFailedEngineException::new, 28, UNKNOWN_VERSION_ADDED),// deprecated in 6.0, remove in 7.0 + DELETE_FAILED_ENGINE_EXCEPTION(org.elasticsearch.index.engine.DeleteFailedEngineException.class, // deprecated in 6.0, remove in 7.0 + org.elasticsearch.index.engine.DeleteFailedEngineException::new, 28, UNKNOWN_VERSION_ADDED), DOCUMENT_MISSING_EXCEPTION(org.elasticsearch.index.engine.DocumentMissingException.class, org.elasticsearch.index.engine.DocumentMissingException::new, 29, UNKNOWN_VERSION_ADDED), SNAPSHOT_EXCEPTION(org.elasticsearch.snapshots.SnapshotException.class, From 956a441639cd5844910797e97e3a83cca40dbfe3 Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Mon, 21 Nov 2016 12:49:20 +0100 Subject: [PATCH 3/3] rollback changes to Store.java --- core/src/main/java/org/elasticsearch/index/store/Store.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/org/elasticsearch/index/store/Store.java b/core/src/main/java/org/elasticsearch/index/store/Store.java index 9c29c081ec807..6f345b587979d 100644 --- a/core/src/main/java/org/elasticsearch/index/store/Store.java +++ b/core/src/main/java/org/elasticsearch/index/store/Store.java @@ -388,6 +388,8 @@ public static MetadataSnapshot readMetadataSnapshot(Path indexLocation, ShardId // that's fine - happens all the time no need to log } catch (FileNotFoundException | NoSuchFileException ex) { logger.info("Failed to open / find files while reading metadata snapshot"); + } catch (ShardLockObtainFailedException ex) { + logger.info((Supplier) () -> new ParameterizedMessage("{}: failed to obtain shard lock", shardId), ex); } return MetadataSnapshot.EMPTY; }