mirror of
				https://github.com/matrix-org/synapse.git
				synced 2025-10-31 16:21:56 +01:00 
			
		
		
		
	Merge pull request #3072 from matrix-org/rav/fix_port_script
postgres port script: fix state_groups_pkey error
This commit is contained in:
		
						commit
						8844f95c32
					
				| @ -1,6 +1,7 @@ | ||||
| #!/usr/bin/env python | ||||
| # -*- coding: utf-8 -*- | ||||
| # Copyright 2015, 2016 OpenMarket Ltd | ||||
| # Copyright 2018 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. | ||||
| @ -250,6 +251,12 @@ class Porter(object): | ||||
|     @defer.inlineCallbacks | ||||
|     def handle_table(self, table, postgres_size, table_size, forward_chunk, | ||||
|                      backward_chunk): | ||||
|         logger.info( | ||||
|             "Table %s: %i/%i (rows %i-%i) already ported", | ||||
|             table, postgres_size, table_size, | ||||
|             backward_chunk+1, forward_chunk-1, | ||||
|         ) | ||||
| 
 | ||||
|         if not table_size: | ||||
|             return | ||||
| 
 | ||||
| @ -467,31 +474,10 @@ class Porter(object): | ||||
|             self.progress.set_state("Preparing PostgreSQL") | ||||
|             self.setup_db(postgres_config, postgres_engine) | ||||
| 
 | ||||
|             # Step 2. Get tables. | ||||
|             self.progress.set_state("Fetching tables") | ||||
|             sqlite_tables = yield self.sqlite_store._simple_select_onecol( | ||||
|                 table="sqlite_master", | ||||
|                 keyvalues={ | ||||
|                     "type": "table", | ||||
|                 }, | ||||
|                 retcol="name", | ||||
|             ) | ||||
| 
 | ||||
|             postgres_tables = yield self.postgres_store._simple_select_onecol( | ||||
|                 table="information_schema.tables", | ||||
|                 keyvalues={}, | ||||
|                 retcol="distinct table_name", | ||||
|             ) | ||||
| 
 | ||||
|             tables = set(sqlite_tables) & set(postgres_tables) | ||||
| 
 | ||||
|             self.progress.set_state("Creating tables") | ||||
| 
 | ||||
|             logger.info("Found %d tables", len(tables)) | ||||
| 
 | ||||
|             self.progress.set_state("Creating port tables") | ||||
|             def create_port_table(txn): | ||||
|                 txn.execute( | ||||
|                     "CREATE TABLE port_from_sqlite3 (" | ||||
|                     "CREATE TABLE IF NOT EXISTS port_from_sqlite3 (" | ||||
|                     " table_name varchar(100) NOT NULL UNIQUE," | ||||
|                     " forward_rowid bigint NOT NULL," | ||||
|                     " backward_rowid bigint NOT NULL" | ||||
| @ -517,18 +503,33 @@ class Porter(object): | ||||
|                     "alter_table", alter_table | ||||
|                 ) | ||||
|             except Exception as e: | ||||
|                 logger.info("Failed to create port table: %s", e) | ||||
|                 pass | ||||
| 
 | ||||
|             try: | ||||
|                 yield self.postgres_store.runInteraction( | ||||
|                     "create_port_table", create_port_table | ||||
|                 ) | ||||
|             except Exception as e: | ||||
|                 logger.info("Failed to create port table: %s", e) | ||||
|             yield self.postgres_store.runInteraction( | ||||
|                 "create_port_table", create_port_table | ||||
|             ) | ||||
| 
 | ||||
|             self.progress.set_state("Setting up") | ||||
|             # Step 2. Get tables. | ||||
|             self.progress.set_state("Fetching tables") | ||||
|             sqlite_tables = yield self.sqlite_store._simple_select_onecol( | ||||
|                 table="sqlite_master", | ||||
|                 keyvalues={ | ||||
|                     "type": "table", | ||||
|                 }, | ||||
|                 retcol="name", | ||||
|             ) | ||||
| 
 | ||||
|             # Set up tables. | ||||
|             postgres_tables = yield self.postgres_store._simple_select_onecol( | ||||
|                 table="information_schema.tables", | ||||
|                 keyvalues={}, | ||||
|                 retcol="distinct table_name", | ||||
|             ) | ||||
| 
 | ||||
|             tables = set(sqlite_tables) & set(postgres_tables) | ||||
|             logger.info("Found %d tables", len(tables)) | ||||
| 
 | ||||
|             # Step 3. Figure out what still needs copying | ||||
|             self.progress.set_state("Checking on port progress") | ||||
|             setup_res = yield defer.gatherResults( | ||||
|                 [ | ||||
|                     self.setup_table(table) | ||||
| @ -539,7 +540,8 @@ class Porter(object): | ||||
|                 consumeErrors=True, | ||||
|             ) | ||||
| 
 | ||||
|             # Process tables. | ||||
|             # Step 4. Do the copying. | ||||
|             self.progress.set_state("Copying to postgres") | ||||
|             yield defer.gatherResults( | ||||
|                 [ | ||||
|                     self.handle_table(*res) | ||||
| @ -548,6 +550,9 @@ class Porter(object): | ||||
|                 consumeErrors=True, | ||||
|             ) | ||||
| 
 | ||||
|             # Step 5. Do final post-processing | ||||
|             yield self._setup_state_group_id_seq() | ||||
| 
 | ||||
|             self.progress.done() | ||||
|         except: | ||||
|             global end_error_exec_info | ||||
| @ -707,6 +712,16 @@ class Porter(object): | ||||
| 
 | ||||
|         defer.returnValue((done, remaining + done)) | ||||
| 
 | ||||
|     def _setup_state_group_id_seq(self): | ||||
|         def r(txn): | ||||
|             txn.execute("SELECT MAX(id) FROM state_groups") | ||||
|             next_id = txn.fetchone()[0]+1 | ||||
|             txn.execute( | ||||
|                 "ALTER SEQUENCE state_group_id_seq RESTART WITH %s", | ||||
|                 (next_id,), | ||||
|             ) | ||||
|         return self.postgres_store.runInteraction("setup_state_group_id_seq", r) | ||||
| 
 | ||||
| 
 | ||||
| ############################################## | ||||
| ###### The following is simply UI stuff ###### | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user