# TSO のアサインメント：プロセス

![`smart`](TSOAssignmentProcess_aa_002_20220509.png)

------------------------------------------------------------------------------
TiDBサーバー内のPD Clientスレッドは、PD（Placement Driver）サービスとのすべての通信を処理します。このモジュールは、PDから一括してTSO（Timestamp Oracle）を取得する責任があります。プロセスは次のように動作します。

1. トランザクション（TSO Requester）が TSO をリクエストする必要がある場合、そのリクエストは PD Clientモジュールに送信され、リクエスターに tsFuture オブジェクトが即座に返されます。
2. リクエスターは、tsFutureオブジェクトをキャッシュし、SQLのパースとコンパイルの実行を開始します。これが完了したら、リクエスターはtsFutureオブジェクトのwaitメソッドを呼び出して、TSOが返されるのを待ちます。
3. 一方で、PD ClientはgRPCを介してPD（Placement Driver）サービスからTSOを非同期に取得します。このリクエストは、TSOリクエストごとに1回だけ送信されるのではなく、非常に短い時間内に大量のリクエストが同時に到着した場合にはバッチリクエストが送信されます。TSOリクエストが長い時間にわたって受信された場合は、リクエストがPDに1つずつ送信されます。
4. PD ClientがPDからTSOを受け取ったら、そのTSOを対応するリクエスターに返すよう試みます。もしリクエスターがこの時waitメソッドを呼び出していた場合、TSOを受け取ることになります。そうでなければ、tsFutureオブジェクトがシグナルされるまで待つことになります。

要するに、TSO の割り当ては TiDB クラスタ内の非同期プロセスです。
