やるきなし

2022/09/05 08:00 / Mattermost 7.2 に upgrade すると DM が表示できない

Mattermost 7.2 に upgrade すると DM が表示できない(通常の channel や group message は表示できる).環境は以下.

Web appでも Desktop appでもだめで,Mobile appの場合は User を選択して,Send Message から DM を参照できる.

いろいろ探ってみたのだが API で /api/v4/users/me/teams/<team_id>/channels/categories (Sidebar 用の情報取得) を叩いた際に Direct Messages の Category が空になっていて,どうやら DM の Channel ID が取得できていない雰囲気.Mobile app でも確かに Sidebar 情報の DM の箇所が空になる.

直接 DM の Channel ID を指定して /api/v4/channels/<channel_id>/posts は,きちんと DM のやり取りを返すので,Channel (ID)まわりが怪しい.

Mattermost self-hosted changelog Release v7.2 - Feature Release によると 7.2 に upgrade する際に

ALTER TABLE Channels MODIFY COLUMN Type ENUM("D", "O", "G", "P");

するらしい.backup をとっていたので,upgrade 前後で Channels table を比較すると,Type column の値がもとは D O G P といった 1文字だったところが,空になっている.なお,型については以下の通り変更されていた.

なんだか ALTER コマンドがうまく変換してくれないらしい.Type が空なので,

の区別ができなくなって(https://github.com/mattermost/mattermost-server/blob/master/model/channel.go#L20),DM の Channel ID が取得できなかったものと思われる.Backup から適当に sql を作成して,Type カラムの値を復元したら直った.

全然だれもこのバグの報告を forum とかでしていなくて,known issue にもなっていなくて,実はだれも Debian で self-hosted で Mattermost を運用していないのかしらと思ったり思わなかったり(Slack が 9/1 から無料プランだと90日間しか履歴が見れなくなったので(以前は期限なしで,ただし,10,000件までだった),Mattermost も積極的にプレゼンスを上げようとしているはずなのだけど).

以下備忘.

file=`date +%Y%m%d%H%M`
mysqldump -u root -p<PW> --all-databases --events | xz > $file

のように backup をとっていた.以下みたいな箇所を切り出してきて(backup はこのように,一旦 Table を削除して,再度作り直す SQL になっている),

DROP TABLE IF EXISTS `Channels`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Channels` (
  `Id` varchar(26) NOT NULL,
  `CreateAt` bigint(20) DEFAULT NULL,
  `UpdateAt` bigint(20) DEFAULT NULL,
  `DeleteAt` bigint(20) DEFAULT NULL,
  `TeamId` varchar(26) DEFAULT NULL,
**snip**
) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `Channels`
--

LOCK TABLES `Channels` WRITE;
/*!40000 ALTER TABLE `Channels` DISABLE KEYS */;
INSERT INTO `Channels` VALUES (**snip**);
/*!40000 ALTER TABLE `Channels` ENABLE KEYS */;
UNLOCK TABLES;

CREATE TABLE の箇所は upgrade 後のものを,INSERT INTO `Channels` VALUES の箇所は upgrade 前のものを利用するようにして,それを適当に from_backup.sql とかのファイル名で保存して,あとは以下のように実行するのみ.もちろん Mattermost は停止しておく.

% mysql -u <mattermost_db username> -p<mattermost_db_password>
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2965
Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mattermost;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mattermost]> source from_backup.sql

なお,API 叩く(テストする)のに以下のような script を作っておくと便利(.token というファイルを用意しておいて Personal Access Tokens を入れておく).

#!/bin/sh
curl -H "Authorization: Bearer $(cat .token)" https://mattermost.example.org/$1 | jq

./a.sh だとして % ./a.sh /api/v4/users/me のように使う.GET しかできないけど,問題を追うにはこれで充分だった.

/api/v4 も書かせる仕様にしてあるのは,config.jsonLogSettingsFileLevelDEBUG にした際の mattermost.log に出力される API endpoint の表記が /api/v4 を含んでいたため.% tail -f mattermost.log | grep GET | sed 's,.*"url":"\([^"]*\)".*,\1,' とかで,どの API が叩かれているかを追っていた.

Related articles