# 画面設計書 40-DCDサーバー再起動（served/restartServer）

## 概要

本ドキュメントは、serve-d LSPサーバーが提供する `served/restartServer` リクエストハンドラの画面設計書である。全てのDCDサーバーインスタンスを再起動する機能を定義する。

### 本画面の処理概要

本機能は、serve-dが管理する全てのDCDサーバーインスタンスを再起動し、完了後にtrueを返却する。

**業務上の目的・背景**：DCDサーバーは長時間動作するデーモンプロセスであり、メモリリーク等により不安定になったり、設定変更後に再起動が必要になったりする場合がある。また、DCD起動失敗通知（No.9）の後にユーザーが再起動を試みるケースもある。本機能はエディタのコマンドパレット等から全DCDサーバーを一括再起動することで、手動での個別再起動の手間を省き、開発作業を中断させることなくDCDの状態をリフレッシュする。

**画面へのアクセス方法**：エディタのコマンドパレットまたはカスタムコマンドから `served/restartServer` リクエストを送信する。DCD起動失敗通知の後にも呼び出される可能性がある。

**主要な操作・処理内容**：
1. クライアントから `served/restartServer` リクエストを受信する
2. 全バックエンドインスタンスを走査する
3. 各インスタンスについてDCDComponentが存在するか確認する
4. DCDComponentが存在する場合、`restartServer` メソッドを呼び出す（非同期Future）
5. 全てのFutureの完了を `joinAll` で待機する
6. 完了後に `true` を返却する

**画面遷移**：本機能から直接の画面遷移はない。DCD起動失敗通知（No.9）からの遷移が想定される。

**権限による表示制御**：特別な権限制御はない。DCDComponentが存在するインスタンスのみが対象となる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 61 | DCDサーバー再起動 (served/restartServer) | 主機能 | 全DCDサーバーインスタンスを再起動する |

## 画面種別

LSPリクエスト・レスポンス（サーバー管理操作）

## URL/ルーティング

LSPメソッド: `served/restartServer`

## 入出力項目

### 入力

パラメータなし。

### 出力（レスポンス）

| 項目名 | 型 | 説明 |
|--------|------|------|
| (返り値) | bool | 再起動完了を示す `true` |

## 表示項目

| 表示項目 | 説明 |
|----------|------|
| なし | 本機能はバックグラウンド処理であり、直接的なUI表示はない |

## イベント仕様

### 1-restartServerリクエスト

1. `restartServer()` 関数が呼び出される
2. `Future!void[]` 配列を初期化
3. `backend.instances` で全インスタンスをループ
4. 各インスタンスについて `instance.has!DCDComponent` でDCD存在確認
5. DCDComponent存在時：`instance.get!DCDComponent.restartServer()` を呼び出してFutureを配列に追加
6. `joinAll(fut)` で全Futureの完了を待機
7. `true` を返却

## データベース更新仕様

### 操作別データベース影響一覧

本機能はデータベースへの更新を行わない。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| restartServer | DCDプロセス | RESTART | DCDサーバーの停止→起動 |

## メッセージ仕様

| メッセージ種別 | 条件 | メッセージ内容 |
|---------------|------|---------------|
| なし | - | 本機能は独自のメッセージ通知を行わない |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| DCDComponentが存在しないインスタンス | スキップ（再起動対象外） |
| 再起動失敗 | DCDComponent内部で処理（本関数ではキャッチしない） |

## 備考

- 非同期処理：各DCDサーバーの再起動はFuture（非同期タスク）として並行実行され、`joinAll` で全完了を待つ
- 全インスタンスが対象：ワークスペース毎に独立したDCDサーバーが動作している場合、全て再起動される
- 同ファイル（complete.d）には `killServer`（停止のみ）も定義されており、再起動と停止は別の機能として提供されている
- `restartServer` はリクエスト（応答あり）、`killServer` は通知（応答なし）として実装されている
- 処理は比較的シンプルで、全10行以内で完結している

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | complete.d | `source/served/commands/complete.d` | DCDComponent型の役割（workspacedのコード補完コンポーネント） |
| 1-2 | complete.d | `source/served/commands/complete.d` | Future!void型（非同期タスクの完了待機に使用） |

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | complete.d | `source/served/commands/complete.d` | `restartServer` 関数（行1376-1385） |

**主要処理フロー**:
1. **行1376**: `@protocolMethod("served/restartServer")` でLSPメソッドとして登録
2. **行1379**: `Future!void[]` 配列初期化
3. **行1380**: `backend.instances` で全インスタンスループ
4. **行1381**: DCDComponent存在確認
5. **行1382**: `restartServer()` 呼び出し、Futureを配列に追加
6. **行1383**: `joinAll(fut)` で全完了待機
7. **行1384**: `true` 返却

#### Step 3: 関連するkillServer機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | complete.d | `source/served/commands/complete.d` | `killServer` 関数（行1388-1394）。停止のみの通知ハンドラ |

**主要処理フロー**:
- **行1388**: `@protocolNotification("served/killServer")` で通知として登録
- **行1391-1393**: 全インスタンスの `killServer()` を同期的に呼び出し

### プログラム呼び出し階層図

```
restartServer (complete.d:1377)
    |
    +-- backend.instances ループ
    |   |
    |   +-- instance.has!DCDComponent 確認
    |   |
    |   +-- instance.get!DCDComponent.restartServer() (非同期)
    |       |
    |       +-- DCDサーバー停止
    |       +-- DCDサーバー起動
    |
    +-- joinAll(fut) 全完了待機
    |
    +-- return true
```

### データフロー図

```
[入力]                      [処理]                           [出力]

served/restartServer  --->  restartServer関数          --->  true (bool)
(パラメータなし)              |
                             +-- 全インスタンス走査
                             +-- DCDComponent確認
                             +-- restartServer (非同期)
                             +-- joinAll (全完了待機)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| complete.d | `source/served/commands/complete.d` | ソース | restartServer関数（行1376-1385）、killServer関数（行1388-1394） |
| extension.d | `source/served/extension.d` | ソース | backend グローバル変数 |
| types.d | `source/served/types.d` | ソース | LSP型定義 |
| fibermanager.d | `source/served/utils/fibermanager.d` | ソース | joinAll関数の定義 |
