What’s new in v23.1LTS


New builtins

DAG(Directed Acyclic Graph)型のワークフロー駆動モデルが新規追加されました。 詳細は、DAGを参照

  • DAG
  • DAGInstance

New service

  • DAG(Directed Acyclic Graph)サービスの新規追加

  • masterノードを検出するサービスを追加
    (master/guestノードを動的に識別する特殊なプラグイン開発を可能にする為)

APIGWに追加されたAPI

Method Path Description
GET /masterlookup 稼働している全てのロールのmasterノード情報を取得する
GET /masterlookup?role={role} 指定したロールのmasterノード情報を取得する
GET /masterlookup?scope=cluster 稼働している全てのロールのmaster/guestノード情報を取得する
GET /masterlookup?scope=cluster?role={role} 指定したロールのmaster/guestノード情報を取得する

APIGW以外のロールに追加されたAPI

Method Path Description
GET /{role}/masterlookup/master masterノード情報を取得する
GET /{role}/masterlookup/cluster master/guestノード情報を取得する

Note

roleキーワード引数に指定できる文字列は、APIGWTRANSACTIONSCENARIOSCHEDULELAMBDACOLLECTORREFLECTORのいづれかです

Tip

プラグインからmasterノードを取得したい場合は、Runtime組み込みオブジェクトに追加されたmasterLookupクラスメソッドを利用できます。

* 全ロールのmaster情報が返却されます
masterInfo = await Runtime.masterLookup()
* role引数で指定したロールのmaster情報が返却されます
scenarioMasterInfo = await Runtime.masterLookup(role="SCENARIO")

同様にプラグインからクラスタ情報(master/guest)を取得したい場合は、Runtime組み込みオブジェクトに追加されたclusterLookupクラスメソッドを利用できます。

* 全ロールのクラスタ情報が返却されます
clusterInfo = await Runtime.clusterLookup()
* role引数で指定したロールのクラスタ情報が返却されます
scenarioClustersInfo = await Runtime.clusterLookup(role="SCENARIO")

heartbeat APIにクラスタ全体を検査するオプションを追加

従来のheartbeat APIは受信したPodの稼働状態を取得する機能を提供していましたが、cluster=trueクエリパラメータを付与することで受信したPod以外に稼働している全てのPodの稼働状態を収集して返却することが可能になりました。


General changes

  • SQL組み込みオブジェクトのrunメソッドにステートメントの自動コンパイルの有効化・無効化を指定するauto_compileキーワード引数を追加
  • SQL組み込みオブジェクトのbulkUpsertクラスメソッドにconn及びtranキーワード引数を追加
  • Runtime組み込みオブジェクトにmasterLookup、及びclusterLookupクラスメソッドを追加
  • Device組み込みオブジェクトで指定可能なdeviceを最新化(詳しくはnetmikoのドキュメントを参照してください)
  • Scenario Podダウンを自動検出し、該当Podで走行していたトランザクションを他のPodに引き継ぐクラッシュリカバリ機能を追加(新機能のDAGも同様)

Note

v22.x系までは、シナリオ駆動中のPodが予期せずダウンした場合、Transactionサーバによるトランザクションタイムアウト検出まで状態が変化せず、またトランザクションタイムアウトが検出された場合は、Abortedに遷移する動作仕様となっていた為、Abortedからの処理再開にはaborthookプラグインを作成する必要がありました。

v23.x系では、TransactionサーバがトランザクションをハントしているScenarioサーバPodを常時監視(最大10秒程度の遅延あり)しており、ダウン検知すると別のPodに処理を引き継ぐ動作となります。Processing/RecoveryProcessing中のトランザクションの場合、そのまま処理を継続します。Cancelling中のトランザクションの場合も同様にキャンセル処理を継続します。

Tip

Qmonus SDKのシナリオは原則として冪等性を考慮した設計実装を推奨していますが、処理継続されると問題がある特殊なケースにおいてはシナリオの設定変更によってProcessing/RecoveryProcessing中だったものをCancellingで別Podに委譲する動作とすることも可能です。その場合は、シナリオのtransaction設定に追加されたcrash_recovery_policyをNoIdempotencyに設定してください。デフォルトはIdempotencyの動作となります。

クラッシュリカバリの動作イメージ


走行状態とポリシーによるアクションと状態遷移の違い
status crash_recovery_policy action transition
Processing Idempotency recovery Processing -> RecoveryProcessing
NoIdempotency cancel Processing -> Cancelling
RecoveryProcessing Idempotency recovery RecoveryProcessing -> RecoveryProcessing
NoIdempotency cancel RecoveryProcessing -> Cancelling
Cancelling Idempotency cancel Cancelling -> Cancelling
NoIdempotency cancel Cancelling -> Cancelling

Tip

クラッシュリカバリによるトランザクションの状態遷移はAbortedを経由しません。そのためaborthookとの競合を考慮する必要がありません。尚、クラッシュリカバリが動作した場合、遷移時のreasonにはAuto Crash Recoveryがセットされます。


  • REPL改善要望への対応

print関数を使用しなくても値出力を可能になりました。

Qmonus-SDK v23.1LTS-CBT [ug30-hash-dev-main.usen.ad.jp(192.168.2.115)]
2022-12-13T09:27:14.579040+09:00
Type "copyright", "help", "commands"
axis-edge/e2eoPoC: develop
>>> 1↵
... ↵
↵
1
>>> 1*8↵
... ↵
↵
8
>>> 1<<2↵
... ↵
↵
4
>>> {"foo": "bar"}↵
... ↵
↵
{'foo': 'bar'}
>>> [i for i in range(3)]↵
... ↵
↵
[0, 1, 2]
>>> m = MU({"foo": "bar"})↵
... ↵
↵
>>> m.foo↵
... ↵
↵
bar
>>> m.dictionary↵
... ↵
↵
{'foo': 'bar'}
>>> callout↵
... ↵
↵
functools.partial(<function callout at 0x10e174790>, <axis.boot.context.SystemContext object at 0x10d9935e0>)
>>> dag = await DAG.load("helloDAG")↵
... dag↵
... ↵
↵
<axis.hotspot.builtins.dag.DAG object at 0x1101389d0>
>>> for i in range(3):↵
...     i↵
... ↵
↵
0
1
2
>>>


Caution

制限事項としてpythonのREPLと異なるのは以下のような関数呼び出しの返り値を出力することはできません。

>>> def _():
...     return True
... 
>>> _()
True
>>> 


Bug fixes

  • 多段ネスト構造のdictをベースとしたMUオブジェクトにおいてgetメソッドで配下のMUオブジェクトを取り出すとdict型が返却されるバグの修正
  • クエリパラメータを指定して直接Scenarioを呼び出す場合とtestcaseでクエリパラメータを指定して呼び出す場合でcontext.request.pathの出力が一致しない問題の修正
  • [tickets/382] SQL.bulkUpsert関数を呼び出した後、対象ATOMのフィールド増減を行い再度bulkUpsertを呼び出した場合にエラーとなる問題の修正
  • 起動パラメータ--heartbeat_intervalの型誤りの修正

Modules

  • Python3.10系に対応(SQLAlchemy2.xは影響大のため見送り予定)
aiohttp==3.8.3
aiomysql==0.1.1
aiopg==1.3.5
psycopg2-binary==2.9.4
aioredis==2.0.1
aiosmtplib==2.0.0
aiofiles==22.1.0
async-timeout==4.0.2
aniso8601==9.0.1
asn1crypto==1.4.0
asyncssh==2.13.0
attrs==21.2.0
bcrypt==3.2.0
cffi==1.15.1
chardet==3.0.4
cryptography==3.4.8
Cython==0.29.32
graphene-sqlalchemy==3.0.0b2
hiredis==2.0.0
idna==3.2
Jinja2==3.1.2
jinja2schema==0.1.4
jsonschema==4.17.3
MarkupSafe==2.0.1
multidict==5.1.0
netmiko==4.1.2
paramiko==2.12.0
ply==3.11
promise==2.3
psutil==5.9.4
py-dateutil==2.2
pyasn1==0.4.8
pycparser==2.20
pycryptodome==3.16.0
pycryptodomex==3.16.0
pycurl==7.45.2
PyJWT==2.6.0
PyMySQL==1.0.2
PyNaCl==1.5.0
pyrsistent==0.18.0
pyserial==3.5
pysnmplib==5.0.20
pytz==2022.7
PyYAML==6.0
python-rapidjson==1.9
python-dateutil==2.8.2
redis==4.4.0
Rx==1.6.1
scp==0.14.4
singledispatch==3.7.0
six==1.16.0
SQLAlchemy==1.4.46
textfsm==1.1.2
tornado==6.2
uvloop==0.17.0
xmltodict==0.13.0
yarl==1.7.2
requests==2.28.1
line-profiler==4.0.2
rstr==3.2.0
prestring==0.9.0
autopep8==2.0.1
hashids==1.3.1
geopy==2.3.0
prometheus-client==0.15.0
tosca-parser==2.7.0
kubernetes-asyncio==24.2.2
gcloud-aio-auth==4.0.1
gcloud-aio-pubsub==5.1.1
flake8==6.0.0