diff --git a/CHANGES.txt b/CHANGES.txt index 1389445..d63d07f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +v2.0.3, 2014-10-28 -- Minor bug fix release + * GearmanClient - Raises exception if background=False and wait_until_complete=False when calling submit_jobs/submit_multiple_jobs + v2.0.X, 2012-XX-XX -- Major bug fix release * GearmanWorker - Dispatch to the right function instead of looping * GearmanClient - Let the server handle the special '-' unique [GH-18] diff --git a/gearman/__init__.py b/gearman/__init__.py index 0116bc5..fe793d0 100644 --- a/gearman/__init__.py +++ b/gearman/__init__.py @@ -2,7 +2,7 @@ Gearman API - Client, worker, and admin client interfaces """ -__version__ = '2.0.2' +__version__ = '2.0.3' from gearman.admin_client import GearmanAdminClient from gearman.client import GearmanClient diff --git a/gearman/client.py b/gearman/client.py index ea6639f..5afb782 100644 --- a/gearman/client.py +++ b/gearman/client.py @@ -10,7 +10,7 @@ from gearman.connection_manager import GearmanConnectionManager from gearman.client_handler import GearmanClientCommandHandler from gearman.constants import PRIORITY_NONE, PRIORITY_LOW, PRIORITY_HIGH, JOB_UNKNOWN, JOB_PENDING -from gearman.errors import ConnectionError, ExceededConnectionAttempts, ServerUnavailable +from gearman.errors import ConnectionError, ExceededConnectionAttempts, InvalidFlagsToSubmitJob, ServerUnavailable gearman_logger = logging.getLogger(__name__) @@ -45,6 +45,10 @@ def submit_multiple_jobs(self, jobs_to_submit, background=False, wait_until_comp """ assert type(jobs_to_submit) in (list, tuple, set), "Expected multiple jobs, received 1?" + # Check if the flags are properly set + if background == False and wait_until_complete == False: + raise InvalidFlagsToSubmitJob('Set background=True if wait_until_complete=False to send background jobs') + # Convert all job dicts to job request objects requests_to_submit = [self._create_request_from_dictionary(job_info, background=background, max_retries=max_retries) for job_info in jobs_to_submit] diff --git a/gearman/errors.py b/gearman/errors.py index 5671033..cb31f62 100644 --- a/gearman/errors.py +++ b/gearman/errors.py @@ -24,3 +24,6 @@ class InvalidWorkerState(GearmanError): class InvalidAdminClientState(GearmanError): pass + +class InvalidFlagsToSubmitJob(GearmanError): + pass diff --git a/tests/client_tests.py b/tests/client_tests.py index 824c865..0594a0b 100644 --- a/tests/client_tests.py +++ b/tests/client_tests.py @@ -6,7 +6,7 @@ from gearman.client_handler import GearmanClientCommandHandler from gearman.constants import PRIORITY_NONE, PRIORITY_HIGH, PRIORITY_LOW, JOB_UNKNOWN, JOB_PENDING, JOB_CREATED, JOB_FAILED, JOB_COMPLETE -from gearman.errors import ExceededConnectionAttempts, ServerUnavailable, InvalidClientState +from gearman.errors import ExceededConnectionAttempts, ServerUnavailable, InvalidClientState, InvalidFlagsToSubmitJob from gearman.protocol import submit_cmd_for_background_priority, GEARMAN_COMMAND_STATUS_RES, GEARMAN_COMMAND_GET_STATUS, GEARMAN_COMMAND_JOB_CREATED, \ GEARMAN_COMMAND_WORK_STATUS, GEARMAN_COMMAND_WORK_FAIL, GEARMAN_COMMAND_WORK_COMPLETE, GEARMAN_COMMAND_WORK_DATA, GEARMAN_COMMAND_WORK_WARNING @@ -144,7 +144,21 @@ def fail_then_create_jobs(rx_conns, wr_conns, ex_conns): self.assertEquals(current_request.state, JOB_UNKNOWN) self.assertEquals(current_request.connection_attempts, current_request.max_connection_attempts) - def test_multiple_fg_job_submission(self): + def test_invalid_flags_to_submit_job(self): + submitted_job_count = 5 + expected_job_list = [self.generate_job() for _ in xrange(submitted_job_count)] + def mark_jobs_created(rx_conns, wr_conns, ex_conns): + for current_job in expected_job_list: + self.command_handler.recv_command(GEARMAN_COMMAND_JOB_CREATED, job_handle=current_job.handle) + + return rx_conns, wr_conns, ex_conns + + self.connection_manager.handle_connection_activity = mark_jobs_created + job_dictionaries = [current_job.to_dict() for current_job in expected_job_list] + + self.assertRaises(InvalidFlagsToSubmitJob, self.connection_manager.submit_multiple_jobs, job_dictionaries, background=False, wait_until_complete=False) + + def test_multiple_bg_job_submission(self): submitted_job_count = 5 expected_job_list = [self.generate_job() for _ in xrange(submitted_job_count)] def mark_jobs_created(rx_conns, wr_conns, ex_conns): @@ -158,16 +172,16 @@ def mark_jobs_created(rx_conns, wr_conns, ex_conns): job_dictionaries = [current_job.to_dict() for current_job in expected_job_list] # Test multiple job submission - job_requests = self.connection_manager.submit_multiple_jobs(job_dictionaries, wait_until_complete=False) + job_requests = self.connection_manager.submit_multiple_jobs(job_dictionaries, background=True, wait_until_complete=False) for current_request, expected_job in zip(job_requests, expected_job_list): current_job = current_request.job self.assert_jobs_equal(current_job, expected_job) self.assertEqual(current_request.priority, PRIORITY_NONE) - self.assertEqual(current_request.background, False) + self.assertEqual(current_request.background, True) self.assertEqual(current_request.state, JOB_CREATED) - self.assertFalse(current_request.complete) + self.assertTrue(current_request.complete) def test_single_bg_job_submission(self): expected_job = self.generate_job()