As an experiment I tried hooking up Calibre-server to a Google Cloud Storage bucket using GCSFuse. Probably not the best idea to hook up Calibre to a high-latency storage bucket, but I wanted to see if it would work.
It seems fairly fine, except I can't add books. It returns a 500 error and I get this traceback message on the server pointing to issues writing to the sqlite db holding the library.
How do I trace and diagnose this issue to see whether it's a Calibre issue, an Sqlite library issue, a GCSFuse issue, or something else?
this is with calibre 3.21 and gcsfuse 0.23.0
Code:
Unhandled exception in state: State: _job_done Client: 127.0.0.1:52764 Request: POST /cdb/add-book/1/y/[book filename]/calibre HTTP/1.0
Traceback (most recent call last):
File "/usr/lib/calibre/calibre/srv/loop.py", line 569, in tick
conn.handle_event(event)
File "/usr/lib/calibre/calibre/srv/loop.py", line 307, in _job_done
self.job_done(*event)
File "/usr/lib/calibre/calibre/srv/pool.py", line 35, in run
result = func()
File "/usr/lib/calibre/calibre/srv/http_response.py", line 441, in run_request_handler
result = self.request_handler(data)
File "/usr/lib/calibre/calibre/srv/routes.py", line 313, in dispatch
ans = endpoint_(self.ctx, data, *args)
File "/usr/lib/calibre/calibre/srv/cdb.py", line 92, in cdb_add_book
ids, duplicates = db.add_books([(mi, {fmt: rd.request_body_file})], add_duplicates=add_duplicates)
File "/usr/lib/calibre/calibre/db/cache.py", line 1596, in add_books
book_id = self.create_book_entry(mi, add_duplicates=add_duplicates, apply_import_tags=apply_import_tags, preserve_uuid=preserve_uuid)
File "/usr/lib/calibre/calibre/db/cache.py", line 63, in call_func_with_lock
return func(*args, **kwargs)
File "/usr/lib/calibre/calibre/db/cache.py", line 1566, in create_book_entry
self._set_metadata(book_id, mi, ignore_errors=True)
File "/usr/lib/calibre/calibre/db/cache.py", line 1276, in set_metadata
set_field('title', mi.title)
File "/usr/lib/calibre/calibre/db/cache.py", line 1271, in set_field
dirtied.update(self._set_field(name, {book_id:val}, do_path_update=False, allow_case_change=allow_case_change))
File "/usr/lib/calibre/calibre/db/cache.py", line 1101, in set_field
self._mark_as_dirty(dirtied)
File "/usr/lib/calibre/calibre/db/cache.py", line 1045, in mark_as_dirty
((x,) for x in new_dirtied))
File "/usr/lib/calibre/calibre/db/backend.py", line 863, in executemany
self.reopen(force=True)
File "/usr/lib/calibre/calibre/db/backend.py", line 1082, in reopen
self.conn
File "/usr/lib/calibre/calibre/db/backend.py", line 836, in conn
self._conn = Connection(self.dbpath)
File "/usr/lib/calibre/calibre/db/backend.py", line 270, in __init__
self.execute('pragma cache_size=-5000')
File "/usr/lib/calibre/calibre/db/backend.py", line 314, in execute
return cursor.execute(sql, bindings)
File "src/cursor.c", line 1019, in APSWCursor_execute.sqlite3_prepare
File "src/statementcache.c", line 386, in sqlite3_prepare
IOError: IOError: disk I/O error