Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #4437 from matrix-org/erikj/event_format_version_v2
Browse files Browse the repository at this point in the history
Add support for persisting event format versions
  • Loading branch information
erikjohnston authored Jan 24, 2019
2 parents 50c396a + c5a125b commit 664b7a2
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog.d/4437.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add infrastructure to support different event formats
13 changes: 13 additions & 0 deletions synapse/api/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,19 @@ class RoomVersions(object):
RoomVersions.STATE_V2_TEST,
}


class EventFormatVersions(object):
"""This is an internal enum for tracking the version of the event format,
independently from the room version.
"""
V1 = 1


KNOWN_EVENT_FORMAT_VERSIONS = {
EventFormatVersions.V1,
}


ServerNoticeMsgType = "m.server_notice"
ServerNoticeLimitReached = "m.server_notice.usage_limit_reached"

Expand Down
3 changes: 3 additions & 0 deletions synapse/events/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import six

from synapse.api.constants import EventFormatVersions
from synapse.util.caches import intern_dict
from synapse.util.frozenutils import freeze

Expand Down Expand Up @@ -179,6 +180,8 @@ def auth_event_ids(self):


class FrozenEvent(EventBase):
format_version = EventFormatVersions.V1 # All events of this type are V1

def __init__(self, event_dict, internal_metadata_dict={}, rejected_reason=None):
event_dict = dict(event_dict)

Expand Down
1 change: 1 addition & 0 deletions synapse/storage/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -1268,6 +1268,7 @@ def event_dict(event):
event.internal_metadata.get_dict()
),
"json": encode_json(event_dict(event)),
"format_version": event.format_version,
}
for event, _ in events_and_contexts
],
Expand Down
19 changes: 15 additions & 4 deletions synapse/storage/events_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@

from twisted.internet import defer

from synapse.api.constants import EventFormatVersions
from synapse.api.errors import NotFoundError
# these are only included to make the type annotations work
from synapse.events import EventBase # noqa: F401
from synapse.events import FrozenEvent
# these are only included to make the type annotations work
from synapse.events.snapshot import EventContext # noqa: F401
from synapse.events.utils import prune_event
from synapse.metrics.background_process_metrics import run_as_background_process
Expand Down Expand Up @@ -353,6 +353,7 @@ def _enqueue_events(self, events, check_redacted=True, allow_rejected=False):
self._get_event_from_row,
row["internal_metadata"], row["json"], row["redacts"],
rejected_reason=row["rejects"],
format_version=row["format_version"],
)
for row in rows
],
Expand All @@ -377,6 +378,7 @@ def _fetch_event_rows(self, txn, events):
" e.event_id as event_id, "
" e.internal_metadata,"
" e.json,"
" e.format_version, "
" r.redacts as redacts,"
" rej.event_id as rejects "
" FROM event_json as e"
Expand All @@ -392,7 +394,7 @@ def _fetch_event_rows(self, txn, events):

@defer.inlineCallbacks
def _get_event_from_row(self, internal_metadata, js, redacted,
rejected_reason=None):
format_version, rejected_reason=None):
with Measure(self._clock, "_get_event_from_row"):
d = json.loads(js)
internal_metadata = json.loads(internal_metadata)
Expand All @@ -405,8 +407,17 @@ def _get_event_from_row(self, internal_metadata, js, redacted,
desc="_get_event_from_row_rejected_reason",
)

if format_version is None:
# This means that we stored the event before we had the concept
# of a event format version, so it must be a V1 event.
format_version = EventFormatVersions.V1

# TODO: When we implement new event formats we'll need to use a
# different event python type
assert format_version == EventFormatVersions.V1

original_ev = FrozenEvent(
d,
event_dict=d,
internal_metadata_dict=internal_metadata,
rejected_reason=rejected_reason,
)
Expand Down
16 changes: 16 additions & 0 deletions synapse/storage/schema/delta/53/event_format_version.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

ALTER TABLE event_json ADD COLUMN format_version INTEGER;

0 comments on commit 664b7a2

Please sign in to comment.