GNU socialのバージョンアップ v1.20.9release→v2.0.0beta0
2021年7月頃にGNU social v2.0.0beta0がリリースされている。こちらのバージョンだとActivityPubの対応がかなりできているらしいので、<https://social.senooken.jp/senooken> のバージョンアップを試みる。
せっかくなので、今後のために手順を記しておく。
- 現在のコミット: 08145f635f8cf856fd66d9e29281b0c8ca3390a2
- 切替先: v2.0.0beta0 (6e031d623a67c512c9e60e1cd939dd50d6ffce1a)
- URL: https://notabug.org/diogo/gnu-social
v1.20.9release相当からv2.0.0betaへのバージョンアップとなるが、バグ対応で作業していたので、v1.20.9releaseとは少し違うので注意する。
まず、レンタルサーバーの管理画面からDBをバックアップしておく。
続いて、.htaccess
の1行目に以下を記載してアクセスを禁止する。
deny from all
まず、eventのネームスペースが重複しているバグに対応するためにパッチをいろいろあてているので、これを退避させてリセットする。
git diff >pre-v2.patch
git reset --hard
リポジトリ―から更新データを取得する。
git fetch --tags --depth 100
git checkout v2.0.0beta0
続いて、切り替え後のバージョンアップ処理を行う。
php scripts/upgrade.php
一回だとサーバーにプロセスを強制終了されて終わらないので、何回かに分ける。main関数内の関数単位で処理されているので、処理が終わったところをコメントアウトして最後まで通す。
これで完了だ。冒頭に行った.htaccess
の記載をコメントアウトしてアクセスしてみる。
<https://social.senooken.jp/senooken> にアクセスすると以下のエラーが表示された。
[Notice] DB_DataObject error []: MDB2 Error: syntax error
これだけだと意味不明なのでデバッグする。
config.php
に以下の設定を追記してデバッグを有効にして同じ画面に再度アクセスする。
$config['db']['debug'] = true;
以下のSQLが問題だったようだ。
Notice: Query Error: [mdb2_error: message="MDB2 Error: syntax error" code=-2 mode=return level=notice prefix="" info="_doQuery: [Error message: Could not execute statement] [Last executed query: SELECT `notice`.* FROM `notice` INNER JOIN JSON_TABLE( JSON_ARRAY(4403075,4402098,4402080,4402001,4401997,4401932,4401539,4401227,4401081,4400355,4400345,4400338,4400285,4400281,4400192,4399883,4399830,4399153,4398902,4397843,4397836), '$[*]' COLUMNS ( id INTEGER PATH '$', id_pos FOR ORDINALITY ) ) AS `notice_vals` USING (id) WHERE ( `notice`.id IS NOT NULL ) ORDER BY `notice_vals`.id_pos ]
おそらく、以前議論したこのissueの問題が発生している。MariaDBの新しいバージョンで用意されたSQL構文 (JSON_TABLE
) を使っており、手元のレンタルサーバーのMySQLのバージョンがv5.7と古くて、構文エラーになっている。issueにも掲載している手元で用意したパッチを適用してみる。
patch -p 1 <<-"EOT"
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 0d22eb8628..d71afed57c 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -98,9 +98,18 @@ class Memcached_DataObject extends Safe_DataObject
$db_type = common_config('db', 'type');
if ($db_type === 'mysql') {
$tmp_obj = new $cls();
- $tmp_obj->query('SELECT 0 /*M! + 1 */ AS is_mariadb;');
- if ($tmp_obj->fetch() && $tmp_obj->is_mariadb) {
- $db_type = 'mariadb';
+ $tmp_obj->query(
+ <<<'END'
+ SELECT 0 /*M! + 1 */ AS is_mariadb,
+ (0 /*!80001 + 1 */ /*M!100303 + 1 */) = 0 AS is_old_mysql;
+ END
+ );
+ if ($tmp_obj->fetch()) {
+ if ($tmp_obj->is_old_mysql) {
+ $db_type = 'old_mysql';
+ } elseif ($tmp_obj->is_mariadb) {
+ $db_type = 'mariadb';
+ }
}
}
@@ -114,11 +123,17 @@ class Memcached_DataObject extends Safe_DataObject
} else {
$val_escaped = "'{$obj->escape($val)}'";
}
- if ($db_type !== 'mariadb') {
- $vals_escaped[] = $val_escaped;
+ if ($db_type === 'mariadb') {
+ $vals_escaped[] = "({$val_escaped},{$i})";
+ } elseif ($db_type === 'old_mysql') {
+ if ($i == 0) {
+ $vals_escaped[] = "SELECT {$val_escaped} AS {$keyCol}, "
+ . "{$i} AS {$keyCol}_pos";
+ } else {
+ $vals_escaped[] = "SELECT {$val_escaped},{$i}";
+ }
} else {
- // A completely different approach for MariaDB (see below)
- $vals_escaped[] = "({$val_escaped},{$i})";
+ $vals_escaped[] = $val_escaped;
}
}
@@ -161,6 +176,17 @@ class Memcached_DataObject extends Safe_DataObject
implode(',', $vals_escaped)
);
break;
+ case 'old_mysql':
+ // Delivers an empty set
+ if (count($vals_escaped) == 0) {
+ $vals_escaped[] = "SELECT NULL AS {$keyCol}, "
+ . "0 AS {$keyCol}_pos LIMIT 0";
+ }
+ $obj->_join = "\n" . sprintf(
+ "RIGHT JOIN (%s) AS {$join_tablename} USING ({$keyCol})",
+ implode(' UNION ALL ', $vals_escaped)
+ );
+ break;
case 'mysql':
default:
$obj->_join = "\n" . sprintf(
EOT
これでひとまず動作した。
eventのネームスペースが被っている点の対応を復元していないが、これが問題になるのはインストール時などなので、特に問題なかった。またどこかで問題が起こるかもしれない。
Mastodon v3.4.6 (https://mstdn.jp/@senooken) と通信がうまくできた。そのほか、Misskeyとは通信ができなかった。ただ、Mastodonと通信ができるようになったのは大きい。
ホーム画面末尾にバージョン番号の表示などのフッターが表示されていなかったり、怪しい挙動はいくつかある。ひとまずこれで様子を見る。