dumb shelve backend fails when no environment variables were stored
In order to reproduce it:
- Start fresh Sardana (or MacroServer) server.
- Stop the server without storing any environment variables.
- Start the server again.
In the server logs from point 3 we can observe:
MainThread ERROR 2020-10-01 21:47:27,461 MS_dumb_1.EnvironmentManager: Failed to access environment in /tmp/tango/Sardana/dumb/macroserver.properties
MainThread DEBUG 2020-10-01 21:47:27,461 MS_dumb_1.EnvironmentManager: Details:
Traceback (most recent call last):
File "/home/zreszela/workspace/sardana/src/sardana/macroserver/msenvmanager.py", line 148, in setEnvironmentDb
self._env = shelve.open(f_name, flag='w', writeback=False)
File "/usr/lib/python3.5/shelve.py", line 243, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/lib/python3.5/shelve.py", line 227, in __init__
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
File "/usr/lib/python3.5/dbm/__init__.py", line 85, in open
raise error[0]("need 'c' or 'n' flag to open new db")
dbm.error: need 'c' or 'n' flag to open new db
MainThread ERROR 2020-10-01 21:47:27,509 MacroServer/dumb/1: Failed to set environment DB to /tmp/tango/Sardana/dumb/macroserver.properties
MainThread DEBUG 2020-10-01 21:47:27,509 MacroServer/dumb/1: Details:
Traceback (most recent call last):
File "/home/zreszela/workspace/sardana/src/sardana/tango/macroserver/MacroServer.py", line 99, in init_device
macro_server.set_environment_db(self.EnvironmentDb)
File "/home/zreszela/workspace/sardana/src/sardana/macroserver/macroserver.py", line 185, in set_environment_db
self.environment_manager.setEnvironmentDb(environment_db)
File "/home/zreszela/workspace/sardana/src/sardana/macroserver/msenvmanager.py", line 148, in setEnvironmentDb
self._env = shelve.open(f_name, flag='w', writeback=False)
File "/usr/lib/python3.5/shelve.py", line 243, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/lib/python3.5/shelve.py", line 227, in __init__
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
File "/usr/lib/python3.5/dbm/__init__.py", line 85, in open
raise error[0]("need 'c' or 'n' flag to open new db")
dbm.error: need 'c' or 'n' flag to open new db
This works perfectly with gdbm
backend is used (on Debian install python3-gdbm).
To workaround, simply created a dummy environment variabled before point 2.