Commit 095f166c authored by Kirill Smelkov's avatar Kirill Smelkov

XY Allow read-only access in BACKINGUP state (for now master-only & draft)

parent 67041723
...@@ -103,6 +103,7 @@ class Application(BaseApplication): ...@@ -103,6 +103,7 @@ class Application(BaseApplication):
self) self)
self.secondary_master_handler = secondary.SecondaryMasterHandler(self) self.secondary_master_handler = secondary.SecondaryMasterHandler(self)
self.client_service_handler = client.ClientServiceHandler(self) self.client_service_handler = client.ClientServiceHandler(self)
self.client_ro_service_handler = client.ClientROServiceHandler(self)
self.storage_service_handler = storage.StorageServiceHandler(self) self.storage_service_handler = storage.StorageServiceHandler(self)
registerLiveDebugger(on_log=self.log) registerLiveDebugger(on_log=self.log)
...@@ -418,7 +419,6 @@ class Application(BaseApplication): ...@@ -418,7 +419,6 @@ class Application(BaseApplication):
return return
# select the storage handler # select the storage handler
client_handler = self.client_service_handler
if state in (ClusterStates.RUNNING, ClusterStates.STARTING_BACKUP, if state in (ClusterStates.RUNNING, ClusterStates.STARTING_BACKUP,
ClusterStates.BACKINGUP, ClusterStates.STOPPING_BACKUP): ClusterStates.BACKINGUP, ClusterStates.STOPPING_BACKUP):
storage_handler = self.storage_service_handler storage_handler = self.storage_service_handler
...@@ -435,10 +435,13 @@ class Application(BaseApplication): ...@@ -435,10 +435,13 @@ class Application(BaseApplication):
conn = node.getConnection() conn = node.getConnection()
conn.notify(notification_packet) conn.notify(notification_packet)
if node.isClient(): if node.isClient():
if state != ClusterStates.RUNNING: if state == ClusterStates.RUNNING:
handler = self.client_service_handler
elif state == ClusterStates.BACKINGUP:
handler = self.client_ro_service_handler
else:
conn.abort() conn.abort()
continue continue
handler = client_handler
elif node.isStorage() and storage_handler: elif node.isStorage() and storage_handler:
handler = storage_handler handler = storage_handler
else: else:
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from neo.lib.protocol import NodeStates, Packets, ProtocolError, MAX_TID from neo.lib.protocol import NodeStates, Packets, ProtocolError, MAX_TID, NotReadyError
from . import MasterHandler from . import MasterHandler
class ClientServiceHandler(MasterHandler): class ClientServiceHandler(MasterHandler):
...@@ -118,3 +118,18 @@ class ClientServiceHandler(MasterHandler): ...@@ -118,3 +118,18 @@ class ClientServiceHandler(MasterHandler):
# BUG: The replicator may wait this transaction to be finished. # BUG: The replicator may wait this transaction to be finished.
self.app.tm.abort(tid, conn.getUUID()) self.app.tm.abort(tid, conn.getUUID())
# like ClientServiceHandler but read-only
class ClientROServiceHandler(ClientServiceHandler):
def _readOnly(self, *args, **kw): raise NotReadyError('read-only access')
askBeginTransaction = _readOnly
askNewOIDs = _readOnly
askFinishTransaction = _readOnly
askFinalTID = _readOnly
askPack = _readOnly
abortTransaction = _readOnly
# XXX also override askLastIDs to return backup_tid as last_tid ?
# XXX ----//---- askLastTransaction ?
...@@ -41,9 +41,12 @@ class IdentificationHandler(MasterHandler): ...@@ -41,9 +41,12 @@ class IdentificationHandler(MasterHandler):
state = NodeStates.RUNNING state = NodeStates.RUNNING
if node_type == NodeTypes.CLIENT: if node_type == NodeTypes.CLIENT:
if app.cluster_state != ClusterStates.RUNNING: if app.cluster_state == ClusterStates.RUNNING:
handler = app.client_service_handler
elif app.cluster_state == ClusterStates.BACKINGUP:
handler = app.client_ro_service_handler
else:
raise NotReadyError raise NotReadyError
handler = app.client_service_handler
human_readable_node_type = ' client ' human_readable_node_type = ' client '
elif node_type == NodeTypes.STORAGE: elif node_type == NodeTypes.STORAGE:
if app.cluster_state == ClusterStates.STOPPING_BACKUP: if app.cluster_state == ClusterStates.STOPPING_BACKUP:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment