class DistributedSqlConfiguration {
    /** */
    private static final String QUERY_TIMEOUT_PROPERTY_NAME = "sql.defaultQueryTimeout";

    /** Property update message. */
    protected static final String PROPERTY_UPDATE_MESSAGE =
        "SQL parameter '%s' was changed from '%s' to '%s'";

    /** Default value of the query timeout. */
    public static final int DFLT_QRY_TIMEOUT = 0;

    /** Query timeout. */
    private volatile DistributedChangeableProperty<Integer> dfltQryTimeout;

    /**
     * @param ctx Kernal context
     * @param log Logger.
     */
    protected DistributedSqlConfiguration(
        GridKernalContext ctx,
        IgniteLogger log
    ) {
        ctx.internalSubscriptionProcessor().registerDistributedConfigurationListener(
            new DistributedConfigurationLifecycleListener() {
                @Override public void onReadyToRegister(DistributedPropertyDispatcher dispatcher) {
                    DistributedChangeableProperty<Integer> prop = dispatcher.property(QUERY_TIMEOUT_PROPERTY_NAME);

                    if (prop != null) {
                        dfltQryTimeout = prop;

                        return;
                    }

                    dfltQryTimeout = new SimpleDistributedProperty<>(
                        QUERY_TIMEOUT_PROPERTY_NAME,
                        SimpleDistributedProperty::parseNonNegativeInteger,
                        "Timeout in milliseconds for default query timeout. 0 means there is no timeout."
                    );

                    dfltQryTimeout.addListener(makeUpdateListener(PROPERTY_UPDATE_MESSAGE, log));

                    dispatcher.registerProperties(dfltQryTimeout);
                }

                @SuppressWarnings("deprecation")
                @Override public void onReadyToWrite() {<FILL_FUNCTION_BODY>}
            }
        );
    }

    /**
     * @return Default query timeout.
     */
    public int defaultQueryTimeout() {
        Integer t = dfltQryTimeout == null ? null : dfltQryTimeout.get();

        return t != null ? t : DFLT_QRY_TIMEOUT;
    }

    /**
     * @param timeout Default query timeout.
     * @throws IgniteCheckedException if failed.
     */
    public GridFutureAdapter<?> defaultQueryTimeout(int timeout) throws IgniteCheckedException {
        A.ensure(timeout >= 0,
            "default query timeout value must not be negative.");

        if (dfltQryTimeout == null)
            throw new IgniteCheckedException("Property " + QUERY_TIMEOUT_PROPERTY_NAME + " is not registered yet");

        return dfltQryTimeout.propagateAsync(timeout);
    }
}

                    if (ReadableDistributedMetaStorage.isSupported(ctx)) {
                        setDefaultValue(
                            dfltQryTimeout,
                            (int)ctx.config().getSqlConfiguration().getDefaultQueryTimeout(),
                            log);
                    }
                    else {
                        log.warning("Distributed metastorage is not supported. " +
                            "All distributed SQL configuration parameters are unavailable.");

                        // Set properties to default.
                        dfltQryTimeout.localUpdate((int)ctx.config().getSqlConfiguration().getDefaultQueryTimeout());
                    }
                
<no_super_class>