apache / apache/cloudstack

CreateSharedFileSystem NPE ("template is null") when zone has mixed hypervisor types

オープン
#13,825 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
component:management-server type:bug
主要言語
Java
スター
3.1k
フォーク
1.4k
平均マージ
6日 19時間
マージ済み PR(30日)
32

説明

## Bug: `CreateSharedFileSystem` throws NPE ("template is null") when a zone has more than one hypervisor type

**Component:** `plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java`
**Affected versions:** 4.22.1.0 (confirmed present on `main` as of 2026-08-06 — same code, unrelated to the two unrelated API-signature diffs between `main` and `4.22.1.0` in this file)

### Summary

`createSharedFileSystem` fails immediately with:

```
java.lang.NullPointerException: Cannot invoke "com.cloud.storage.VMTemplateVO.getId()" because "template" is null
```

on any zone that has **more than one hypervisor type**, where at least one of those hypervisor types has no system VM template available (e.g. an `External`/MaaS cluster alongside a `KVM` cluster in the same zone).

### Root cause

In `deploySharedFSVM()`:

```java
List hypervisors = resourceMgr.getSupportedHypervisorTypes(zoneId, false, null);
if (hypervisors.size() > 0) {
Collections.shuffle(hypervisors);
} ...

for (final Iterator iter = hypervisors.iterator(); iter.hasNext();) {
final Hypervisor.HypervisorType hypervisor = iter.next();
VMTemplateVO template = templateDao.findSystemVMReadyTemplate(zoneId, hypervisor, preferredArchitecture);
if (template == null && !iter.hasNext()) {
throw new CloudRuntimeException(...);
}
LaunchPermissionVO existingPermission = launchPermissionDao.findByTemplateAndAccount(template.getId(), owner.getId());
...
```

The hypervisor list is **shuffled**, and the null-check only throws when the *current* hypervisor is the *last* one in the iteration (`!iter.hasNext()`). If `template` is `null` for a hypervisor that is **not** last in the (randomized) order — e.g. `External`, which has no CloudStack system VM template by design — the code falls through to `template.getId()` on the same iteration instead of `continue`-ing to the next hypervisor. This crashes before ever reaching a hypervisor (e.g. `KVM`) that does have a valid, `Ready` system VM template.

Because the list is shuffled, this is intermittent: the call succeeds whenever the working hypervisor happens to be drawn first, and fails whenever a hypervisor with no system VM template is drawn first with more entries still pending.

### Reproduction

1. Zone with two clusters of different hypervisor types, one of which has no system VM template registered (e.g. `KVM` + `External`/MaaS).
2. Call `createSharedFileSystem` repeatedly.
3. Observe intermittent NPE vs. success depending on shuffle order, even though the working hypervisor's system VM template is verified `Active` / `Ready` / fully downloaded in the DB (`vm_template`, `template_zone_ref`, `template_store_ref`).

### Impact

Any deployment mixing hypervisor types within one zone (common with hybrid KVM + MaaS/External or KVM + VMware setups) can hit this nondeterministically for every Shared FileSystem creation attempt, with no workaround short of isolating hypervisor types into separate zones.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まずマージ済みの pull request #13830 を確認し、次に plugins/storage/sharedfs/storagevm/src/main/java/org/apache/cloudstack/storage/sharedfs/lifecycle/StorageVmSharedFSLifeCycle.java の deploySharedFSVM を調査します。異なるハイパーバイザー種別を混在させて createSharedFileSystem を再現し、テンプレートがない場合でも NPE が発生しなくなり、有効な system VM テンプレートを選択できることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
backend, infrastructure
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。