text:
[DRAFT] 28.0.0 release notes

Apache Druid 28.0.0 contains over 420 new features, bug fixes, performance enhancements, documentation improvements, and additional test coverage from 57 contributors.
See the complete set of changes for additional details, including bug fixes.
Review the upgrade notes and incompatible changes before you upgrade to Druid 28.0.0.
# Important features, changes, and deprecations
In Druid 28.0.0, we have made substantial improvements to querying to make the system more ANSI SQL compatible. This includes changes in handling NULL and boolean values as well as boolean logic. At the same time, the Apache Calcite library has been upgraded to the latest version. While we have documented known query behavior changes, please read the upgrade notes section carefully. Test your application before rolling out to broad production scenarios while closely monitoring the query status.
# SQL compatibility
Druid continues to make SQL query execution more consistent with how standard SQL behaves. However, there are feature flags available to restore the old behavior if needed.
# Three-valued logic
Druid native filters now observe SQL three-valued logic (true, false, or unknown) instead of Druid's classic two-state logic by default, when the following default settings apply:

druid.generic.useThreeValueLogicForNativeFilters = true
druid.expressions.useStrictBooleans = true
druid.generic.useDefaultValueForNull = false

#15058
# Strict booleans
druid.expressions.useStrictBooleans is now enabled by default.
Druid now handles booleans strictly using 1 (true) or 0 (false).
Previously, true and false could be represented either as true and false as well as 1 and 0, respectively.
In addition, Druid now returns a null value for Boolean comparisons like True && NULL.
If you don't explicitly configure this property in runtime.properties, clusters now use LONG types for any ingested boolean values and in the output of boolean functions for transformations and query time operations.
For more information, see SQL compatibility in the upgrade notes.
#14734
# NULL handling
druid.generic.useDefaultValueForNull is now disabled by default.
Druid now differentiates between empty records and null records.
Previously, Druid might treat empty records as empty or null.
For more information, see SQL compatibility in the upgrade notes.
#14792
# SQL planner improvements
Druid uses Apache Calcite for SQL planning and optimization. Starting in Druid 28.0.0, the Calcite version has been upgraded from 1.21 to 1.35. This upgrade brings in many bug fixes in SQL planning from Calcite.
# Dynamic parameters
As part of the Calcite upgrade, the behavior of type inference for dynamic parameters has changed. To avoid any type interference issues, explicitly CAST all dynamic parameters as a specific data type in SQL queries. For example, use:
SELECT (1 * CAST (? as DOUBLE))/2 as tmp

Do not use:
SELECT (1 * ?)/2 as tmp

# Async query and query from deep storage
Query from deep storage is no longer an experimental feature. When you query from deep storage, more data is available for queries without having to scale your Historical services to accommodate more data. To benefit from the space saving that query from deep storage offers, configure your load rules to unload data from your Historical services.
# Support for multiple result formats
Query from deep storage now supports multiple result formats.
Previously, the /druid/v2/sql/statements/ endpoint only supported results in the object format. Now, results can be written in any format specified in the resultFormat parameter.
For more information on result parameters supported by the Druid SQL API, see Responses.
#14571
# Broadened access for queries from deep storage
Users with the STATE permission can interact with status APIs for queries from deep storage. Previously, only the user who submitted the query could use those APIs. This enables the web console to monitor the running status of the queries. Users with the STATE permission can access the query results.
#14944
# MSQ queries for realtime tasks
The MSQ task engine can now include real time segments in query results. To do this, use the includeSegmentSource context parameter and set it to REALTIME.
#15024
# MSQ support for UNION ALL queries
You can now use the MSQ task engine to run UNION ALL queries with UnionDataSource.
#14981
# Ingest from multiple Kafka topics to a single datasource
You can now ingest streaming data from multiple Kafka topics to a datasource using a single supervisor.
You configure the topics for the supervisor spec using a regex pattern as the value for topicPattern in the IO config. If you add new topics to Kafka that match the regex, Druid automatically starts ingesting from those new topics.
If you enable multi-topic ingestion for a datasource, downgrading will cause the Supervisor to fail.
For more information, see Stop supervisors that ingest from multiple Kafka topics before downgrading.
#14424
#14865
# SQL UNNEST and ingestion flattening
The UNNEST function is no longer experimental.
Druid now supports UNNEST in SQL-based batch ingestion and query from deep storage, so you can flatten arrays easily. For more information, see UNNEST and Unnest arrays within a column.
You no longer need to include the context parameter enableUnnest: true to use UNNEST.
#14886
# Recommended syntax for SQL UNNEST
The recommended syntax for SQL UNNEST has changed. We recommend using CROSS JOIN instead of commas for most queries to prevent issues with precedence. For example, use:
SELECT column_alias_name1 FROM datasource CROSS JOIN UNNEST(source_expression1) AS table_alias_name1(column_alias_name1) CROSS JOIN UNNEST(source_expression2) AS table_alias_name2(column_alias_name2), ...

Do not use:
SELECT column_alias_name FROM datasource, UNNEST(source_expression1) AS table_alias_name1(column_alias_name1), UNNEST(source_expression2) AS table_alias_name2(column_alias_name2), ...

# Window functions (experimental)
You can use window functions in Apache Druid to produce values based upon the relationship of one row within a window of rows to the other rows within the same window. A window is a group of related rows within a result set. For example, rows with the same value for a specific dimension.
Enable window functions in your query with the enableWindowing: true context parameter.
#15184
# Concurrent append and replace (experimental)
Druid 28.0.0 adds experimental support for concurrent append and replace.
This feature allows you to safely replace the existing data in an interval of a datasource while new data is being appended to that interval. One of the most common applications of this is appending new data to an interval while compaction of that interval is already in progress.
For more information, see Concurrent append and replace.
Segment locking will be deprecated and removed in favor of concurrent append and replace that is much simpler in design. With concurrent append and replace, Druid doesn't lock compaction jobs out because of active realtime ingestion.
# Task locks for append and replace batch ingestion jobs
Append batch ingestion jobs can now share locks. This allows you to run multiple append batch ingestion jobs against the same time internal. Replace batch ingestion jobs still require an exclusive lock. This means you can run multiple append batch ingestion jobs and one replace batch ingestion job for a given interval.
#14407
# Streaming ingestion with concurrent replace
Streaming jobs reading from Kafka and Kinesis with APPEND locks can now ingest concurrently with compaction running with REPLACE locks. The segment granularity of the streaming job must be equal to or finer than that of the concurrent replace job.
#15039
# Functional area and related changes
This section contains detailed release notes separated by areas.
# Web console
# Added UI support for segment loading query context parameter
The web console supports the waitUntilSegmentsLoad query context parameter.

#15110
# Added concurrent append and replace switches
The web console includes concurrent append and replace switches.
The following screenshot shows the concurrent append and replace switches in the classic batch ingestion wizard:

The following screenshot shows the concurrent append and replace switches in the compaction configuration UI:

#15114
# Added UI support for ingesting from multiple Kafka topics to a single datasource
The web console supports ingesting streaming data from multiple Kafka topics to a datasource using a single supervisor.

#14833
# Other web console improvements

You can now copy query results from the web console directly to the clipboard #14889
The web console now shows the execution dialog for query_controller tasks in the task view instead of the generic raw task details dialog. You can still access the raw task details from the ellipsis (...) menu #14930)
You can now select a horizontal range in the web console time chart to modify the current WHERE clause #14929
You can now set dynamic query parameters in the web console #14921
You can now edit the Coordinator dynamic configuration in the web console #14791
You can now prettify SQL queries and use flatten with a Kafka input format #14906
A warning now appears when a CSV or TSV sample contains newlines that Druid does not accept #14783
You can now select a format when downloading data #14794
Improved the clarity of cluster default rules in the retention dialog #14793
The web console now detects inline queries in the query text and lets you run them individually #14810
You can now reset specific partition offsets for a supervisor #14863

# Ingestion
# JSON and auto column indexer
The json column type is now equivalent to using auto in JSON-based batch ingestion dimension specs. Upgrade your ingestion specs to json to take advantage of the features and functionality of auto, including the following:

Type specializations including ARRAY typed columns
Better support for nested arrays of strings, longs, and doubles
Smarter index utilization

json type columns created with Druid 28.0.0 are not backwards compatible with Druid versions older than 26.0.0.
If you upgrade from one of these versions, you can continue to write nested columns in a backwards compatible format (version 4).
For more information, see Nested column format in the upgrade notes.
#14955
#14456
# Ingestion status
Ingestion reports now include a segmentLoadStatus object that provides information related to the ingestion, such as duration and total segments.
#14322
# SQL-based ingestion
# Ability to ingest ARRAY types
SQL-based ingestion now supports storing ARRAY typed values in ARRAY typed columns as well as storing both VARCHAR and numeric typed arrays.
Previously, the MSQ task engine stored ARRAY typed values as multi-value dimensions instead of ARRAY typed columns.
The MSQ task engine now includes the arrayIngestMode query context parameter, which controls how
ARRAY types are stored in Druid segments.
Set the arrayIngestMode query context parameter to array to ingest ARRAY types.
In Druid 28.0.0, the default mode for arrayIngestMode is mvd for backwards compatibility, which only supports VARCHAR typed arrays and stores them as multi-value dimensions. This default is subject to change in future releases.
For information on how to migrate to the new behavior, see the Ingestion options for ARRAY typed columns in the upgrade notes.
For information on inserting, filtering, and grouping behavior for ARRAY typed columns, see Array columns.
#15093
# Numeric array type support
Row-based frames and, by extension, the MSQ task engine now support numeric array types. This means that all queries consuming or producing arrays work with the MSQ task engine. Numeric arrays can also be ingested using SQL-based ingestion with MSQ. For example, queries like SELECT [1, 2] are valid now since they consume a numeric array instead of failing with an unsupported column type exception.
#14900
# Azure Blob Storage support
Added support for Microsoft Azure Blob Storage.
You can now use fault tolerance and durable storage with Microsoft Azure Blob Storage.
For more information, see Durable storage.
#14660
# Other SQL-based ingestion improvements

Added a new rowsPerPage context parameter for the MSQ task engine.
Use rowsPerPage to limit the number of rows per page. For more information on context parameters for the MSQ task engine, see Context parameters #14994
Druid now ignores ServiceClosedException on postCounters while the controller is offline #14707
Improved error messages related to OVERWRITE keyword #14870

# Streaming ingestion
# Ability to reset offsets for a supervisor
Added a new API endpoint /druid/indexer/v1/supervisor/:supervisorId/resetOffsets to reset specific partition offsets for a supervisor without resetting the entire set.
This endpoint clears only the specified offsets in Kafka or sequence numbers in Kinesis, prompting the supervisor to resume data reading.
#14772
# Other streaming ingestion improvements

Added PropertyNamingStrategies from Jackson to fix Hadoop ingestion and make it compatible with newer Jackson #14671
Added pod name to the TaskLocation object for Kubernetes task scheduling to make debugging easier #14758
Added lifecycle hooks to KubernetesTaskRunner #14790
Added new method for SqlStatementResource and SqlTaskResource to set request attribute #14878
Added a sampling factor for DeterminePartitionsJob #13840
Added usedClusterCapacity to the GET /totalWorkerCapacity response. Use this API to get the total ingestion capacity on the overlord #14888
Improved Kubernetes task runner performance #14649
Improved handling of long data source names. Previously, the Kubernetes task runner would throw an error if the name of a data source was too long #14620
Improved the streaming ingestion completion timeout error message #14636
Druid now retries fetching S3 task logs on transient S3 errors #14714
Druid now reports task/pending/time metrics for Kubernetes-based ingestion #14698
Druid now reports k8s/peon/startup/time metrics for Kubernetes-based ingestion #14771
handoffConditionTimeout now defaults to 15 minutes—the default change won't affect existing supervisors #14539
Fixed an NPE with checkpoint parsing for streaming ingestion #14353
Fixed an issue with Hadoop ingestion writing arrays as objects.toString as a result of transform expressions #15127
The PodTemplateTaskAdapter now accounts for queryable tasks #14789
The rolling supervisor now restarts at taskDuration #14396
S3 deleteObjects requests are now retried if the failure state allows retry #14776
You can now ingest the name of a Kafka topic to a datasource #14857

# Querying
# Improved LOOKUP function
The LOOKUP function now accepts an optional constant string as a third argument. This string is used to replace missing values in results. For example, the query LOOKUP(store, 'store_to_country', 'NA'), returns NA if the store_to_country value is missing for a given store.
#14956
# AVG function
The AVG aggregation function now returns a double instead of a long.
#15089
# Improvements to EARLIEST and LATEST operators
Improved EARLIEST and LATEST operators as follows:

EARLIEST and LATEST operators now rewrite to EARLIEST_BY and LATEST_BY during query processing to make the __time column reference explicit to Calcite. #15095
You can now use EARLIEST/EARLIEST_BY and LATEST/LATEST_BY for STRING columns without specifying the maxBytesPerValue parameter.
If you omit the maxBytesPerValue parameter, the aggregations default to 1024 bytes for the buffer. #14848

# Functions for evaluating distinctness
New SQL and native query functions allow you to evaluate whether two expressions are distinct or not distinct.
Expressions are distinct if they have different values or if one of them is NULL.
Expressions are not distinct if their values are the same or if both of them are NULL.
Because the functions treat NULLs as known values  when used as a comparison operator, they always return true or false even if one or both expressions are NULL.
The following table shows the difference in behavior between the equals sign (=) and IS [NOT] DISTINCT FROM:

A
B
A=B
A IS NOT DISTINCT FROM B

0
0
true
true

0
1
false
false

0
null
unknown
false

null
null
unknown
true

#14976
# Functions for evaluating equalities
New SQL and native query functions allow you to evaluate whether a condition is true or false. These functions are different from x == true and x != true in that they never return null even when the variable is null.

SQL function
Native function

IS_TRUE
istrue()

IS_FALSE
isfalse()

IS_NOT_TRUE
nottrue()

IS_NOT_FALSE
notfalse()

#14977
# Function to decode Base64-encoded strings
The new SQL and native query function, decode_base64_utf8 decodes a Base64-encoded string and returns the UTF-8-encoded string. For example, decode_base64_utf8('aGVsbG8=').
#14943
# Improved subquery guardrail
You can now set the maxSubqueryBytes guardrail to one of the following:

disabled: Default setting. Druid doesn't apply the guardrail around the number of bytes a subquery can generate.

auto: Druid calculates the amount of memory to use for the materialization of results as a portion of the fixed memory of the heap.
In the query context, Druid uses the following formula to determine the upper limit on the number of bytes a subquery can generate:
((total JVM space - memory occupied by lookups) * 0.5) / maximum queries that the system can handle concurrently

INTEGER: The number of bytes to use for materializing subquery results. Set a specific value if you understand the query patterns and want to optimize memory usage.
For example, set the maxSubqueryBytes parameter to 300000000 (300 * 1000 * 1000) for a 300 MB limit.
Set the maxSubqueryBytes parameter to 314572800 (300 * 1024 * 1024) for a 300 MiB limit.

#14808
# Other query improvements

Added filters to the set of filters that work with UNNEST filter rewrite and pushdown #14777
Enabled whole-query caching on the Broker for groupBy v2 queries #11595
Improved performance of EARLIEST aggregator with vectorization #14408

# Cluster management
# Unused segments
Druid now stops loading and moving segments as soon as they are marked as unused. This prevents Historical processes from spending time on superfluous loads of segments that will be unloaded later. You can mark segments as unused by a drop rule, overshadowing, or by calling the Data management API.
#14644
# Encrypt data in transit
The net.spy.memcached client has been replaced with the AWS ElastiCache client. This change allows Druid to encrypt data in transit using TLS.
Configure it with the following properties:

Property
Description
Default

druid.cache.enableTls
Enable TLS based connection for Memcached client. Boolean
false

druid.cache.clientMode
Client Mode. Static mode requires the user to specify individual cluster nodes. Dynamic mode uses AutoDiscovery feature of AWS Memcached. String. "static" or "dynamic"
static

druid.cache.skipTlsHostnameVerification
Skip TLS Hostname Verification. Boolean.
true

#14827
# New metadata in the Druid segments table
The Druid segments table now has a column called used_flag_last_updated (VARCHAR (255)). This column is a UTC date string corresponding to the last time that the used column was modified.
Note that this is an incompatible change to the table. For upgrade information, see Upgrade Druid segments table.
#12599
# Other cluster management improvements

You can now use multiple console appenders in Peon logging #14521
Thread names of the processing pool for Indexer, Peon, and Historical processes now include the query ID #15059
The value for replicationThrottleLimit used for smart segment loading has been increased from 2% to 5% of total number of used segments. The total number of replicas in the load queue at the start of a run plus the replicas assigned in a run is kept less than or equal to the throttle limit #14913
The value default  value for balancerComputeThreads is now calculated based on the number of CPUs divided by 2. Previously, the value was 1. Smart segment loading uses this computed value #14902
Improved InvalidNullByteFault errors. They now include the output column name instead of the query column name for ease of use #14780
Improved the exception message when DruidLeaderClient doesn't find leader node #14775
Reduced Coordinator logging under normal operation #14926
Heap usage is now more predictable at very minor performance cost when using nested values #14919
Middle Manager-less ingestion:

The sys.tasks metadata table and web console now show the Kubernetes pod name rather than the peon location when using Middle Manager-less ingestion #14959
Added support for Middle Manager-less ingestion to migrate with zero downtime to and from WorkerTaskRunners that use Middle Managers #14918

Druid extensions cannot bind custom Coordinator duties to the duty groups IndexingServiceDuties and MetadataStoreManagementDuties anymore. These are meant to be core coordinator built-in flows and should not be affected by custom duties. Users can still define a CustomCoordinatorDuty with a custom duty group and period #14891
Druid now adjusts balancerComputeThreads and maxSegmentsToMove automatically based on usage skew between the Historical processes in a tier #14584
Removed the configurable property druid.coordinator.compaction.skipLockedIntervals because it should always be true #14807
Updated mm-less task runner lifecycle logic to better match the logic in the HTTP and ZooKeeper worker task runners #14895

# Data management
# Alert message for segment assignments
Improved alert message for segment assignments when an invalid tier is specified in a load rule or when no rule applies on a segment.
#14696
# Coordinator API for unused segments
Added includeUnused as an optional parameter to the Coordinator API.
You can send a GET request to /druid/coordinator/v1/metadata/datasources/{dataSourceName}/segments/{segmentId}?includeUnused=true to retrieve the metadata for a specific segment as stored in the metadata store.
The API also returns unused segments if the includeUnused parameter is set.
#14846
# Kill task improvements

Added killTaskSlotRatio and maxKillTaskSlots dynamic configuration properties to allow control of task resource usage spawned by the KillUnusedSegments coordinator task #14769
The value for druid.coordinator.kill.period can now be greater than or equal to druid.coordinator.period.indexingPeriod. Previously, it had to be greater than druid.coordinator.period.indexingPeriod. Additionally, the leader Coordinator now keeps track of the last submitted kill task for a datasource to avoid submitting duplicate kill tasks #14831
Added a new config druid.coordinator.kill.bufferPeriod for a buffer period. This config defines the amount of time that a segment is unused before KillUnusedSegment can kill it. Using the default PT24H, if you mark a segment as unused at 2022-06-01T00:05:00.000Z, then the segment cannot be killed until at or after 2022-06-02T00:05:00.000Z #12599
You can now specify the following parameters for a kill task:

batchSize: The maximum number of segments to delete in one kill batch #14642
limit: The maximum number of segments for a kill task to delete #14662

You can now speed up kill tasks by batch deleting multiple segments stored in S3 #14131
Kill tasks that delete unused segments now publish a task report containing kill stats such as numSegmentsKilled, numBatchesProcessed, and numSegmentsMarkedAsUnused #15023
IndexerSQLMetadataStorageCoordinator now uses the JDBI PreparedBatch instead of issuing single update statements inside a transaction to mitigate scaling challenges #14639

# Metrics and monitoring
# New ingestion metrics

Metric
Description
Dimensions
Normal value

ingest/input/bytes
Number of bytes read from input sources, after decompression but prior to parsing. This covers all data read, including data that does not end up being fully processed and ingested. For example, this includes data that ends up being rejected for being unparseable or filtered out.
dataSource, taskId, taskType, groupId, tags
Depends on the amount of data read.

#14582
# New query metrics

Metric
Description
Dimensions
Normal value

mergeBuffer/pendingRequests
Number of requests waiting to acquire a batch of buffers from the merge buffer pool.
This metric is exposed through the QueryCountStatsMonitor module for the Broker.

#15025
# New ZooKeeper metrics

Metric
Description
Dimensions
Normal value

zk/connected
Indicator of connection status. 1 for connected, 0 for disconnected. Emitted once per monitor period.
None
1

zk/reconnect/time
Amount of time, in milliseconds, that a server was disconnected from ZooKeeper before reconnecting. Emitted on reconnection. Not emitted if connection to ZooKeeper is permanently lost, because in this case, there is no reconnection.
None
Not present

#14333
# New subquery metrics for the Broker
The new  SubqueryCountStatsMonitor emits metrics corresponding to the subqueries and their execution.

Metric
Description
Dimensions
Normal value

subquery/rowLimit/count
Number of subqueries whose results are materialized as rows (Java objects on heap).
This metric is only available if the SubqueryCountStatsMonitor module is included.

subquery/byteLimit/count
Number of subqueries whose results are materialized as frames (Druid's internal byte representation of rows).
This metric is only available if the SubqueryCountStatsMonitor module is included.

subquery/fallback/count
Number of subqueries which cannot be materialized as frames
This metric is only available if the SubqueryCountStatsMonitor module is included.

subquery/fallback/insufficientType/count
Number of subqueries which cannot be materialized as frames due to insufficient type information in the row signature.
This metric is only available if the SubqueryCountStatsMonitor module is included.

subquery/fallback/unknownReason/count
Number of subqueries which cannot be materialized as frames due other reasons.
This metric is only available if the SubqueryCountStatsMonitor module is included.

query/rowLimit/exceeded/count
Number of queries whose inlined subquery results exceeded the given row limit
This metric is only available if the SubqueryCountStatsMonitor module is included.

query/byteLimit/exceeded/count
Number of queries whose inlined subquery results exceeded the given byte limit
This metric is only available if the SubqueryCountStatsMonitor module is included.

#14808
# New Coordinator metrics

Metric
Description
Dimensions
Normal value

killTask/availableSlot/count
Number of available task slots that can be used for auto kill tasks in the auto kill run. This is the max number of task slots minus any currently running auto kill tasks.

Varies

killTask/maxSlot/count
Maximum number of task slots available for auto kill tasks in the auto kill run.

Varies

kill/task/count
Number of tasks issued in the auto kill run.

Varies

kill/pendingSegments/count
Number of stale pending segments deleted from the metadata store.
dataSource
Varies

#14782
#14951
# New compaction metrics

Metric
Description
Dimensions
Normal value

compact/segmentAnalyzer/fetchAndProcessMillis
Time taken to fetch and process segments to infer the schema for the compaction task to run.
dataSource, taskId, taskType, groupId,tags
Varies. A high value indicates compaction tasks will speed up from explicitly setting the data schema.

#14752
# Segment scan metrics
Added a new metric to figure out the usage of druid.processing.numThreads on the Historicals/Indexers/Peons.

Metric
Description
Dimensions
Normal value

segment/scan/active
Number of segments currently scanned. This metric also indicates how many threads from druid.processing.numThreads are currently being used.

Close to druid.processing.numThreads

# New Kafka consumer metrics
Added the following Kafka consumer metrics:

kafka/consumer/bytesConsumed: Equivalent to the Kafka consumer metric bytes-consumed-total. Only emitted for Kafka tasks.
kafka/consumer/recordsConsumed: Equivalent to the Kafka consumer metric records-consumed-total. Only emitted for Kafka tasks.

#14582
# service/heartbeat metrics

Exposed service/heartbeat metric to statsd-reporter #14564
Modified the service/heartbeat metric to expose the leader dimension #14593

# Tombstone and segment counts
Added ingest/tombstones/count and ingest/segments/count metrics in MSQ to report the number of tombstones and segments after Druid finishes publishing segments.
#14980
# Extensions
# Ingestion task payloads for Kubernetes
You can now provide compressed task payloads larger than 128 KB when you run MiddleManager-less ingestion jobs.
#14887
# Prometheus emitter
The Prometheus emitter now supports a new optional configuration parameter, druid.emitter.prometheus.extraLabels.
This addition offers the flexibility to add arbitrary extra labels to Prometheus metrics, providing more granular control in managing and identifying data across multiple Druid clusters or other dimensions.
For more information, see Prometheus emitter extension.
#14728
# Documentation improvements
We've moved Jupyter notebooks that guide you through query, ingestion, and data management with Apache Druid to the new Learn Druid repository.
The repository also contains a Docker Compose file to get you up and running with a learning lab.
#15136

# Upgrade notes and incompatible changes
# Upgrade notes
# Upgrade Druid segments table
Druid 28.0.0 adds a new column to the Druid metadata table that requires an update to the table.
If druid.metadata.storage.connector.createTables is set to true and the metadata store user has DDL privileges, the segments table gets automatically updated at startup to include the new used_flag_last_updated column. No additional work is needed for the upgrade.
If either of those requirements are not met, pre-upgrade steps are required. You must make these updates before you upgrade to Druid 28.0.0, or the Coordinator and Overlord processes fail.
Although you can manually alter your table to add the new used_flag_last_updated column, Druid also provides a CLI tool to do it.
#12599
In the example commands below:

lib is the Druid lib directory
extensions is the Druid extensions directory
base corresponds to the value of druid.metadata.storage.tables.base in the configuration, druid by default.
The --connectURI parameter corresponds to the value of druid.metadata.storage.connector.connectURI.
The --user parameter corresponds to the value of druid.metadata.storage.connector.user.
The --password parameter corresponds to the value of druid.metadata.storage.connector.password.
The --action parameter corresponds to the update action you are executing. In this case, it is add-last-used-to-segments

# Upgrade step for MySQL
cd ${DRUID_ROOT}
java -classpath "lib/*" -Dlog4j.configurationFile=conf/druid/cluster/_common/log4j2.xml -Ddruid.extensions.directory="extensions" -Ddruid.extensions.loadList=[\"mysql-metadata-storage\"] -Ddruid.metadata.storage.type=mysql org.apache.druid.cli.Main tools metadata-update --connectURI="<mysql-uri>" --user USER --password PASSWORD --base druid --action add-used-flag-last-updated-to-segments

# Upgrade step for PostgreSQL
cd ${DRUID_ROOT}
java -classpath "lib/*" -Dlog4j.configurationFile=conf/druid/cluster/_common/log4j2.xml -Ddruid.extensions.directory="extensions" -Ddruid.extensions.loadList=[\"postgresql-metadata-storage\"] -Ddruid.metadata.storage.type=postgresql org.apache.druid.cli.Main tools metadata-update --connectURI="<postgresql-uri>" --user  USER --password PASSWORD --base druid --action add-used-flag-last-updated-to-segments

# Manual upgrade step
ALTER TABLE druid_segments
ADD used_flag_last_updated varchar(255);

# Recommended syntax for SQL UNNEST
The recommended syntax for SQL UNNEST has changed. We recommend using CROSS JOIN instead of commas for most queries to prevent issues with precedence. For example, use:
SELECT column_alias_name1 FROM datasource CROSS JOIN UNNEST(source_expression1) AS table_alias_name1(column_alias_name1) CROSS JOIN UNNEST(source_expression2) AS table_alias_name2(column_alias_name2), ...

Do not use:
SELECT column_alias_name FROM datasource, UNNEST(source_expression1) AS table_alias_name1(column_alias_name1), UNNEST(source_expression2) AS table_alias_name2(column_alias_name2), ...

# Dynamic parameters
The Apache Calcite version has been upgraded from 1.21 to 1.35. As part of the Calcite upgrade, the behavior of type inference for dynamic parameters has changed. To avoid any type interference issues, explicitly CAST all dynamic parameters as a specific data type in SQL queries. For example, use:
SELECT (1 * CAST (? as DOUBLE))/2 as tmp

Do not use:
SELECT (1 * ?)/2 as tmp

# Nested column format
json type columns created with Druid 28.0.0 are not backwards compatible with Druid versions older than 26.0.0.
If you are upgrading from a version prior to Druid 26.0.0 and you use json columns, upgrade to Druid 26.0.0 before you upgrade to Druid 28.0.0.
Additionally, to downgrade to a version older than Druid 26.0.0, any new segments created in Druid 28.0.0 should be re-ingested using Druid 26.0.0 or 27.0.0 prior to further downgrading.
When upgrading from a previous version, you can continue to write nested columns in a backwards compatible format (version 4).
In a classic batch ingestion job, include formatVersion in the dimensions list of the dimensionsSpec property. For example:
      "dimensionsSpec": {
        "dimensions": [
          "product",
          "department",
          {
            "type": "json",
            "name": "shipTo",
            "formatVersion": 4
          }
        ]
      },

To set the default nested column version, set the desired format version in the common runtime properties. For example:
druid.indexing.formats.nestedColumnFormatVersion=4

# SQL compatibility
Starting with Druid 28.0.0, the default way Druid treats nulls and booleans has changed.
For nulls, Druid now differentiates between an empty string and a record with no data as well as between an empty numerical record and 0.
You can revert to the previous behavior by setting druid.generic.useDefaultValueForNull to true.
This property affects both storage and querying, and must be set on all Druid service types to be available at both ingestion time and query time. Reverting this setting to the old value restores the previous behavior without reingestion.
For booleans, Druid now strictly uses 1 (true) or 0 (false). Previously, true and false could be represented either as true and false as well as 1 and 0, respectively. In addition, Druid now returns a null value for boolean comparisons like True && NULL.
You can revert to the previous behavior by setting druid.expressions.useStrictBooleans to false.
This property affects both storage and querying, and must be set on all Druid service types to be available at both ingestion time and query time. Reverting this setting to the old value restores the previous behavior without reingestion.
The following table illustrates some example scenarios and the impact of the changes.
Show the table

Query
Druid 27.0.0 and earlier
Druid 28.0.0 and later

Query empty string
Empty string ('') or null
Empty string ('')

Query null string
Null or empty
Null

COUNT(*)
All rows, including nulls
All rows, including nulls

COUNT(column)
All rows excluding empty strings
All rows including empty strings but excluding nulls

Expression 100 && 11
11
1

Expression 100 || 11
100
1

Null FLOAT/DOUBLE column
0.0
Null

Null LONG column
0
Null

Null __time column
0, meaning 1970-01-01 00:00:00 UTC
1970-01-01 00:00:00 UTC

Null MVD column
''
Null

ARRAY
Null
Null

COMPLEX
none
Null

Before upgrading to Druid 28.0.0, update your queries to account for the changed behavior as described in the following sections.
# NULL filters
If your queries use NULL in the filter condition to match both nulls and empty strings, you should add an explicit filter clause for empty strings. For example, update s IS NULL to s IS NULL OR s = ''.
# COUNT functions
COUNT(column) now counts empty strings. If you want to continue excluding empty strings from the count, replace COUNT(column) with COUNT(column) FILTER(WHERE column <> '').
# GroupBy queries
GroupBy queries on columns containing null values can now have additional entries as nulls can co-exist with empty strings.
# Stop Supervisors that ingest from multiple Kafka topics before downgrading
If you have added supervisors that ingest from multiple Kafka topics in Druid 28.0.0 or later, stop those supervisors before downgrading to a version prior to Druid 28.0.0 because the supervisors will fail in versions prior to Druid 28.0.0.
# lenientAggregatorMerge deprecated
lenientAggregatorMerge property in segment metadata queries has been deprecated. It will be removed in future releases.
Use aggregatorMergeStrategy instead. aggregatorMergeStrategy also supports the latest and earliest strategies in addition to strict and lenient strategies from lenientAggregatorMerge.
#14560
#14598
# Broker parallel merge config options
The paths for druid.processing.merge.pool.* and druid.processing.merge.task.* have been flattened to use druid.processing.merge.* instead. The legacy paths for the configs are now deprecated and will be removed in a future release. Migrate your settings to use the new paths because the old paths will be ignored in the future.
#14695
# Ingestion options for ARRAY typed columns
Starting with Druid 28.0.0, the MSQ task engine can detect and ingest arrays as ARRAY typed columns when you set the query context parameter arrayIngestMode to array.
The arrayIngestMode context parameter controls how ARRAY type values are stored in Druid segments.
When you set arrayIngestMode to array (recommended for SQL compliance), the MSQ task engine stores all ARRAY typed values in ARRAY typed columns and supports storing both VARCHAR and numeric typed arrays.
For backwards compatibility, arrayIngestMode defaults to mvd. When "arrayIngestMode":"mvd", Druid only supports VARCHAR typed arrays and stores them as multi-value string columns.
When you set arrayIngestMode to none, Druid throws an exception when trying to store any type of arrays.
For more information on how to ingest ARRAY typed columns with SQL-based ingestion, see SQL data types and Array columns.
# Incompatible changes
# Removed Hadoop 2
Support for Hadoop 2 has been removed.
Migrate to SQL-based ingestion or JSON-based batch ingestion if you are using Hadoop 2.x for ingestion today.
If migrating to Druid's built-in ingestion is not possible, you must upgrade your Hadoop infrastructure to 3.x+ before upgrading to Druid 28.0.0.
#14763
# Removed GroupBy v1
The GroupBy v1 engine has been removed. Use the GroupBy v2 engine instead, which has been the default GroupBy engine for several releases.
There should be no impact on your queries.
Additionally, AggregatorFactory.getRequiredColumns has been deprecated and will be removed in a future release. If you have an extension that implements AggregatorFactory, then this method should be removed from your implementation.
#14866
# Removed Coordinator dynamic configs
The decommissioningMaxPercentOfMaxSegmentsToMove config has been removed.
The use case for this config is handled by smart segment loading now, which is enabled by default.
#14923
# Removed cachingCost strategy
The cachingCost strategy for segment loading has been removed.
Use cost instead, which has the same benefits as cachingCost.
If you have cachingCost set, the system ignores this setting and automatically uses cost.
#14798
# Removed InsertCannotOrderByDescending
The deprecated MSQ fault InsertCannotOrderByDescending has been removed.
#14588
# Removed the backward compatibility code for the Handoff API
The backward compatibility code for the Handoff API in CoordinatorBasedSegmentHandoffNotifier has been removed.
If you are upgrading from a Druid version older than 0.14.0, upgrade to a newer version of Druid before upgrading to Druid 28.0.0.
#14652
# Developer notes
# Dependency updates
The following dependencies have had their versions bumped:

Guava to 31.1-jre. If you use an extension that has a transitive Guava dependency from Druid, it may be impacted #14767
Google Client APIs have been upgraded from 1.26.0 to 2.0.0 #14414
Apache Kafka has been upgraded to 3.5.1 #14721
Calcite has been upgraded to 1.35 #14510
RoaringBitmap has been upgraded from 0.9.0 to 0.9.49 #15006
snappy-java has been upgraded to 1.1.10.3 #14641
decode-uri-component has been upgraded to 0.2.2 #13481
word-wrap has been upgraded to 1.2.4 #14613
tough-cookie has been upgraded to 4.1.3 #14557
qs has been upgraded to 6.5.3 #13510
api-util has been upgraded to 2.1.3 #14852
commons-cli has been upgraded from 1.3.1 to 1.5.0 #14837
tukaani:xz has been upgraded from 1.8 to 1.9 #14839
commons-compress has been upgraded from 1.21 to 1.23.0 #14820
protobuf.version has been upgraded from 3.21.7 to 3.24.0 #14823
dropwizard.metrics.version has been upgraded from 4.0.0 to 4.2.19 #14824
assertj-core has been upgraded from 3.19.0 to 3.24.2 #14815
maven-source-plugin has been upgraded from 2.2.1 to 3.3.0 #14812
scala-library has been upgraded from 2.13.9 to 2.13.11 #14826
oshi-core has been upgraded from 6.4.2 to 6.4.4 #14814
maven-surefire-plugin has been upgraded from 3.0.0-M7 to 3.1.2 #14813
apache-rat-plugin has been upgraded from 0.12 to 0.15 #14817
jclouds.version has been upgraded from 1.9.1 to 2.0.3 #14746
dropwizard.metrics:metrics-graphite has been upgraded from 3.1.2 to 4.2.19 #14842
postgresql has been upgraded from 42.4.1 to 42.6.0 #13959
org.mozilla:rhino has been upgraded #14765
apache.curator.version has been upgraded from 5.4.0 to 5.5.0 #14843
jackson-databind has been upgraded to 2.12.7 #14770
icu4j from 55.1 to 73.2 has been upgraded from 55.1 to 73.2 #14853
joda-time has been upgraded from 2.12.4 to 2.12.5 #14855
tough-cookie has been upgraded from 4.0.0 to 4.1.3 #14557
word-wrap has been upgraded from 1.2.3 to 1.2.4 #14613
decode-uri-component has been upgraded from 0.2.0 to 0.2.2 #13481
snappy-java has been upgraded from 1.1.10.1 to 1.1.10.3 #14641
Hibernate validator version has been upgraded #14757
The Dependabot PR limit for Java dependencies has been increased #14804
jetty has been upgraded from 9.4.51.v20230217 to 9.4.53.v20231009 #15129
netty4 has been upgraded from 4.1.94.Final to 4.1.100.Final #15129

# Credits
@2bethere
@317brian
@a2l007
@abhishekagarwal87
@abhishekrb19
@adarshsanjeev
@aho135
@AlexanderSaydakov
@AmatyaAvadhanula
@asdf2014
@benkrug
@capistrant
@clintropolis
@cristian-popa
@cryptoe
@demo-kratia
@dependabot[bot]
@ektravel
@findingrish
@gargvishesh
@georgew5656
@gianm
@giuliotal
@hardikbajaj
@hqx871
@imply-cheddar
@Jaehui-Lee
@jasonk000
@jon-wei
@kaisun2000
@kfaraz
@kgyrtkirk
@LakshSingla
@lorem--ipsum
@maytasm
@pagrawal10
@panhongan
@petermarshallio
@pranavbhole
@rash67
@rohangarg
@SamWheating
@sergioferragut
@slfan1989
@somu-imply
@suneet-s
@techdocsmith
@tejaswini-imply
@TSFenwick
@vogievetsky
@vtlim
@writer-jill
@xvrl
@yianni
@YongGang
@yuanlihan
@zachjsh

@LakshSingla can we close this now that 28 has been released?

authors: LakshSingla xvrl


text:
if group by Numeric dimension and String dimension, only return 100 results

Hey, I'm researching Druid. I have questions about SQL.
Version
0.17.0
Deployment
nano-quickstart
Data and Schema

Data is "quickstart/tutorial/wikiticker-2015-09-12-sampled.json.gz".
Data is loaded into Druid by Tutorial: Loading a file, and Rollup function is turned off. Schema as following:

{
  "type": "index_parallel",
  "ioConfig": {
    "type": "index_parallel",
    "inputSource": {
      "type": "local",
      "filter": "wikiticker-2015-09-12-sampled.json.gz",
      "baseDir": "quickstart/tutorial"
    },
    "inputFormat": {
      "type": "json"
    }
  },
  "tuningConfig": {
    "type": "index_parallel",
    "partitionsSpec": {
      "type": "dynamic"
    }
  },
  "dataSchema": {
    "dataSource": "wikiticker",
    "granularitySpec": {
      "type": "uniform",
      "queryGranularity": "NONE",
      "rollup": false,
      "segmentGranularity": "DAY"
    },
    "timestampSpec": {
      "column": "time",
      "format": "iso"
    },
    "dimensionsSpec": {
      "dimensions": [
        {
          "type": "long",
          "name": "added"
        },
        "channel",
        "cityName",
        "comment",
        "countryIsoCode",
        "countryName",
        {
          "type": "long",
          "name": "deleted"
        },
        {
          "type": "long",
          "name": "delta"
        },
        "isAnonymous",
        "isMinor",
        "isNew",
        "isRobot",
        "isUnpatrolled",
        "namespace",
        "page",
        "regionIsoCode",
        "regionName",
        "user"
      ]
    }
  }
}

Questions
Question 1:
Why the following SQL always return 100 results, no matter add limit clause or not?
( delta is Numeric, and user is String. Both are dimensions.)
SQL:

SELECT delta, user FROM "wikiticker" GROUP BY delta, user

Results:

Natvie SQL:
{
  "queryType": "groupBy",
  "dataSource": {
    "type": "table",
    "name": "wikiticker"
  },
  "intervals": {
    "type": "intervals",
    "intervals": [
      "-146136543-09-08T08:23:32.096Z/146140482-04-24T15:36:27.903Z"
    ]
  },
  "virtualColumns": [],
  "filter": null,
  "granularity": {
    "type": "all"
  },
  "dimensions": [
    {
      "type": "default",
      "dimension": "delta",
      "outputName": "d0",
      "outputType": "LONG"
    },
    {
      "type": "default",
      "dimension": "user",
      "outputName": "d1",
      "outputType": "STRING"
    }
  ],
  "aggregations": [],
  "postAggregations": [],
  "having": null,
  "limitSpec": {
    "type": "NoopLimitSpec"
  },
  "context": {
    "sqlQueryId": "4449f325-3262-4f81-811d-acbb0600d97c"
  },
  "descending": false
}

Question 2
If changes Group by dimensions orders( delta, user ->  user, delta), SQL will return all results.
It looks like SQL will return all results if String dimension is first dimension in Group by and Select clause.
How come different dimension orders will generate different results?

SELECT user, delta FROM "wikiticker" GROUP BY user, delta

I also encountered the same problem, you can try to close the query cache in the console to see if the same problem will occur

I would like to ask, what is your JDK version, zulu8 or openjdk8?

I also reproduced it once, but it is not stable

I would like to ask, what is your JDK version, zulu8 or openjdk8?

Oracle JDK. detail as following:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

source: gharchive/issue

authors: BeanNan hotdust

repo: apache/druid

license_type: permissive

license_source: github-api


text:
use mmap for nested column value to dictionary id lookup for more chill heap usage during serialization

Description
Switches DictionaryIdLookup to serialize the value dictionaries and then use mmap to load into their respective Indexed implementations instead of using the the {x}2IntMap heap collections we were previously using, resulting in dramatically more predictable heap usage at very minor performance cost.
Before (the peaks are merge/publish, 10m rows, 5m max segment size):

After (the dips are merge/publish with the peaks at the end being bitmap index creation):

It does add a bit extra time to the task I used in my experiment:

but it seems worth the cost, and probably in practice potentially faster than the heap based approach when the task has a lot less room to spare and faces more expensive gc cycles. I will be looking for other areas to improve in exchange for this change.
I also refactored a few things to clean some stuff up (mainly consolidating code around reading string dictionaries when the dictionary might be front-coded or classic generic indexed based that was duplicated in a bunch of places).

This PR has:

[x] been self-reviewed.
[x] added Javadocs for most classes and all non-trivial methods. Linked related entities via Javadoc links.
[x] added comments explaining the "why" and the intent of the code wherever would not be obvious for an unfamiliar reader.
[x] been tested in a test Druid cluster.

Looks good to me.

source: gharchive/pull-request

authors: clintropolis pranavbhole


text:
user/references/protocol/rest.md  should be translated to English

http://dubbo.apache.org/en-us/docs/user/references/protocol/rest.html
should be translated to English
Source doc is here ：
https://github.com/apache/dubbo-website/blob/master/docs/en-us/user/references/protocol/rest.md

#368 Hi, questions about translation unified handling here.

OK

authors: caojiele lovepoem

repo: apache/dubbo-website


text:
xds debug docs

xds debug docs

thanks for your contribute


text:
address cache not build  on the consumer

dubbo.version：3.0.3
nacos-client：2.0.4
nacos-discovery/nacos-config：2021.1
spring.boot：2.5.14

dubbo yml配置：
dubbo:
  application:
    logger: slf4j
    metadataType: remote
    register-mode: instance
    service-discovery:
      migration: FORCE_APPLICATION
    qos-enable: false

  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://127.0.0.1:8848
    group: DUBBO_GROUP
    parameters:
      namespace: 7aeae807-4718-479e-a5f0-fa810feeef0f
    protocol: nacos
    username: nacos
    password: nacos
  metadata-report:
    address: nacos://127.0.0.1:8848
    group: DUBBO_GROUP
    username: nacos
    password: nacos
  consumer:
    cache: false
    validation: true
    timeout: 3000
    check: false
  scan:
    # 接口实现类扫描
    base-packages: club.demo.system.provider

报错信息是这样的：
ERROR o.a.d.r.integration.DynamicDirectory -  [DUBBO] Failed to execute router: nacos://127.0.0.1:8848/org.apache.dubbo.registry.RegistryService?application=ocean-oauth&dubbo=2.0.2&group=DUBBO_GROUP&logger=slf4j&metadata-type=remote&pid=6948&qos.enable=false&release=3.0.3&timestamp=1692928432510, cause: Failed to invoke the method empower in the service club.weitianxia.system.dubbo.DyUserRemoteApi. address cache not build  on the consumer 192.168.110.50 using the dubbo version 3.0.3., dubbo version: 3.0.3, current host: 192.168.110.50
org.apache.dubbo.rpc.RpcException: Failed to invoke the method empower in the service club.weitianxia.system.dubbo.DyUserRemoteApi. address cache not build  on the consumer 192.168.110.50 using the dubbo version 3.0.3.
at org.apache.dubbo.rpc.cluster.RouterChain.route(RouterChain.java:176)
at org.apache.dubbo.registry.integration.DynamicDirectory.doList(DynamicDirectory.java:185)
at org.apache.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:117)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:327)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265)
at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:51)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:108)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:92)
at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:94)
at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:276)
at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:92)

帮忙看看啊

搜了下 Dubbo 的代码，没有 address cache not build 相关的内容，看一下堆栈的底部是什么信息吧

完整的信息是这样的：
org.apache.dubbo.rpc.RpcException: Failed to invoke the method empower in the service club.weitianxia.system.dubbo.DyUserRemoteApi. address cache not build  on the consumer 192.168.110.50 using the dubbo version 3.0.3.
at org.apache.dubbo.rpc.cluster.RouterChain.route(RouterChain.java:176)
at org.apache.dubbo.registry.integration.DynamicDirectory.doList(DynamicDirectory.java:185)
at org.apache.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:117)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:327)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265)
at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:51)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:108)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:92)
at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:94)
at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:276)
at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:92)
at org.apache.dubbo.common.bytecode.proxy0.empower(proxy0.java)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy170.empower(Unknown Source)
at club.weitianxia.oauth.service.UserDetailsServiceImpl.dyEmpower(UserDetailsServiceImpl.java:162)
at club.weitianxia.oauth.service.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:98)
at club.weitianxia.oauth.filter.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:50)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)
at club.weitianxia.oauth.filter.CustomAuthenticationFilter.attemptAuthentication(CustomAuthenticationFilter.java:104)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:222)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at club.weitianxia.common.db.filter.TenantContextHolderFilter.doFilter(TenantContextHolderFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
logback- 2023-08-25 15:35:20 [http-nio-auto-1-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
org.apache.dubbo.rpc.RpcException: Failed to invoke the method empower in the service club.weitianxia.system.dubbo.DyUserRemoteApi. No provider available for the service club.weitianxia.system.dubbo.DyUserRemoteApi from registry 127.0.0.1:8848 on the consumer 192.168.110.50 using the dubbo version 3.0.3. Please check if the providers have been started and registered.
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:291)
at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:59)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:268)
at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:51)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:108)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$FilterChainNode.invoke(FilterChainBuilder.java:84)
at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:92)
at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:94)
at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:276)
at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:92)
at org.apache.dubbo.common.bytecode.proxy0.empower(proxy0.java)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy170.empower(Unknown Source)
at club.weitianxia.oauth.service.UserDetailsServiceImpl.dyEmpower(UserDetailsServiceImpl.java:162)
at club.weitianxia.oauth.service.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:98)
at club.weitianxia.oauth.filter.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:50)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
at org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter$AuthenticationManagerDelegator.authenticate(WebSecurityConfigurerAdapter.java:518)
at club.weitianxia.oauth.filter.CustomAuthenticationFilter.attemptAuthentication(CustomAuthenticationFilter.java:104)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:222)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at club.weitianxia.common.db.filter.TenantContextHolderFilter.doFilter(TenantContextHolderFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)

看到了，最开始版本的 StateRouter 实现有问题，升级下最新的 3.1.x 或者 3.2.x 看看吧

dubbo升级到3.1.0了，nacos-client升级到2.2.3了，又报这个错误：
logback- 2023-08-25 15:55:13 [main] ERROR o.a.d.c.d.DefaultApplicationDeployer -  [DUBBO] Dubbo Application[1.1](ocean-system) found failed module: Dubbo Module[1.1.1], dubbo version: 3.1.0, current host: 192.168.110.50
java.lang.NoSuchMethodError: com.alibaba.nacos.api.config.ConfigService.publishConfigCas(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
	at org.apache.dubbo.metadata.store.nacos.NacosConfigServiceWrapper.publishConfigCas(NacosConfigServiceWrapper.java:65)
	at org.apache.dubbo.metadata.store.nacos.NacosMetadataReport.registerServiceAppMapping(NacosMetadataReport.java:228)
	at org.apache.dubbo.registry.client.metadata.MetadataServiceNameMapping.map(MetadataServiceNameMapping.java:94)
	at org.apache.dubbo.config.ServiceConfig.lambda$exported$1(ServiceConfig.java:258)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.apache.dubbo.config.ServiceConfig.exported(ServiceConfig.java:254)
	at org.apache.dubbo.config.spring.ServiceBean.exported(ServiceBean.java:123)
	at org.apache.dubbo.config.ServiceConfig.doExport(ServiceConfig.java:363)
	at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:234)
	at org.apache.dubbo.config.deploy.DefaultModuleDeployer.exportServiceInternal(DefaultModuleDeployer.java:337)
	at org.apache.dubbo.config.deploy.DefaultModuleDeployer.exportServices(DefaultModuleDeployer.java:309)
	at org.apache.dubbo.config.deploy.DefaultModuleDeployer.start(DefaultModuleDeployer.java:145)
	at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onContextRefreshedEvent(DubboDeployApplicationListener.java:111)
	at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onApplicationEvent(DubboDeployApplicationListener.java:100)
	at org.apache.dubbo.config.spring.context.DubboDeployApplicationListener.onApplicationEvent(DubboDeployApplicationListener.java:45)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:453)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:343)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1370)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1359)
	at club.weitianxia.system.SystemApplication.main(SystemApplication.java:23)

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.apache.dubbo.metadata.store.nacos.NacosConfigServiceWrapper.publishConfigCas(NacosConfigServiceWrapper.java:65)

The following method did not exist:

    com.alibaba.nacos.api.config.ConfigService.publishConfigCas(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z

The method's class, com.alibaba.nacos.api.config.ConfigService, is available from the following locations:

    jar:file:/C:/Users/pc/.m2/repository/com/alibaba/nacos/nacos-api/1.4.1/nacos-api-1.4.1.jar!/com/alibaba/nacos/api/config/ConfigService.class

The class hierarchy was loaded from the following locations:

    com.alibaba.nacos.api.config.ConfigService: file:/C:/Users/pc/.m2/repository/com/alibaba/nacos/nacos-api/1.4.1/nacos-api-1.4.1.jar

Action:

Correct the classpath of your application so that it contains a single, compatible version of com.alibaba.nacos.api.config.ConfigService

这个nacos-client好顽固，我排查了所有的地方，nacos-discovery、nacos-config、sentinel-datasource-nacos都做了排除，但是项目默认引入的还是1.4.1，

谢谢了

 看到了，最开始版本的 StateRouter 实现有问题，升级下最新的 3.1.x 或者 3.2.x 看看吧

谢谢了，已经解决了，原来是根POM中忘记锁定nacos-client的版本号了，nacos-client升到2.0.3，就一切正常了

authors: AlbumenJ syllvin

repo: apache/dubbo


text:
[Question] 如何将这个散点图的原点固定为最小的x,y坐标，我的配置看起来没有生效

Version
5.4.3
Link to Minimal Reproduction
下面是我的demo链接
https://echarts.apache.org/examples/zh/editor.html?c=line-simple&code=PYBwLglsB2AEC8sDeBYAULWAiA5gJwgBMsAuZdTTLAGwFMAzMU2AVgAYAaCyrAnACyZl23AL5cM2MMGDVIIZqklV6wPAFsAhmDC08zLEgDGorGIlUAHgEFLEAM7MA2t0xLKPaJvW0DAUUsQAH1CQhwACgBrI01qAHp1WQBKLAsPbC8fABlgGMgYAyNaaF19NI8sTNoAcU0FMgBmFnLPb1oAFVpLMABlMABPOkVXdKxVEoB1WggBIWwAI1liEcxxFex7EGoIMCyIaF8yd3Sqe35gAHdmelj7WnW15R51feYAWgaWqi1LZgBGEaibgAXTSWH6tgczhGxwqVQMAGFYkYQmEojF4olqCkvhk2jk8lBoAYXqEhrjKm1avVYE0KZttrt9odyE8KmdLtdbvc2bBHidKT5Ot0-oMWbDRuMwFMZoIDItqMtefzRsB6PQ7nNOOtcARCABJaCELrMbW8rAvYlkD4Un7_QEgsF3Ai0RxkFxPCVUeFkLAAET91VSOoGIBZWHseVKwfNNjs9kNxt-ZDNAoh8cTJpTFMI2k00N5mA9Jw8bAAdAA2FjNdYeN4AJjL9YA7ADC7BQbXYMWS5hU73YOW2AAWACcXc77Z7vbe5frw_ruLr5YAHBWVxP1pOBUZZGoDABiP6jwjDzS-CkAL2YNfNtHUIH4mnsUKOXawO3voqGb_bpyfhCXAAQtQACu-hkH8i5dv-miARcADy6qagAGqaS48GccGXAie4QdgeA4PMmjhPWzSwPWUEcLAfzNsO1F_CkXZAsqLQqsC6CiEAA
Steps to Reproduce
下面的是我的使用的demo数据，它的原点是(0, 0)，我希望原点是(-3, -3)，我设置了min为-3，但是看起来没有生效，我查看了相关文档没有发现如何解决这个问题，希望有人能够帮助我解决这个问题
option = {
  "grid": {
    "left": 50,
    "right": 50
  },
  "tooltip": {
    "formatter": "{c}"
  },
  "xAxis": [
    {
      "name": "Exp_ddg(kcal/mol)",
      "nameLocation": "center",
      "nameGap": 35,
      "nameTextStyle": {
        "fontWeight": "bold"
      },
      "splitLine": {
        "show": false
      },
      "min": -3,
      "max": 1
    }
  ],
  "yAxis": [
    {
      "name": "Calc_ddg(kcal/mol)",
      "nameLocation": "middle",
      "nameGap": 35,
      "splitLine": {
        "show": false
      },
      "nameTextStyle": {
        "fontWeight": "bold"
      },
      "offset": 0,
      "gridIndex": 0,
      "min": -3,
      "max": 1
    }
  ],
  "series": [
    {
      "name": "DDG",
      "type": "scatter",
      "xAxisIndex": 0,
      "yAxisIndex": 0,
      "data": [
        [
          0.655,
          -2.271
        ],
        [
          0,
          0.049
        ],
        [
          -0.242,
          -0.868
        ]
      ],
      "color": "#19d4ae",
      "z": 5,
      "emphasis": {
        "itemStyle": {
          "shadowBlur": 12,
          "shadowOffsetX": 0,
          "shadowColor": "rgba(25, 212, 174, 1)"
        }
      },
    },
  ]
}

Current Behavior
现在渲染原点是(0, 0)
Expected Behavior
期望渲染原点是(-3, -3)
Environment
- OS:
- Browser:
- Framework:

Any additional comments?
No response

已解决，添加
 "axisLine": {
       "onZero": false
     }

配置即可

repo: apache/echarts


text:
[FLINK-30028]A little fix with document about periods in log.changelog-mode description.

Another little fix with documents, this time I found that sentence get one more period.
Signed-off-by: houhang

Thanks!

repo: apache/flink-table-store


text:
[FLINK-11767] Introduce new TypeSerializerUpgradeTestBase

What is the purpose of the change
This PR introduces TypeSerializerUpgradeTestBase to fully replace TypeSerializerSnapshotMigrationTestBase.
The old test base needs to be replaced because it does not provide any means to generate test serializer snapshot files for each corresponding serializer. Before, what was written in the serializer snapshot test files and how they were written was not visible at all to developers, and also caused a lot of trouble when attempting to release new Flink versions and we have to generate new test files for the current version.
As part of this change, the PR introduces a utility class ClassRelocator.
This utility allows us to relocate classes to a different name.
We require this in the serializer upgrade tests, because some test scenarios attempt to test schema upgrades, e.g. adding / removing fields from a Pojo class.
The ClassRelocator utility allows us to define two different versions of a Pojo class under the same name (one pre-upgrade that is used for writing the test serializer snapshot file, and the other after upgrade used for upgrade verification).
Brief change log

ed1be69 introduces ClassRelocator
24f8356 introduces new test base TypeSerializerUpgradeTestBase
2bcdaed Adds a new PojoSerializer upgrade test based on the new test base.

Verifying this change

Run the new PojoSerializerUpgradeTest. It should work also in the IDE.
All test snapshot files should be auto-generated, if they do not exist.

Does this pull request potentially affect one of the following parts:

Dependencies (does it add or upgrade a dependency): (yes / no)
The public API, i.e., is any changed class annotated with @Public(Evolving): (yes / no)
The serializers: (yes / no / don't know)
The runtime per-record code paths (performance sensitive): (yes / no / don't know)
Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Yarn/Mesos, ZooKeeper: (yes / no / don't know)
The S3 file system connector: (yes / no / don't know)

Documentation

Does this pull request introduce a new feature? (yes / no)
If yes, how is the feature documented? (not applicable / docs / JavaDocs / not documented)

Hi @tzulitai,
Thanks for working on this, indeed this seems like an important improvement.
I've checked the PR locally and ran PojoSerializerUpgradeTest, I've also used the base class to generate new test files and everything seems to work as expected.
LGTM 👍

This currently doesn't compile correctly because we use the wrong shaded ASM7 dependency. I fixed this and also added a couple more commits to add test support for Flink 1.8 and 1.9, once travis is green I'll merge this.

I pushed my changes to this PR so that you can have a look.
cc @igalshilman

I went over @aljoscha's recent changes, +1 to merge.
Travis also gives green now.
Will proceed to merge this.

Manually merged.
master - 9362fc9fd3940b3c62429532690ed77a1201ebd5
release-1.10 - 3c314fc2a5e1e80417d8fd3f1333805b2c518b57

authors: aljoscha igalshilman tzulitai

repo: apache/flink


text:
[FLINK-27465] Handle conversion of negative long to timestamp in Avro…

…RowDeserializationSchema (#19627)
Backporting fix to release branch. Original PR: https://github.com/apache/flink/pull/19627

@haizhou-zhao thanks, will merge when tests pass.

@flinkbot run azure

@flinkbot run azure

@flinkbot run azure

@flinkbot run azure

authors: haizhou-zhao tweise


text:
[backport-1.1] [FLINK-5940] [checkpoint] Harden ZooKeeperCompletedCheckpointStore.recover method

Backpor of #3446 onto release-1.1 branch.
The ZooKeeperCompletedCheckpointStore only tries to recover the latest completed
checkpoint even though it might have read older checkpoint state handles from
ZooKeeper. In order to deal with corrupted state handles, this commit changes the
behaviour such that the completed checkpoint store adds all read retrievable
state handles from ZooKeeper and upon request of the latest checkpoint it will
return the latest completed checkpoint which could be retrieved from the state
handles. Broken state handles are removed from the completed checkpoint store and
ZooKeeper.

Fix looks good, but I have a similar comment about the test as for #3446

Thanks for the review @StephanEwen. See comment on #3446 for the test. Merging this PR.

authors: StephanEwen tillrohrmann


text:
[FLINK-11049] Unable to execute partial DAG

What is the purpose of the change
This PR allow user to run partial dag which is associated to certain sinks instead of all sinks.
Brief change log
It add new api in ExecutionEnvironment to allow user to specify the target sinks he want to run.
Verifying this change
This change added tests and can be verified as follows:
(example:)

Add test in ExecutionEnvironmentITCase.java

Does this pull request potentially affect one of the following parts:

Dependencies (does it add or upgrade a dependency): (no)
The public API, i.e., is any changed class annotated with @Public(Evolving): (no)
The serializers: (no)
The runtime per-record code paths (performance sensitive): (no)
Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Yarn/Mesos, ZooKeeper: (no)
The S3 file system connector: (no)

Documentation

Does this pull request introduce a new feature? (no)
If yes, how is the feature documented? (not applicable / docs / JavaDocs / not documented) No

hi @zjffdu , thanks for the contribution. It seems this issue did not cover DataStream case.

authors: Xpray zjffdu


text:
[BP-1.9][FLINK-14315] Make heartbeat manager fields non-nullable

Backport of #9837 to release-1.9.

@flinkbot run travis

Thanks for the review @TisonKun. Merging this PR now.

Merged into release-1.9.

authors: TisonKun tillrohrmann


text:
Update contributors list in the people.md

Adding my name on the contributors list.

Thanks @llvieira I merged this and updated the website.

authors: keith-turner llvieira

repo: apache/fluo-website


text:
GEODE-6603: Make StoppableCountDownLatch extend CountDownLatch

Create StoppableCountDownLatchTest and fixup any issues uncovered by
testing.
Check the CancelCriterion between every retry when awaiting with a
timeout to make it more responsive.
Make StoppableCountDownLatch extend CountDownLatch.
Remove unused class StoppableCountDownOrUpLatch.
Improve ExecutorServiceRule for StoppableCountDownLatchTest.

While trying to refactor region initialization level in LocalRegion, I found out that StoppableCountDownLatch did not extend CountDownLatch which was making the change more difficult.

@upthewaterspout We changed StoppableCountDownLatch to delegate to CountDownLatch instead of extending it and changed the ticket to "StoppableCountDownLatch should have unit tests"

repo: apache/geode


text:
GEODE-9802: Do not use ephemeral port in test

Change LoggingWithReconnectDistributedTest.createServer() to use
AvailablePortHelper

Authored-by: Donal Evans doevans@vmware.com

For all changes:

[x] Is there a JIRA ticket associated with this PR? Is it referenced in the commit message?

[x] Has your PR been rebased against the latest commit within the target branch (typically develop)?

[x] Is your initial contribution a single, squashed commit?

[x] Does gradlew build run cleanly?

[N/A] Have you written or updated unit tests to verify your changes?

[N/A] If adding new dependencies to the code, are these dependencies licensed in a way that is compatible for inclusion under ASF 2.0?

Force pushing after rebasing on develop to resolve merge conflicts

Force pushing again to resolve merge conflicts again


text:
@AutoFinal: Added support to auto-finalize closure parameters

Extended AutoFinalASTTransformation with support to handle Closure|s in class nodes
Added several black box tests (see AutoFinalTransformBlackBoxTest) that check whether applying @AutoFinal to a class leads to the expected Groovy compiler errors ("The parameter [$paramName] is declared final but is reassigned") in methods/closures
Each test also checks that the exact same code without @AutoFinal compiles without errors
Extended the AutoFinal description to include the new feature
Refactored the description to make the intended usage more clear

This looks good at first glance. Nice work! I'll have a bit more of an in-depth look during the week.

I created an issue to track this: GROOVY-8347

Merged! Thanks! I have some minor tweaks but I'll do them after the fact.

Great G-)

I made some minor modifications:

added support for annotating a field or local variable assigned a closure value (only needed for fine-grained application of this annotation)
automatically processed inner classes if annotated at the class level
added guards to avoid processing twice (if say at both the class and method level - it's an idempotent change but more efficient)
if annotated at the method level, automatically covers closures within that method

If we do ever add configuration options via annotation attributes, the processing changes above should put us in a good place, e.g. if you use configscript to turn on for all classes, you could turn off for one class with something like one of either of these:
@AutoFinal(enabled=false)
@AutoFinal(methods=false, constructors=false, innerClasses=false, closures=false)

Let me know what you think. I haven't completed the tests yet.

Looks all good to me G-)
Even though I am generally all in favor of giving people options, still convinced disabling @AutoFinal locally makes no sense in practice, and it might even be a bad idea to support that (especially at the class level - least suprise an' all...)
Could ask in Groovy users group, though, if someone can come up with an example where e.g. @AutoFinal(enabled=false) at the method level would make sense...

"Least surprise" is possibly like beauty ... in the eye of the beholder. If I see an AutoFinal(disabled=true), I might be quite surprised until I realised a configscript is in place - which might be even more surprising if I didn't know that ahead of time. :-)

"Least surprise" in this case means I can trust that all parameters everywhere are final. One cannot apply "least surprise" to global settings, because they are, well, global, so whoever enables the global setting is responsible for making everyone involved aware of the setting (so that AutoFinal(disabled=true) does not confuse anyone).
The alternative is to put AutoFinal explcitely on every class, and enforce this with a check-in-code-rule.

I think we are in agreement. I made changes to allow disabling. Let me know what you think.
I haven't finished extra tests yet. If you have time to work on some of those, that would help me out a lot; otherwise, I'll do them later this week.

authors: mgroovy paulk-asert

repo: apache/groovy


text:
HDDS-2995. Add integration test for Recon's Passive SCM state.

What changes were proposed in this pull request?

Verify Recon gets pipeline, node and container report from Datanode.
Verify SCM metadata state == Recon metadata state (Create pipeline , Close pipeline, create container)
Fix issue in DN StateContext.

What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-2995
How was this patch tested?
Manually tested.

The IT failures are related. Working on fixing them.

I am not able to reproduce this issue locally. Trying to root cause this based of PR runs.

/retest

/retest

The test failures seem to be unrelated. I will try one more time.

Thanks for the review @saintstack  & @swagle. Closing this PR since it is taking longer than expected to fix the flakiness of Recon's integration tests. This patch contains other important refactoring that need not wait for the integration tests to be added. I will be creating separate JIRAs for that.

authors: avijayanhwx vivekratnavel

repo: apache/hadoop-ozone


text:
HADOOP-16709. Consider having the ability to turn off TTL in S3Guard …

…+ Authoritative mode
Change-Id: I042cbf3bcb33107d98b3345293fb1bcfbf0de176

Things to do:

Update docs
Review if javadocs should be updated

:confetti_ball: +1 overall

Vote
Subsystem
Runtime
Comment

0
reexec
38
Docker mode activated.

_ Prechecks _

+1
dupname
1
No case conflicting files found.

+1
@author
0
The patch does not contain any @author tags.

+1
test4tests
0
The patch appears to include 3 new or modified test files.

_ trunk Compile Tests _

+1
mvninstall
1097
trunk passed

+1
compile
36
trunk passed

+1
checkstyle
28
trunk passed

+1
mvnsite
39
trunk passed

+1
shadedclient
824
branch has no errors when building and testing our client artifacts.

+1
javadoc
29
trunk passed

0
spotbugs
59
Used deprecated FindBugs config; considering switching to SpotBugs.

+1
findbugs
58
trunk passed

_ Patch Compile Tests _

+1
mvninstall
34
the patch passed

+1
compile
29
the patch passed

+1
javac
29
the patch passed

-0
checkstyle
20
hadoop-tools/hadoop-aws: The patch generated 1 new + 35 unchanged - 0 fixed = 36 total (was 35)

+1
mvnsite
33
the patch passed

+1
whitespace
0
The patch has no whitespace issues.

+1
shadedclient
806
patch has no errors when building and testing our client artifacts.

+1
javadoc
27
the patch passed

+1
findbugs
61
the patch passed

_ Other Tests _

+1
unit
80
hadoop-aws in the patch passed.

+1
asflicense
33
The patch does not generate ASF License warnings.

3380

Subsystem
Report/Notes

Docker
Client=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/1/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/1721

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient findbugs checkstyle

uname
Linux 23b8044b9e6a 4.15.0-58-generic #64-Ubuntu SMP Tue Aug 6 11:12:41 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
personality/hadoop.sh

git revision
trunk / 92c28c1

Default Java
1.8.0_222

checkstyle
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/1/artifact/out/diff-checkstyle-hadoop-tools_hadoop-aws.txt

Test Results
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/1/testReport/

Max. process+thread count
469 (vs. ulimit of 5500)

modules
C: hadoop-tools/hadoop-aws U: hadoop-tools/hadoop-aws

Console output
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/1/console

versions
git=2.7.4 maven=3.3.9 findbugs=3.1.0-RC1

Powered by
Apache Yetus 0.10.0 http://yetus.apache.org

This message was automatically generated.

:confetti_ball: +1 overall

Vote
Subsystem
Runtime
Comment

+0 :ok:
reexec
0m 42s
Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s
No case conflicting files found.

+0 :ok:
markdownlint
0m  0s
markdownlint was not available.

+1 :green_heart:
@author
0m  0s
The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s
The patch appears to include 3 new or modified test files.

_ trunk Compile Tests _

+1 :green_heart:
mvninstall
18m 46s
trunk passed

+1 :green_heart:
compile
0m 35s
trunk passed

+1 :green_heart:
checkstyle
0m 27s
trunk passed

+1 :green_heart:
mvnsite
0m 39s
trunk passed

+1 :green_heart:
shadedclient
13m 21s
branch has no errors when building and testing our client artifacts.

+1 :green_heart:
javadoc
0m 29s
trunk passed

+0 :ok:
spotbugs
0m 58s
Used deprecated FindBugs config; considering switching to SpotBugs.

+1 :green_heart:
findbugs
0m 55s
trunk passed

_ Patch Compile Tests _

+1 :green_heart:
mvninstall
0m 32s
the patch passed

+1 :green_heart:
compile
0m 27s
the patch passed

+1 :green_heart:
javac
0m 27s
the patch passed

-0 :warning:
checkstyle
0m 19s
hadoop-tools/hadoop-aws: The patch generated 1 new + 35 unchanged - 0 fixed = 36 total (was 35)

+1 :green_heart:
mvnsite
0m 31s
the patch passed

+1 :green_heart:
whitespace
0m  0s
The patch has no whitespace issues.

+1 :green_heart:
shadedclient
13m 18s
patch has no errors when building and testing our client artifacts.

+1 :green_heart:
javadoc
0m 25s
the patch passed

+1 :green_heart:
findbugs
1m  3s
the patch passed

_ Other Tests _

+1 :green_heart:
unit
1m 19s
hadoop-aws in the patch passed.

+1 :green_heart:
asflicense
0m 31s
The patch does not generate ASF License warnings.

55m 55s

Subsystem
Report/Notes

Docker
Client=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/2/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/1721

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient findbugs checkstyle markdownlint

uname
Linux a20f730598b0 4.15.0-58-generic #64-Ubuntu SMP Tue Aug 6 11:12:41 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
personality/hadoop.sh

git revision
trunk / 30b2096

Default Java
1.8.0_222

checkstyle
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/2/artifact/out/diff-checkstyle-hadoop-tools_hadoop-aws.txt

Test Results
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/2/testReport/

Max. process+thread count
451 (vs. ulimit of 5500)

modules
C: hadoop-tools/hadoop-aws U: hadoop-tools/hadoop-aws

Console output
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/2/console

versions
git=2.7.4 maven=3.3.9 findbugs=3.1.0-RC1

Powered by
Apache Yetus 0.11.1 https://yetus.apache.org

This message was automatically generated.

I fixed all the issues you found.

:confetti_ball: +1 overall

Vote
Subsystem
Runtime
Comment

+0 :ok:
reexec
30m 10s
Docker mode activated.

_ Prechecks _

+1 :green_heart:
dupname
0m  0s
No case conflicting files found.

+0 :ok:
markdownlint
0m  0s
markdownlint was not available.

+1 :green_heart:
@author
0m  0s
The patch does not contain any @author tags.

+1 :green_heart:
test4tests
0m  0s
The patch appears to include 3 new or modified test files.

_ trunk Compile Tests _

+1 :green_heart:
mvninstall
19m 15s
trunk passed

+1 :green_heart:
compile
0m 31s
trunk passed

+1 :green_heart:
checkstyle
0m 24s
trunk passed

+1 :green_heart:
mvnsite
0m 41s
trunk passed

+1 :green_heart:
shadedclient
13m 24s
branch has no errors when building and testing our client artifacts.

+1 :green_heart:
javadoc
0m 28s
trunk passed

+0 :ok:
spotbugs
0m 58s
Used deprecated FindBugs config; considering switching to SpotBugs.

+1 :green_heart:
findbugs
0m 55s
trunk passed

_ Patch Compile Tests _

+1 :green_heart:
mvninstall
0m 33s
the patch passed

+1 :green_heart:
compile
0m 26s
the patch passed

+1 :green_heart:
javac
0m 26s
the patch passed

-0 :warning:
checkstyle
0m 20s
hadoop-tools/hadoop-aws: The patch generated 1 new + 35 unchanged - 0 fixed = 36 total (was 35)

+1 :green_heart:
mvnsite
0m 32s
the patch passed

+1 :green_heart:
whitespace
0m  0s
The patch has no whitespace issues.

+1 :green_heart:
shadedclient
13m 37s
patch has no errors when building and testing our client artifacts.

+1 :green_heart:
javadoc
0m 27s
the patch passed

+1 :green_heart:
findbugs
1m  9s
the patch passed

_ Other Tests _

+1 :green_heart:
unit
1m 17s
hadoop-aws in the patch passed.

+1 :green_heart:
asflicense
0m 30s
The patch does not generate ASF License warnings.

86m  6s

Subsystem
Report/Notes

Docker
Client=19.03.5 Server=19.03.5 base: https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/3/artifact/out/Dockerfile

GITHUB PR
https://github.com/apache/hadoop/pull/1721

Optional Tests
dupname asflicense compile javac javadoc mvninstall mvnsite unit shadedclient findbugs checkstyle markdownlint

uname
Linux a58c47170943 4.15.0-58-generic #64-Ubuntu SMP Tue Aug 6 11:12:41 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Build tool
maven

Personality
personality/hadoop.sh

git revision
trunk / 4c1a128

Default Java
1.8.0_222

checkstyle
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/3/artifact/out/diff-checkstyle-hadoop-tools_hadoop-aws.txt

Test Results
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/3/testReport/

Max. process+thread count
422 (vs. ulimit of 5500)

modules
C: hadoop-tools/hadoop-aws U: hadoop-tools/hadoop-aws

Console output
https://builds.apache.org/job/hadoop-multibranch/job/PR-1721/3/console

versions
git=2.7.4 maven=3.3.9 findbugs=3.1.0-RC1

Powered by
Apache Yetus 0.11.1 https://yetus.apache.org

This message was automatically generated.

LGTM, +1

authors: bgaborg hadoop-yetus steveloughran

repo: apache/hadoop