diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index 9f78f3f9bd..b846081d49 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -45,6 +45,9 @@ class DataStore(RoomMemberStore, RoomStore,
self.event_factory = hs.get_event_factory()
self.hs = hs
+ self.min_token_deferred = self._get_min_token()
+ self.min_token = None
+
@defer.inlineCallbacks
def persist_event(self, event, backfilled=False):
if event.type == RoomMemberEvent.TYPE:
@@ -82,7 +85,7 @@ class DataStore(RoomMemberStore, RoomStore,
@defer.inlineCallbacks
def _store_event(self, event, backfilled):
# FIXME (erikj): This should be removed when we start amalgamating
- # event and pdu storage.
+ # event and pdu storage
yield self.hs.get_federation().fill_out_prev_events(event)
vals = {
@@ -95,7 +98,10 @@ class DataStore(RoomMemberStore, RoomStore,
}
if backfilled:
- vals["token_ordering"] = "-1"
+ if not self.min_token_deferred.called:
+ yield self.min_token_deferred
+ self.min_token -= 1
+ vals["token_ordering"] = self.min_token
unrec = {
k: v
@@ -151,6 +157,17 @@ class DataStore(RoomMemberStore, RoomStore,
defer.returnValue([self._parse_event_from_row(r) for r in results])
+ @defer.inlineCallbacks
+ def _get_min_token(self):
+ row = yield self._execute(
+ None,
+ "SELECT MIN(token_ordering) FROM events"
+ )
+
+ self.min_token = rows[0][0] if rows and rows[0] else 0
+
+ defer.returnValue(self.min_token)
+
def schema_path(schema):
""" Get a filesystem path for the named database schema
diff --git a/synapse/storage/schema/im.sql b/synapse/storage/schema/im.sql
index b0240e39af..0fb3dbee55 100644
--- a/synapse/storage/schema/im.sql
+++ b/synapse/storage/schema/im.sql
@@ -14,7 +14,7 @@
*/
CREATE TABLE IF NOT EXISTS events(
- token_ordering INTEGER AUTOINCREMENT,
+ token_ordering INTEGER PRIMARY KEY AUTOINCREMENT,
topological_ordering INTEGER NOT NULL,
event_id TEXT NOT NULL,
type TEXT NOT NULL,
diff --git a/tests/rest/test_presence.py b/tests/rest/test_presence.py
index 91d4d1ff6c..99287823e4 100644
--- a/tests/rest/test_presence.py
+++ b/tests/rest/test_presence.py
@@ -51,6 +51,7 @@ class PresenceStateTestCase(unittest.TestCase):
hs = HomeServer("test",
db_pool=None,
http_client=None,
+ datastore=None,
resource_for_client=self.mock_server,
resource_for_federation=self.mock_server,
)
@@ -109,6 +110,7 @@ class PresenceListTestCase(unittest.TestCase):
hs = HomeServer("test",
db_pool=None,
http_client=None,
+ datastore=None,
resource_for_client=self.mock_server,
resource_for_federation=self.mock_server
)
diff --git a/tests/rest/test_profile.py b/tests/rest/test_profile.py
index ff1e92805e..ee47daf4c2 100644
--- a/tests/rest/test_profile.py
+++ b/tests/rest/test_profile.py
@@ -46,6 +46,7 @@ class ProfileTestCase(unittest.TestCase):
resource_for_client=self.mock_server,
federation=Mock(),
replication_layer=Mock(),
+ datastore=None,
)
def _get_user_by_token(token=None):
|