misskey icon indicating copy to clipboard operation
misskey copied to clipboard

ドライブが開かないユーザーがいる

Open fruitriin opened this issue 1 year ago • 9 comments

💡 Summary

色々な条件が重なるとuserId, folderId, id のIndexが採用されず、idのPK Indexが採用された結果タイムアウトするらしい

具体的には、ドライブのレコード数が大量、直近の31件のファイルのアップロードがとても少ないことが条件っぽい? limit 31 で31件集めるのにタイムアウトする模様

🥰 Expected Behavior

狙ったIndexが採用される スクリーンショット 2024-07-15 18 57 42

🤬 Actual Behavior

misskey@misskeydb ERROR: canceling statement due to statement timeout
2024-07-15 06:40:16.410 UTC [3609383] misskey@misskeydb statement:
select
	"file"."id" as "file_id",
	"file"."userId" as "file_userId",
	"file".
"userHost" as "file_userHost",
	"file"."md5" as "file_md5",
	"file"."name" as "file_name",
	"file"."type" as "file_type",
	"file"."size" as "file_
size",
	"file"."comment" as "file_comment",
	"file"."blurhash" as "file_blurhash",
	"file"."properties" as "file_properties",
	"file"."storedInter
nal" as "file_storedInternal",
	"file"."url" as "file_url",
	"file"."thumbnailUrl" as "file_thumbnailUrl",
	"file"."webpublicUrl" as "file_webpub
licUrl",
	"file"."webpublicType" as "file_webpublicType",
	"file"."accessKey" as "file_accessKey",
	"file"."thumbnailAccessKey" as "file_thumbnai
lAccessKey",
	"file"."webpublicAccessKey" as "file_webpublicAccessKey",
	"file"."uri" as "file_uri",
	"file"."src" as "file_src",
	"file"."folderI
d" as "file_folderId",
	"file"."isSensitive" as "file_isSensitive",
	"file"."maybeSensitive" as "file_maybeSensitive",
	"file"."maybePorn" as "fi
le_maybePorn",
	"file"."isLink" as "file_isLink",
	"file"."requestHeaders" as "file_requestHeaders",
	"file"."requestIp" as "file_requestIp"
from
	"drive_file" "file"
where
	"file"."userId" = $1
	and "file"."folderId" is null
order by
	"file"."id" desc
limit 31

📝 Steps to Reproduce

explain 
select
	"file"."id" as "file_id",
	"file"."userId" as "file_userId",
	"file".
"userHost" as "file_userHost",
	"file"."md5" as "file_md5",
	"file"."name" as "file_name",
	"file"."type" as "file_type",
	"file"."size" as "file_size",
	"file"."comment" as "file_comment",
	"file"."blurhash" as "file_blurhash",
	"file"."properties" as "file_properties",
	"file"."storedInternal" as "file_storedInternal",
	"file"."url" as "file_url",
	"file"."thumbnailUrl" as "file_thumbnailUrl",
	"file"."webpublicUrl" as "file_webpublicUrl",
	"file"."webpublicType" as "file_webpublicType",
	"file"."accessKey" as "file_accessKey",
	"file"."thumbnailAccessKey" as "file_thumbnailAccessKey",
	"file"."webpublicAccessKey" as "file_webpublicAccessKey",
	"file"."uri" as "file_uri",
	"file"."src" as "file_src",
	"file"."folderId" as "file_folderId",
	"file"."isSensitive" as "file_isSensitive",
	"file"."maybeSensitive" as "file_maybeSensitive",
	"file"."maybePorn" as "file_maybePorn",
	"file"."isLink" as "file_isLink",
	"file"."requestHeaders" as "file_requestHeaders",
	"file"."requestIp" as "file_requestIp"
from
	"drive_file" "file"
where
	"file"."userId" = '9bcuu9u19o'
	and "file"."folderId" is null
order by
	"file"."id" desc
limit 31
Limit  (cost=0.43..5562.96 rows=31 width=1806)
  ->  Index Scan Backward using "PK_43ddaaaf18c9e68029b7cbb032e" on drive_file file  (cost=0.43..338238.08 rows=1885 width=1806)
        Filter: (("folderId" IS NULL) AND (("userId")::text = '9bcuu9u19o'::text))

PK_43ddaaaf18c9e68029b7cbb032e

これがIndexとして採用されている

💻 Frontend Environment

* Model and OS of the device(s):
* Browser:
* Server URL: 
* Misskey:

🛰 Backend Environment (for server admin)

https://misskey.systems/

* Installation Method or Hosting Service:
* Misskey:  2024.5.0 or later
* Node: v20.10.0
* PostgreSQL:  PostgreSQL 15.7 (Ubuntu 15.7-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit
* Redis:
* OS and Architecture:
MisskeySystems ~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 22.04.4 LTS
Release:	22.04
Codename:	jammy

Do you want to address this bug yourself?

  • [ ] Yes, I will patch the bug myself and send a pull request

fruitriin avatar Jul 15 '24 10:07 fruitriin

具体的には、ドライブのレコード数が大量、直近の31件のファイルのアップロードがとても少ないことが条件っぽい? limit 31 で31件集めるのにタイムアウトする模様

drive_fileは2176449 レコードある 対象ユーザーのドライブは1349件

直近のidはこれ(aidからタイムスタンプに戻すのめんど……)

9r5ejg4hha 9r5epghomv 9r5eqa3bn0 9r5es4iqnm 9r5f39i1sq 9r5f3rz6tg 9r5f7a3d0a 9r5f8x8e10 9r5fbm4j49 9r5ff7gv89 9r5fff1b8i 9r5fikj3ao 9r5fjyq9bj 9r5fk64dbk 9r5fmsfhgh 9r5fsrzul7 9r5fuqjtn4 9r5g4haj0w 9r5g52jc1c 9r5g7db932 9r5ga2al6m 9r5gajyg7r 9r5gdjbjd0 9r5ge8ppdo 9r5gf4fpf2 9r5gx0tu2k 9r5h5k60dq 9s1lo4k035 9s1ln6uw2w 9szbddkaab 9szbz1pyi7 9uktz7wanv 9ts2xala18 9tz3g1ydn2 9u3ma2nq2f 9u3mdikk7k 9v9abbjbzi 9v9b3gmu1t 9vaij5r6ox 9vaimb05rr 9vi620oumc 9vi623m5md 9vi63awyn6 9vi63clmn7 9vq799l17i

fruitriin avatar Jul 15 '24 10:07 fruitriin

limit文をコメントアウトすると IDX_860 〜が使われる スクリーンショット 2024-07-15 19 20 24

limit文があると PK_43ddaaが使われている スクリーンショット 2024-07-15 19 21 07

fruitriin avatar Jul 15 '24 10:07 fruitriin

なんか関連Issueあった気がするなぁなんだったかな 探してこよう

fruitriin avatar Jul 15 '24 10:07 fruitriin

aidからタイムスタンプに戻すのめんど……

https://github.com/misskey-dev/misskey-hub-next/issues/206

KisaragiEffective avatar Jul 15 '24 10:07 KisaragiEffective

なんか関連Issueあった気がする

#9864 ?

tamaina avatar Jul 15 '24 10:07 tamaina

ぐわーdrive_file.sql.zipが498MBあって添付できぬ

fruitriin avatar Jul 15 '24 10:07 fruitriin

同様の現象が kasei.skiでも発生していています。

発生しているのは1ユーザーで、そのユーザーのドライブをモデレーター権限で別の人が閲覧すると正常に閲覧できるのですが、DBではなくredisが何らかのクエリをキャッシュしているとかでしょうか…?

camilla-ett avatar Oct 09 '24 13:10 camilla-ett

モデレーターが見ると見ることができるのは、別のクエリだからインデックスが効いているのではないかと

fruitriin avatar Oct 09 '24 16:10 fruitriin

◽️Misskey側で対応されたらうれしいこと IS NULL になるwhere文はIndexがいつか効かなくなると思います folderIdもそうですが、hostがIS NULLなので爆発しがちの予感 NULL狙いのwhereはパフォーマンス的に問題がないという話とあるという話が両方インターネットで語られているのでよく精査する必要があります

◽️短期的な鯖缶の対応 その1 大量にあるレコードを減らすことで、検索が早くなります 現状、ドライブのテーブルはリモートからくる添付ファイルも全て格納されているので、想像よりもはるかにたくさんのレコードがあります (私のところではこのテーブルのなかで自分のサーバーのデータは1/10くらいでした)

これを削除すれば直りますが、これが消えているとノート側から画面上しれっと添付ファイルがないように見えるので微妙なとこです

◽️長期的鯖缶の対応 その2 パーティションを切れば私の予想では大丈夫なはずです 私は検討はしていますがまだやったことがありません

fruitriin avatar Oct 09 '24 17:10 fruitriin

folderIdもそうですが、hostがIS NULLなので爆発しがちの予感

folderId IS NULL -> ルードフォルダである host IS NULL -> リモートではない

…であるという意味で使われているようなので、それぞれに対応する意味を持つbooleanなカラムを持たせ、上記条件をSQLで判定するときはそのカラムを使うようにするという手段が必要かもしれません…?(isRootとか、isLocalとか)

まだ検証できていないのですが… b-treeの仕組みを考えると、NULLをあてにするよりもNOT NULLなbooleanの方がindexのヒット率が上がると考えています(もっと楽にやる方法があればそれでも)

samunohito avatar Nov 18 '24 22:11 samunohito