 ee2e85a0bb
			
		
	
	ee2e85a0bb
	
	
	
		
			
			Summary:
People hit three issues with D3914:
  - As per T2059, we applied a schema change from a `.php` patch, which currently does not work if you use a different user to make schema changes than for normal use.
    - Since the change in question is idempotent, just move it to a `.sql` patch. We'll follow up in T2059 and fix it properly.
  - Rogue daemons at several installs used old code (expecting autoincrement) to insert into the new table (no autoincrement), thereby creating tasks with ID 0.
    - Rename the table so they'll fail.
    - This also makes the code a little more consistent.
  - Some installs now have tasks with ID 0.
    - Use checks against null rather than against 0 so we can process these tasks.
The major issues this fixes are the schema upgrade failure in T2059, and the infinite loops in T2072 and elsewhere.
This isn't really a fully statisfactory fix. I'll discuss some next steps in T2072.
Test Plan: Created new tasks via MetaMTA/Differential. Ran tasks with `phd debug taskmaster`. Inserted a task 0 and verified it ran and archived correctly.
Reviewers: btrahan, vrana, nh
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T2072, T2059
Differential Revision: https://secure.phabricator.com/D3973
		
	
		
			
				
	
	
		
			41 lines
		
	
	
		
			1023 B
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1023 B
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // Switch PhabricatorWorkerActiveTask from autoincrement IDs to counter IDs.
 | |
| // Set the initial counter ID to be larger than any known task ID.
 | |
| 
 | |
| $active_table = new PhabricatorWorkerActiveTask();
 | |
| $archive_table = new PhabricatorWorkerArchiveTask();
 | |
| 
 | |
| $old_table = 'worker_task';
 | |
| 
 | |
| $conn_w = $active_table->establishConnection('w');
 | |
| 
 | |
| $active_auto = head(queryfx_one(
 | |
|   $conn_w,
 | |
|   'SELECT auto_increment FROM information_schema.tables
 | |
|     WHERE table_name = %s
 | |
|     AND table_schema = DATABASE()',
 | |
|   $old_table));
 | |
| 
 | |
| $active_max = head(queryfx_one(
 | |
|   $conn_w,
 | |
|   'SELECT MAX(id) FROM %T',
 | |
|   $old_table));
 | |
| 
 | |
| $archive_max = head(queryfx_one(
 | |
|   $conn_w,
 | |
|   'SELECT MAX(id) FROM %T',
 | |
|   $archive_table->getTableName()));
 | |
| 
 | |
| $initial_counter = max((int)$active_auto, (int)$active_max, (int)$archive_max);
 | |
| 
 | |
| queryfx(
 | |
|   $conn_w,
 | |
|   'INSERT INTO %T (counterName, counterValue)
 | |
|     VALUES (%s, %d)
 | |
|     ON DUPLICATE KEY UPDATE counterValue = %d',
 | |
|   LiskDAO::COUNTER_TABLE_NAME,
 | |
|   $old_table,
 | |
|   $initial_counter + 1,
 | |
|   $initial_counter + 1);
 |