Skip to content

Run reapplyStyle() for raster layers under the controller lock - #17

Merged
wf9a5m75 merged 1 commit into
developfrom
fix/reapply-style-under-lock
Oct 29, 2026
Merged

wf9a5m75 merged 1 commit into
developfrom
fix/reapply-style-under-lock

Conversation

@wf9a5m75

Copy link
Copy Markdown
Contributor

react-sdk の MapConductor/js-sdk-core#15 と同じ修正の Android 版です。プロバイダ側の PR(android-for-maplibre / android-for-mapbox / android-for-mappls)がこれに依存するので、こちらを先にマージしてください。

不具合(いまは起きない)

android-for-maplibre / android-for-mapbox / android-for-mappls の RasterLayerController.reapplyStyle() は、ロックの外で manager を読み、renderer.onAdd() で貼り直したあと、読んだ状態で entity を登録し直していた。

add / update の途中(renderer.onChange() の後、registerEntity() の前)にこれが入ると:

  • 古いソースや不透明度で貼り直す
  • manager の新しい状態を古い状態で上書きする
  • clear() の途中なら、消したレイヤを戻す

ただし、Android ではいまのところ起きない。どのプロバイダの renderer も onAdd / onChange / onRemove の中で中断しない(withContext も delay も無い)。また、すべて Dispatchers.Main で動く。そのため、この隙間に別の処理が入る余地が無い。renderer に中断点が一つでも入れば起きるので、先に塞いでおく。

修正

  • reapplyStyle() を RasterLayerController に移し、add / update / upsert / clear と同じ semaphore の中で動かす
  • entity の登録はし直さない。3 プロバイダのハンドルはどれもレイヤ ID から作る data class なので、登録済みのものが新しいスタイルでもそのまま使える
  • api/android-sdk-core.api に reapplyStyle() を追加した

確認

  • 追加した RasterLayerReapplyStyleTest:5 件すべて通る
    • renderer を onChange / onRemove の中で止めて、その間に reapplyStyle() を始めるもの 4 件(ソースの差し替え、不透明度、add による差し替え、clear)
    • entity を登録し直さないことを見るもの 1 件
  • ロックを外し、登録し直す元の reapplyStyle() では、5 件とも失敗する
  • :android-sdk-core:testDebugUnitTest:292 件すべて通る
  • :android-sdk-core:apiCheck が通る。ktlintCheck は、今回触っていないファイルの既存の指摘だけで、追加・変更した部分には指摘が無い

The providers' reapplyStyle() read the manager outside the lock, and then
registered what they read again. A change between renderer.onChange() and
registerEntity() would be re-applied with its old source or opacity, and could
be overwritten by it in the manager. react-sdk hit this
(MapConductor/js-sdk-core#15). Android's renderers do not suspend in that
window today, so it cannot happen yet; this closes it before one does.

reapplyStyle() moves here, under the same lock as add/update/upsert/clear,
and no longer registers the entities again: the handles are built from the
layer id.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant