23.3.30での変更点

Oracle NoSQL Databaseリリース23.3.30 Enterprise Editionでは次の変更が行われました。

新機能

  1. 新しい3つのSQL集計関数(count(distinct)、array_collect()およびarray_collect(distinct))が実装されました。

    count(distinct expr)は、同じグループに属する行で計算されたときに、入力式によって返される個別値の数を返します。

    array_collect(expr)は、グループの各行に入力式を計算し、結果として得られるすべての値を配列に収集し、この作成された配列を結果として返します。

    array_collect(distinct expr)は、グループの各行に入力式を計算し、結果として得られるすべての個別値を配列に収集し、この作成された配列を結果として返します。

    たとえば、次の問合せでは、アカウント番号別に販売トランザクションをグループ化し、アカウント番号ごとに、アカウントによって購入された製品の個別のカテゴリを含む配列を返します。
    select s.xact.acctno, array_collect(distinct s.xact.prodcat) as categories
    from sales s
    group by s.xact.acctno

    [KVSTORE-1861]

  2. 新しい表タイプとしてJSONコレクションが追加されました。このタイプを使用すると、ユーザーは表にキー・フィールドのみを指定して、他の最上位フィールドをスキーマで定義されないJSON型として指定できます。また、マルチリージョン構成で使用するJSONコレクションの最上位パスとして、MRカウンタ型を定義できます。JSONコレクションで作成されたアドホック・フィールドは、record、binary、timestamp、uuidおよびenum型を除く有効なJSON型である必要があります。マップ、配列、数値、文字列値などが有効です。

    通常のスキーマ表に対するJSONコレクション表の利点は単純化です。たとえば、アプリケーションが非構造化(JSONなど)データを使用している場合、そのデータを含めるためにJSON型の中間フィールドを作成する必要はありません。キー以外のすべてのフィールドは、JSONとして自動的に追加されます。このセマンティックのため、JSONコレクション表のスキーマを変更する必要はありません(または変更できません)。追加または削除するフィールドはありません。TTLを変更することは可能です。リージョン間で一致する必要があるのは主キーのみであるため、JSONコレクション表はマルチリージョン操作にも非常に適しています。

    現時点では、JSONコレクション表は親/子関係をサポートしていません。つまり、JSONコレクションは、子表を持たない最上位の親である必要があります。

    単一の主キーを持つJSONコレクション表は、次のように作成できます。
    create table jsonCollection(id integer, primary key(id)) as json collection
    その後、任意のフィールドを追加できます。この例では、ダイレクトJavaドライバAPIを使用します。
        Table t = tableAPI.getTable("jsonCollection");
        Row row = t.createRow();
        row.put("id", 1);
        /* put some JSON -- these must be valid JSON types */
        row.put("name", "some_name"); // note that this isn't in the schema
        row.put("age", 15); // note that this isn't in the schema
        tableAPI.put(row, ...);
        PrimaryKey pkey = t.createPrimaryKey();
        pkey.put("id", 1);
        row = tableAPI.get(pkey, ...);
        /*
         * the row will look like this if toString is used:
         * {"id": 1, "name": "some_name", "age": 15}
         */

    [KVSTORE-1717]

  3. リモート・リージョンからデータをレプリケートするための複数のマルチリージョン・エージェントの実行のサポートが追加されました。複数のエージェントがデプロイされると、ストアからのデータを分割して、各エージェントがデータの一部のみをレプリケートするので、スループットが向上します。

    [KVSTORE-984]

  4. 以前のリリースの全文検索(FTS)機能は、Elasticsearch (ES)バージョン2でテストされました。このリリース以降、FTSはESバージョン7以降を必要とし、ESバージョン8でテストされました。

    さらに、ユーザーがストアとElasticsearchクラスタ間のセキュアな通信が必要な場合、以前のリリースのFTSではShield ESプラグインを使用する必要がありました。このリリース以降、Shieldプラグインはサポートされなくなりました。ユーザーは、セキュアな通信を有効にするには、PKIセキュリティを使用してESを構成する必要があります。

    この更新では、ESクラスタを新しくサポートされるバージョンに更新するために、既存のデプロイメントを変更する必要があることに注意してください。ESデータの移行に関するガイダンスについては、必ずFTSのドキュメントを確認してください。

    [KVSTORE-1917]

バグとパフォーマンスの修正

  1. Streams APIのNoSQLSubscription.getOptimizedPositionメソッドがメソッド・パラメータで指定されたストリーム位置より前のストリーム位置を戻すことがあるというバグを修正しました。このメソッドでは、指定された位置以降のストリーム位置が常に返されるようになりました。

    [KVSTORE-2037]

  2. geojson索引を使用した問合せのバグを修正しました。以前は、索引定義でgeojsonフィールドの前に1つ以上のgeojson以外のフィールドが指定されていて、問合せでgeojson以外のフィールドに対する等価述語が含まれていなかった場合、索引が誤って使用されていました。たとえば、次の索引と問合せは誤った結果を返しました。
    create index idx_kind_ptn on points(info.kind as string,
    info.point as point)
    
    
    select id, p.info.point
    from points p
    where geo_near(p.info.point,
                   { "type" : "point", "coordinates" : [ 24.0175, 35.5156 ] },
                   5000)

    [KVSTORE-2134]

  3. 型指定されたマップ/配列をJSONマップ/配列に変換する際のバグを修正しました。このような変換は、型指定されたマップ/配列をJSONマップ/配列に挿入する場合に必要となります。seq_transform関数を使用する問合せでは、変換が実行されない場合があり、実行時の型エラーが発生しました。たとえば、次の問合せ(ここで、'info'はjson型の列)ではエラーが発生します。これは、式{"num_phones": size($.phones)}にはmap(integer)型があり、これは外部マップ・コンストラクタにmap(json)型があるため、map(json)に変換される必要があるためです。
    select {
             "id" : t.id,
             "phones" : [seq_transform(t.info.addresses[],
                                       {"num_phones": size($.phones)})]
           }
    from foo t

    [KVSTORE-2139]

  4. NoSQLSubscriber.onNextへのコールを介してサブスクライバにまだ配信されていないいくつかの要素を含めることができなかったストリーム位置をStreams APIのNoSQLSubscription.getCurrentPositionメソッドが返すことがまれにあるというバグを修正しました。その結果、NoSQLSubscription.getCurrentPositionによって返されたストリーム位置にチェックポイントを作成すると、そのチェックポイントから再開した後に、欠落しているイベントのストリーミングに失敗する可能性があります。

    [KVSTORE-1998]

  5. 関連するストアに対して拡張度操作を実行する際に、Streams APIでサブスクライブされた表へのいくつかの書込みが欠落する原因となった可能性があるバグを修正しました。

    [KVSTORE-2062]

  6. ローカル・リージョンまたはリモート・リージョンのストアが起動時に使用できなかった場合に、XRegionサービス・エージェントが起動に失敗することがあるというバグを修正しました。この修正により、エージェントはストアが使用可能になるまで再試行します。

    [KVSTORE-2057]

  7. ストアがパーティション移行に関連する拡張度操作を実行しているときに、Streams APIで少数の操作が欠落する可能性がまれにあるというバグを修正しました。

    [KVSTORE-1838]

  8. クライアントでSSLハンドシェイク・タスクの例外がサイレントに無視され、問題が接続タイムアウトとしてのみ認識される問題を修正しました。例外の例を次に示します。
    java.lang.IllegalAccessError:
    org.bouncycastle.jcajce.provider.ProvSunTLSKDF$TLSExtendedMasterSecretGenerator$1
    (in unnamed module @0xd504137) cannot access class
    sun.security.internal.spec.TlsMasterSecretParameterSpec (in module
    java.base) because module java.base does not export
    sun.security.internal.spec to unnamed module @0xd504137
        at org.bouncycastle.jcajce.provider.ProvSunTLSKDF$TLSExtendedMasterSecretGenerator$1.run(Unknown Source)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
        at org.bouncycastle.jcajce.provider.ProvSunTLSKDF$TLSExtendedMasterSecretGenerator.engineInit(Unknown Source)
        at java.base/javax.crypto.KeyGenerator.init(KeyGenerator.java:476)
        at java.base/javax.crypto.KeyGenerator.init(KeyGenerator.java:452)
        at java.base/sun.security.ssl.SSLMasterKeyDerivation$LegacyMasterKeyDerivation.deriveKey(SSLMasterKeyDerivation.java:149)
        at java.base/sun.security.ssl.KAKeyDerivation.t12DeriveKey(KAKeyDerivation.java:89)
        at java.base/sun.security.ssl.KAKeyDerivation.deriveKey(KAKeyDerivation.java:61)
        at java.base/sun.security.ssl.ECDHClientKeyExchange$ECDHEClientKeyExchangeProducer.produce(ECDHClientKeyExchange.java:426)
        at java.base/sun.security.ssl.ClientKeyExchange$ClientKeyExchangeProducer.produce(ClientKeyExchange.java:65)
        at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:440)
        at java.base/sun.security.ssl.ServerHelloDone$ServerHelloDoneConsumer.consume(ServerHelloDone.java:182)
        at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:396)
        at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:480)
        at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:458)
        at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:201)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172)
    以前は、このような例外はログに記録されただけでした。ただし、通常、クライアント側のロギングは無効であるため、例外が認識されませんでした。この修正により、要求がタイムアウトして、次のようなメッセージが表示されます。
    oracle.kv.RequestTimeoutException: Request dispatcher: c2409576586975841402, dispatch timed out after 0 attempt(s) to dispatch the request to an RN. Target: rg1-rn1 (23.2.6) on [2023-06-08 19:38:47.346 UTC]. Timeout: 5000ms. Dispatch event trace: (DISPATCH_REQUEST_RESPONDED, 2023-06-08 19:38:46.623 UTC, rg1-rn1, PersistentDialogException|ConnectionUnknownException|CompletionException|IllegalAccessError org.bouncycastle...
    

    [KVSTORE-1816]

  9. GROUP BYを使用し、グループ化式を降順で順序付けする問合せに影響するバグを修正しました。このような問合せで索引ベースのグループ化が実行された場合、問合せ結果は、要求された降順ではなく昇順で順序付けされました。たとえば、次の問合せは、address.stateにも索引がある場合のバグを示しています。
    select u.address.state, count(*)
    from users
    group by u.address.state
    order by u.address.state desc

    [KVSTORE-2078]

  10. RNでの問合せの再開に関するバグを修正しました。このバグは、問合せを再開する必要がある行が削除された場合に発生することがあります。このバグにより、重複した問合せ結果が返されます。

    [KVSTORE-2144]

  11. 'any'比較演算子のバグを修正しました。右側のオペランドが2つを超える項目を返す場合に、この演算子は誤った結果を返す可能性がありました。

    [KVSTORE-2150]

  12. リリース22.3の前後のリリースを実行するストア・プロセス間の通信における互換性の問題を修正しました。たとえば、サーバーが新しいバージョンにアップグレードされ、古いクライアントがあるとします。その場合、クライアントでは、要求でDialogNoBackoffExceptionがスローされるのが確認され、Heartbeat timeout, no read event during last ...またはendpoint already shutdownというメッセージが表示されることがありました。異なるバージョンのサーバー・プロセス間の通信も、この問題の影響を受ける可能性がありました。この問題は、軽負荷時に発生する可能性が高く、10秒間隔内に少なくとも1つの要求/応答の交換があった場合は発生しませんでした。

    [KVSTORE-1935]

  13. 次の場合のバグを修正しました。
    1. SET TLL USING TABLE DEFAULTがUPDATE文で使用され、
    2. ターゲット表に明示的に指定されたデフォルトTTLがなかった場合
    この場合、UPDATE文は行の有効期限の更新に失敗しました。

    [KVSTORE-1981]

  14. 表のサブスクライブまたはサブスクライブ解除がハングする原因となることがあったStreams APIのバグを修正しました。

    [KVSTORE-1860]

  15. 次のようなNullPointerExceptionが生成される場合があった、表反復の実装における競合状態が修正されました。
    java.lang.NullPointerException: Cannot invoke
    "java.util.concurrent.CompletableFuture.whenComplete(java.util.function.BiConsumer)"
    because the return value of
    "oracle.kv.impl.api.table.TableScan$BasicMultiGetIteratorWrapper.getMoreElementsAsync()"
    is null
          at oracle.kv.impl.api.table.TableScan$BasicMultiGetIteratorWrapper.nextLocal(TableScan.java:950)
          at oracle.kv.impl.async.AsyncIterationHandleImpl.notifyOneNext(AsyncIterationHandleImpl.java:478)
          at oracle.kv.impl.async.AsyncIterationHandleImpl.notifyNext(AsyncIterationHandleImpl.java:373)
          at oracle.kv.impl.async.AsyncIterationHandleImpl.subscribe(AsyncIterationHandleImpl.java:156)
          at oracle.kv.impl.async.AsyncPublisherImpl.subscribe(AsyncPublisherImpl.java:127)

    [KVSTORE-1828]

  16. 'plan network-restore'管理CLIコマンドが実際は失敗したのに成功したと報告されることがあった問題を修正しました。

    [KVSTORE-1811]

  17. 重要な統計スキャンが誤ってスロットルされる可能性があり、場合によってはスキャンが完了するまでにかなり時間がかかることがある、リリース22.1で導入された問題を修正しました。

    [KVSTORE-1929]

  18. まれに計画がハングする原因となる可能性がある、計画実行コードのスレッド安全性の不具合が修正されました。

    [KVSTORE-1920]

  19. 管理CLIのバージョンが1つ以上のストレージ・ノードのバージョンより前であった場合に、管理CLIのverify prerequisiteコマンドによって誤ったエラー・メッセージが生成される問題を修正しました。verify prerequisiteコマンドは、ストアが管理CLIで使用されているバージョンへのアップグレードをサポートしているかどうかをチェックします。

    以前は、エラー・メッセージにノードのダウングレードに関する記述がありましたが、意図したアップグレード・バージョンではなく前提条件のバージョンが記述されていました。メッセージでアップグレード・バージョンが参照され、表現が改善されるようになりました。

    たとえば、ストア内のSNAでバージョン23.2.1が実行されており、管理CLIのバージョンが22.1.1の場合、次のようなエラー・メッセージが表示されます。
      Node cannot be changed to use version 22.1.1 because that would
      require a downgrade from newer version 23.2.1 it is currently running,
      and that downgrade is not supported.

    [KVSTORE-1803]

  20. マップ・フィルタ・ステップ式が行変数に直接適用されたときに発生したSQL問合せのバグを修正しました。たとえば、次の問合せでは、keys()ステップが"b"の行変数に適用されたため、例外が発生します。
    select *
    from bar $b, $b.keys() $k, $b.$k $v

    [KVSTORE-1968]

  21. 管理の再起動中に承認済状態にある計画を実行する、KVSTORE-1194のリリース22.1で行われた変更を元に戻しました。前の変更は間違いであり、-noexecuteフラグを指定して作成された計画が、計画実行を明示的に要求することなく実行されることがありました。

    [KVSTORE-1591]

  22. ユーザー表が作成されるまでスキャンの実行を待機するように、キー分散統計コレクタを変更しました。キー統計コレクタは、独自の記録および結果の統計の記録のために、データをシステム・テーブルに格納します。表の行とキー/値のエントリは同じキー領域を共有するため、これらのシステム表のエントリはキー/値のデータと競合する可能性がありました。ただし、ユーザー表が作成されると、表の行とキー/値のエントリ間の潜在的な衝突を処理するのはユーザー次第であるため、コレクタがシステム表に書き込むことは安全です。この変更の結果、キー分散統計は、最初のユーザー表の作成後にのみ使用可能になり、それより前にシステム表またはキー/値のキー領域で使用できなくなります。

    [KVSTORE-2007]

  23. セキュアなストアで管理REST APIを使用したpingコマンドが常にadminのステータスについてUNREACHABLEを返し、adminが正常であった場合でもHTTPステータス・コード308の応答を返すバグを修正しました。

    [KVSTORE-1862]

  24. GENERATED ALWAYSの主キー列値が存在する場合のTableAPI.putIfPresent()の動作が変更されました。値が存在する場合、新しい値の生成はスキップされ、指定された主キーを持つ行に対してputIfPresentが実行されます。このようにして、主キーの一部である列にGENERATED ALWAYSを使用して、表の既存の行を更新できます。以前は、この場合はRow.putメソッドがIllegalArgumentExceptionをスローしていました。

    [KVSTORE-152]

  25. セキュア・ストアで使用されるJavaダイレクト・ドライバ・アプリケーションでFINEロギングを有効にすると、次のようなNoClassDefFoundErrorsをアプリケーションが受け取る可能性がある問題を修正しました。
    Exception in thread "main" java.lang.NoClassDefFoundError: oracle/kv/impl/security/login/LoginSession$Id
    	at oracle.kv.impl.security.login.SessionId.hashId(SessionId.java:273)
    	at oracle.kv.impl.security.login.LoginToken.hashId(LoginToken.java:178)
    	at oracle.kv.impl.security.login.LoginToken.toString(LoginToken.java:173)
    	at java.base/java.lang.String.valueOf(String.java:4218)
    	at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
    	at oracle.kv.impl.security.login.AsyncUserLogin$LogoutCall.describeParams(AsyncUserLogin.java:558)
    	at oracle.kv.impl.security.login.AsyncUserLogin$AbstractCall.describeCall(AsyncUserLogin.java:582)
    	at oracle.kv.impl.async.AsyncVersionedRemoteDialogInitiator.toString(AsyncVersionedRemoteDialogInitiator.java:236)
    	at java.base/java.lang.String.valueOf(String.java:4218)
    	at java.base/java.lang.StringBuilder.append(StringBuilder.java:173)
    	at oracle.kv.impl.async.AsyncVersionedRemoteInitiator.lambda$startDialog$8(AsyncVersionedRemoteInitiator.java:239)
    	at oracle.kv.impl.async.FutureUtils.lambda$unwrapExceptionVoid$2(FutureUtils.java:381)
    	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
    	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
    	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
    	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
    	at oracle.kv.impl.async.FutureUtils.checkedComplete(FutureUtils.java:245)
    	at oracle.kv.impl.async.AsyncVersionedRemoteDialogInitiator.onCanRead(AsyncVersionedRemoteDialogInitiator.java:179)
    	at oracle.kv.impl.util.registry.AsyncRegistryUtils$WrappedDialogHandler.onCanRead(AsyncRegistryUtils.java:670)
    	at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.doWork(DialogContextImpl.java:1088)
    	at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.run(DialogContextImpl.java:1059)
    	at oracle.kv.impl.async.dialog.DialogContextImpl.callOnCanRead(DialogContextImpl.java:964)
    	at oracle.kv.impl.async.dialog.DialogContextImpl.onReadDialogFrame(DialogContextImpl.java:648)
    	at oracle.kv.impl.async.dialog.AbstractDialogEndpointHandler.onReadDialogFrame(AbstractDialogEndpointHandler.java:1783)
    	at oracle.kv.impl.async.dialog.AbstractDialogEndpointHandler.onMessageReady(AbstractDialogEndpointHandler.java:1528)
    	at oracle.kv.impl.async.dialog.AbstractDialogEndpointHandler.onChannelInputRead(AbstractDialogEndpointHandler.java:1088)
    	at oracle.kv.impl.async.dialog.AbstractDialogEndpointHandler.onChannelInputRead(AbstractDialogEndpointHandler.java:1046)
    	at oracle.kv.impl.async.dialog.nio.NioEndpointHandler.read(NioEndpointHandler.java:246)
    	at oracle.kv.impl.async.dialog.nio.NioEndpointHandler.onRead(NioEndpointHandler.java:198)
    	at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.doProcess(NioChannelExecutor.java:1596)
    	at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.selectAndProcess(NioChannelExecutor.java:1318)
    	at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.runOnce(NioChannelExecutor.java:845)
    	at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.lambda$run$9(NioChannelExecutor.java:801)
    	at oracle.kv.impl.fault.AsyncEndpointGroupFaultHandler.lambda$static$0(AsyncEndpointGroupFaultHandler.java:21)
    	at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.run(NioChannelExecutor.java:798)
    	at java.base/java.lang.Thread.run(Thread.java:833)
    Caused by: java.lang.ClassNotFoundException: oracle.kv.impl.security.login.LoginSession$Id
    	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    	... 36 more

    [KVSTORE-1937]

  26. デバッグモードが無効になっている場合でも、パスワードの複雑度違反が原因で期限切れのパスワードの更新が失敗したときにエラーメッセージが出力されるように管理CLIを変更しました。エラー・メッセージは以前はデバッグ・モードでのみ出力されていたため、パスワードの更新が失敗した理由を理解することが困難でした。

    [KVSTORE-1902]

  27. GEOMETRYやPOINTなどのgeo-json索引を持つ表に対してSQLシェルのshow ddlコマンドが失敗することがある問題を修正しました。

    [KVSTORE-1978]

  28. リスニング・ソケットに障害が発生してもストレージ・ノードが停止しなかった問題を修正しました。この問題により、snabootログにListener shutting downというメッセージが生成され、SNプロセスは終了しませんでした。SNのフォルト・トレランスのために、SNを監視してSNで障害が発生したときに再起動するメカニズム(cronジョブなど)を管理者がインストールすることが期待されていました。この修正により、リスニング・ソケットに障害が発生すると、そのメカニズムによってSNが再起動されるようになりました。

    [KVSTORE-2041]

  29. ログに表示されるEndpoint handler encounters that ... start unknown dialog typeなどのメッセージに伴って起こるリソースのリークを修正しました。リークが始まったときはすぐには兆候はありませんでしたが、リソースが枯渇すると、問題のあるノードとのネットワーク通信が失敗し、最終的にOutOfMemoryErrorでノードに障害が発生しました。

    [KVSTORE-2033]

  30. 要求に対してスローされた例外について、ログまたは例外メッセージにMaximum permit count exceededというエラー・メッセージが生成されたリソースのリークを修正しました。この問題は、通常、ネットワーク・レイヤーの他の問題(低速なネットワークやDNSの障害など)の結果であり、根本原因が対処されたときに解決される可能性があります。

    [KVSTORE-2044]

  31. トポロジの拡張度操作中にRNの障害を引き起こす可能性のある問題を修正しました。この問題は、次のような一連のロギング・メッセージが表示されてRNが停止または再起動された場合に確認される可能性があります。
    2023-07-15 02:55:51.295 UTC INFO [rg5-rn2] Cannot localize topology seq#: 387 because it is < migration topology seq#: 392
    ...
    2023-07-15 02:55:52.297 UTC SEVERE [rg5-rn2] JE: Replica unexpected exception com.sleepycat.je.EnvironmentFailureException: (JE 23.3.3) rg5-rn2(2):/scratch/tests/workspace/kv_elasticity/kv/kvstore/build/test/standalone/elasticity-stress/scratch/kvtest-standalone.ElasticityStress/sn8/rg5-rn2/env java.lang.IllegalStateException: update of local topology failed from commit trigger for topology seq#: 392 UNEXPECTED_EXCEPTION_FATAL: Unexpected internal Exception, unable to continue. Environment is invalid and must be closed. Problem seen replaying entry Commit/22 vlsn=1306 isReplicated="1"  com.sleepycat.je.EnvironmentFailureException: (JE 23.3.3) rg5-rn2(2):/scratch/tests/workspace/kv_elasticity/kv/kvstore/build/test/standalone/elasticity-stress/scratch/kvtest-standalone.ElasticityStress/sn8/rg5-rn2/env java.lang.IllegalStateException: update of local topology failed from commit trigger for topology seq#: 392 UNEXPECTED_EXCEPTION_FATAL: Unexpected internal Exception, unable to continue. Environment is invalid and must be closed. Problem seen replaying entry Commit/22 vlsn=1306 isReplicated="1"
    	at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:403)
    	at com.sleepycat.je.dbi.TriggerManager.runTriggers(TriggerManager.java:347)
    	at com.sleepycat.je.dbi.TriggerManager.runCommitTriggers(TriggerManager.java:231)
    	at com.sleepycat.je.txn.Txn.commit(Txn.java:809)
    	at com.sleepycat.je.rep.txn.ReplayTxn.commit(ReplayTxn.java:299)
    	at com.sleepycat.je.rep.impl.node.Replay.replayEntry(Replay.java:770)
    	at com.sleepycat.je.rep.impl.node.Replica$ReplayThread.run(Replica.java:1382)
    Caused by: java.lang.IllegalStateException: update of local topology failed from commit trigger for topology seq#: 392
    	at oracle.kv.impl.rep.migration.MigrationManager$CompletionTrigger.commit(MigrationManager.java:2196)
    	at com.sleepycat.je.dbi.TriggerManager$7.run(TriggerManager.java:237)
    	at com.sleepycat.je.dbi.TriggerManager.runTriggers(TriggerManager.java:343)
    	... 5 more

    [KVSTORE-1868]

  32. エンドポイント情報を含めるようにConnectionTimeoutExceptionのエラー・メッセージを変更しました。結果のメッセージは、SSLを使用しない接続の場合、次のようになります。
        oracle.kv.impl.async.exception.ConnectionTimeoutException: Problem with channel ((/127.0.0.1:33430->uranus/127.0.1.1:34455)NBL): Heartbeat timeout, no read event during last 1000 ms, endpointHandlerId=6479ecc3c752b3aa
    
    SSLとの接続については、次のようなメッセージが表示されます。
        oracle.kv.impl.async.exception.ConnectionTimeoutException: Problem with channel ((/127.0.0.1:35615->localhost/127.0.0.1:40019)NBL client): Heartbeat timeout, no read event during last 200 ms, endpointHandlerId=45c554258911aa74
    

    [KVSTORE-1888]

  33. DNS障害に対する脆弱性を修正しました。修正前は、低速なDNS解決によって、ノード上の一部またはすべてのネットワーク通信が失敗することがありました。この問題は、ネットワーク・レイヤーの重要なパスからDNS操作をブロックする可能性があるものを移動することで修正されました。

    [KVSTORE-1766]

  34. 新しい-storage-typeフラグをmakebootconfigコマンドに追加しました。このフラグを使用すると、ストレージ・ディレクトリが存在するディスクのタイプを指定できます。有効なストレージタイプ値は、HD、SSD、NVME、およびUNKNOWNです。これと似た-storage-dir-storage-typeフラグが以前にドキュメント化されていますが、実装されませんでした。

    [KVSTORE-1174]

  35. Elasticsearchクラスタとストア間の通信に使用されるトランスポート・レイヤー・セキュリティ(TLS)のバージョンをTLSv1からTLSv1.2に更新して、セキュリティを向上させました。

    [KVSTORE-2031]

  36. 23.1にアップグレードされたストアのSNパラメータを変更するためにコールされた場合に'plan change-parameters'管理CLIコマンドが失敗する問題を修正しました。失敗した計画では、次のようなスタック・トレースが表示されていました。
    kv-> show plan -id 72;
    Plan Change Storage Node Params
    Owner:                 root(id:u1)                   
    Id:                    72                            
    State:                 ERROR                         
    Attempt number:        1                             
    Started:               2023-10-31 11:13:12 UTC       
    Ended:                 2023-10-31 11:13:38 UTC       
    Plan failures:         
    	Failure 1: 1/WriteNewSNParams sn1 failed.: java.lang.NullPointerException:null (23.1.25)
    Total tasks:           4                             
     Progress percent:     75                            
     Successful:           3                             
     Failed:               1                             
    
    Failures:
       Task   1       ERROR at   2023-10-31 11:13:13 UTC: Plan 72 [Change Storage Node Params] task [WriteNewSNParams sn1]: 1/WriteNewSNParams sn1 failed.: java.lang.NullPointerException:null (23.1.25): oracle.kv.impl.sna.SNAFaultException: java.lang.NullPointerException:null (23.1.25)
    Fault StackTrace: java.lang.NullPointerException
    	at oracle.kv.impl.param.ParameterMap.merge(ParameterMap.java:316)
    	at oracle.kv.impl.param.ParameterMap.merge(ParameterMap.java:290)
    	at oracle.kv.impl.sna.StorageNodeAgent.replaceStorageNodeParams(StorageNodeAgent.java:4202)
    	at oracle.kv.impl.sna.StorageNodeAgentImpl.lambda$newStorageNodeParameters$15(StorageNodeAgentImpl.java:605)
    	at oracle.kv.impl.fault.ProcessFaultHandler.execute(ProcessFaultHandler.java:170)
    	at oracle.kv.impl.sna.StorageNodeAgentImpl.newStorageNodeParameters(StorageNodeAgentImpl.java:602)
    	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 oracle.kv.impl.util.AbstractInvocationHandler.invokeMethod(AbstractInvocationHandler.java:60)
    	at oracle.kv.impl.security.SecureProxy$CheckingHandler.lambda$invoke$1(SecureProxy.java:568)
    	at oracle.kv.impl.security.ExecutionContext.runWithContext(ExecutionContext.java:179)
    	at oracle.kv.impl.security.SecureProxy$CheckingHandler.invoke(SecureProxy.java:566)
    	at oracle.kv.impl.security.SecureProxy.invokeNonObject(SecureProxy.java:108)
    	at oracle.kv.impl.util.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:107)
    	at com.sun.proxy.$Proxy21.newStorageNodeParameters(Unknown Source)
    	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 oracle.kv.impl.util.AbstractInvocationHandler.invokeMethod(AbstractInvocationHandler.java:60)
    	at oracle.kv.impl.async.JavaSerialMethodTable$JavaSerialMethodCall.callService(JavaSerialMethodTable.java:174)
    	at oracle.kv.impl.async.JavaSerialResponder.callServer(JavaSerialResponder.java:104)
    	at oracle.kv.impl.async.JavaSerialResponder.lambda$handleRequest$0(JavaSerialResponder.java:87)
    	at oracle.kv.impl.async.AsyncVersionedRemoteDialogResponder.withThreadDialogContext(AsyncVersionedRemoteDialogResponder.java:315)
    	at oracle.kv.impl.async.JavaSerialResponder.lambda$handleRequest$1(JavaSerialResponder.java:85)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at java.base/java.lang.Thread.run(Thread.java:834)

    [KVSTORE-2152]

ストレージ・エンジンの変更点(JE 23.3)

  1. 予約ファイルが欠落しているとバックアップからのリカバリが失敗していましたが失敗しなくなりました。

    問題と解決策をより詳しく説明すると、バックアップには予約ファイルが含まれておらず、アクティブなログ・セットのみが含まれています。そのため、バックアップからリストアすると、リカバリで欠落している予約ファイルが検出され、それらがreservedFileDBから削除され、VLSNIndexが切り捨てられて、欠落している予約ファイル内のVLSNへの参照が削除されます。ただし、アクティブなログ・ファイルにレプリケートされたログが含まれていない場合、または少なくとも最後のマッチポイントが含まれていない場合はまれにあります。KVSTORE-467の場合、アクティブ・ログ・ファイルにレプリケートされたログが含まれておらず、VLSNIndexが空になるまで切り捨てられたため、起動が失敗しました。この場合、問題は、マッチポイントがアクティブなログ・セットになく、VLSNIndexが最後のマッチポイントを切り捨てられないため、管理ノードを起動できなかったことです。

    この修正では、バックアップ中に最後のマッチポイントを判別し、マッチポイントがアクティブなログセットにない場合は、マッチポイントがバックアップセットの一部になるまで、予約済ファイルをアクティブなログセットに追加します。

    ノート:

    JEバックアップは、NoSQLデータベース・スナップショット機能の実装の一部であるため、この修正の利点はそこにも反映されています。

    [KVSTORE-1931] (23.2.0)