huaweicloud-encryption-sdk-python 1.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- examples/file_encryption_example.py +57 -0
- examples/key_capsule_encryption_example.py +240 -0
- examples/kms_discovery_encryption_example.py +56 -0
- examples/local_aes_encryption_example.py +59 -0
- examples/test_rsa.py +42 -0
- examples/test_sm2.py +38 -0
- examples/test_sm4_cbc.py +37 -0
- examples/test_sm4_gcm.py +37 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/METADATA +18 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/RECORD +174 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/WHEEL +5 -0
- huaweicloud_encryption_sdk_python-1.2.1.dist-info/top_level.txt +3 -0
- huaweicloud_encryptionsdk/__init__.py +5 -0
- huaweicloud_encryptionsdk/_apig_sdk/__init__.py +1 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer.py +278 -0
- huaweicloud_encryptionsdk/_apig_sdk/signer_v11.py +70 -0
- huaweicloud_encryptionsdk/_apig_sdk/sm3_hash.py +141 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/auth/signer.py +174 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/consumer_client_adapter.py +59 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/client/http_client.py +211 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/client_consumer_worker.py +106 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/consumer_heartbeat.py +73 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/core/log_shard_consumer.py +179 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_check_point_tracker.py +120 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/interface/consumer_processor_factory.py +3 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/check_point.py +20 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/consumer_config.py +27 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/log_data.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/model/task_result.py +40 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/consumer_fetch_task.py +53 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/initial_task.py +55 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/process_task.py +25 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer/task/shutdown_task.py +24 -0
- huaweicloud_encryptionsdk/_lts_sdk/consumer_main.py +88 -0
- huaweicloud_encryptionsdk/_lts_sdk/parallel_main.py +64 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/callback/call_back.py +7 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/accumulator.py +135 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_thread_pool.py +107 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/io_worker.py +124 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/mover.py +69 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/core/producer.py +98 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/http_client.py +63 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/lts_http/simple_request.py +14 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/config.py +50 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/error.py +18 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log.py +87 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/log_batch.py +154 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/lts_store.py +21 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/result.py +17 -0
- huaweicloud_encryptionsdk/_lts_sdk/producer/model/retry_queue.py +39 -0
- huaweicloud_encryptionsdk/_lts_sdk/serial_main.py +77 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/__init__.py +0 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/common.py +57 -0
- huaweicloud_encryptionsdk/_lts_sdk/utils/lts_threading.py +32 -0
- huaweicloud_encryptionsdk/cache/__init__.py +0 -0
- huaweicloud_encryptionsdk/cache/data_key_cache.py +79 -0
- huaweicloud_encryptionsdk/cache/local_data_key_cache.py +161 -0
- huaweicloud_encryptionsdk/common/__init__.py +0 -0
- huaweicloud_encryptionsdk/common/constants.py +15 -0
- huaweicloud_encryptionsdk/common/counting_output_stream.py +18 -0
- huaweicloud_encryptionsdk/common/crypto_factory.py +48 -0
- huaweicloud_encryptionsdk/common/ec_private_key_loader.py +43 -0
- huaweicloud_encryptionsdk/common/ecs_metadata_service.py +42 -0
- huaweicloud_encryptionsdk/common/file_path_for_example_constants.py +4 -0
- huaweicloud_encryptionsdk/common/utils.py +162 -0
- huaweicloud_encryptionsdk/exception/__init__.py +0 -0
- huaweicloud_encryptionsdk/exception/errors.py +109 -0
- huaweicloud_encryptionsdk/handler/__init__.py +0 -0
- huaweicloud_encryptionsdk/handler/cipher_handler.py +294 -0
- huaweicloud_encryptionsdk/handler/crypto_handler.py +24 -0
- huaweicloud_encryptionsdk/handler/default_crypto_handler.py +148 -0
- huaweicloud_encryptionsdk/handler/default_serialize_handler.py +45 -0
- huaweicloud_encryptionsdk/handler/file_decrypt_handler.py +101 -0
- huaweicloud_encryptionsdk/handler/file_encrypt_handler.py +30 -0
- huaweicloud_encryptionsdk/handler/serialize_handler.py +14 -0
- huaweicloud_encryptionsdk/huawei_config.py +49 -0
- huaweicloud_encryptionsdk/huawei_crypto.py +311 -0
- huaweicloud_encryptionsdk/keyrings/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/keyring.py +14 -0
- huaweicloud_encryptionsdk/keyrings/keyring_factory.py +10 -0
- huaweicloud_encryptionsdk/keyrings/kms_keyring_factory.py +21 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_discovery_keyring.py +51 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_key_capsule_keyring.py +100 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_keyring.py +155 -0
- huaweicloud_encryptionsdk/keyrings/kmskeyring/kms_multi_region_keyring.py +8 -0
- huaweicloud_encryptionsdk/keyrings/raw_keyring_factory.py +27 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/__init__.py +0 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_aes_keyring.py +63 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_keyring.py +112 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_rsa_keyring.py +55 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm2_keyring.py +75 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_cbc_keyring.py +66 -0
- huaweicloud_encryptionsdk/keyrings/rawkeyring/raw_sm4_keyring.py +70 -0
- huaweicloud_encryptionsdk/kms/__init__.py +0 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_request.py +35 -0
- huaweicloud_encryptionsdk/kms/create_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_request.py +32 -0
- huaweicloud_encryptionsdk/kms/decrypt_key_capsule_response.py +19 -0
- huaweicloud_encryptionsdk/kms/kms_http_client.py +116 -0
- huaweicloud_encryptionsdk/log/__init__.py +0 -0
- huaweicloud_encryptionsdk/log/log_config.py +30 -0
- huaweicloud_encryptionsdk/log/log_file_backup.py +144 -0
- huaweicloud_encryptionsdk/log/log_metrics.py +132 -0
- huaweicloud_encryptionsdk/log/log_reporter_manager.py +163 -0
- huaweicloud_encryptionsdk/log/lts_sdk_producer.py +386 -0
- huaweicloud_encryptionsdk/log/lts_struct_log_builder.py +106 -0
- huaweicloud_encryptionsdk/meterialmanager/__init__.py +0 -0
- huaweicloud_encryptionsdk/meterialmanager/cache_crypto_meterial_manager.py +221 -0
- huaweicloud_encryptionsdk/meterialmanager/crypto_meterial_manager.py +19 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate.py +10 -0
- huaweicloud_encryptionsdk/meterialmanager/data_key_generate_factory.py +20 -0
- huaweicloud_encryptionsdk/meterialmanager/default_crypto_meterials_manager.py +71 -0
- huaweicloud_encryptionsdk/meterialmanager/key_capsule_data_key_generate.py +63 -0
- huaweicloud_encryptionsdk/meterialmanager/kms_data_key_generate.py +65 -0
- huaweicloud_encryptionsdk/meterialmanager/local_data_key_generate.py +13 -0
- huaweicloud_encryptionsdk/model/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/access_point_config.py +9 -0
- huaweicloud_encryptionsdk/model/cipher_body.py +81 -0
- huaweicloud_encryptionsdk/model/cipher_header.py +405 -0
- huaweicloud_encryptionsdk/model/ciphertext_data_key.py +166 -0
- huaweicloud_encryptionsdk/model/crypto_result.py +11 -0
- huaweicloud_encryptionsdk/model/data_key_materials.py +17 -0
- huaweicloud_encryptionsdk/model/data_materials.py +11 -0
- huaweicloud_encryptionsdk/model/enums/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/enums/access_point_type.py +28 -0
- huaweicloud_encryptionsdk/model/enums/crypto_algorithm.py +75 -0
- huaweicloud_encryptionsdk/model/enums/data_key_generate_type.py +20 -0
- huaweicloud_encryptionsdk/model/enums/key_provider_enum.py +19 -0
- huaweicloud_encryptionsdk/model/enums/keyring_type_enum.py +27 -0
- huaweicloud_encryptionsdk/model/key_capsule.py +10 -0
- huaweicloud_encryptionsdk/model/key_capsule_config.py +12 -0
- huaweicloud_encryptionsdk/model/kms_config.py +10 -0
- huaweicloud_encryptionsdk/model/request/__init__.py +0 -0
- huaweicloud_encryptionsdk/model/request/encrypt_request.py +10 -0
- huaweicloud_encryptionsdk/model/request/sign_request.py +2 -0
- huaweicloud_encryptionsdk/model/request/verify_request.py +2 -0
- huaweicloud_encryptionsdk/proof/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/attestation_document.py +36 -0
- huaweicloud_encryptionsdk/proof/collector/__init__.py +0 -0
- huaweicloud_encryptionsdk/proof/collector/cce_proof_collector.py +24 -0
- huaweicloud_encryptionsdk/proof/collector/ecs_proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/collector/key_pair_proof_collector.py +55 -0
- huaweicloud_encryptionsdk/proof/collector/ma_proof_collector.py +51 -0
- huaweicloud_encryptionsdk/proof/private_key_decrypt_callback.py +7 -0
- huaweicloud_encryptionsdk/proof/proof_collector.py +11 -0
- huaweicloud_encryptionsdk/proof/proof_collector_factory.py +53 -0
- huaweicloud_encryptionsdk/proof/proof_info.py +10 -0
- huaweicloud_encryptionsdk/util/__init__.py +0 -0
- huaweicloud_encryptionsdk/util/common_utils.py +12 -0
- tests/__init__.py +0 -0
- tests/test_enums.py +84 -0
- tests/test_exceptions.py +38 -0
- tests/test_factories.py +71 -0
- tests/test_huawei_crypto.py +67 -0
- tests/test_imports.py +46 -0
- tests/test_kms_models.py +95 -0
- tests/test_log_file_backup.py +45 -0
- tests/test_lts_struct_log_builder.py +97 -0
- tests/test_models.py +142 -0
- tests/test_utils.py +111 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
|
|
3
|
+
from consumer.client.consumer_client_adapter import LogConsumerClientAdapter
|
|
4
|
+
from consumer.interface.consumer_processor import ILogConsumerProcessor
|
|
5
|
+
from consumer.model.task_result import TaskResult, InitTaskResult
|
|
6
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import common
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class InitializeTask(object):
|
|
10
|
+
def __init__(self, processor: ILogConsumerProcessor, client_adapter: LogConsumerClientAdapter, shard_id, start_time,
|
|
11
|
+
end_time):
|
|
12
|
+
self.processor = processor
|
|
13
|
+
self.client_adapter = client_adapter
|
|
14
|
+
self.shard_id = shard_id
|
|
15
|
+
self.start_time = start_time
|
|
16
|
+
self.end_time = end_time
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def initialize_task(task: InitializeTask) -> TaskResult:
|
|
20
|
+
task.processor.initialize(task.shard_id)
|
|
21
|
+
err, shard_checkpoint_list = task.client_adapter.fetch_consumer_group(task.shard_id)
|
|
22
|
+
if err is not None:
|
|
23
|
+
logger.error("error fetching initial position: {}", err)
|
|
24
|
+
return TaskResult(err)
|
|
25
|
+
is_cursor_persistent = False
|
|
26
|
+
start_time_by_cursor = ""
|
|
27
|
+
end_time_by_cursor = ""
|
|
28
|
+
if task.end_time is not None and task.end_time != 0:
|
|
29
|
+
err, end_time_2_cursor = task.client_adapter.get_cursor_by_time(task.shard_id, str(task.end_time))
|
|
30
|
+
if err is not None:
|
|
31
|
+
logger.error("error fetching initial position, get cursor by time error: {}", err)
|
|
32
|
+
return TaskResult(err)
|
|
33
|
+
end_time_by_cursor = end_time_2_cursor.cursor
|
|
34
|
+
logger.debug("initialize task shardId {}, endTime {}, endTimeByCursor {}", task.shard_id, task.end_time,
|
|
35
|
+
end_time_by_cursor)
|
|
36
|
+
|
|
37
|
+
logger.debug("shard checkpoint list is {}", shard_checkpoint_list)
|
|
38
|
+
if shard_checkpoint_list is not None and len(shard_checkpoint_list) > 0:
|
|
39
|
+
shard_checkpoint = shard_checkpoint_list[0]
|
|
40
|
+
logger.debug("shard checkpoint is {}", shard_checkpoint)
|
|
41
|
+
is_cursor_persistent = True
|
|
42
|
+
start_time_by_cursor = shard_checkpoint.checkpoint
|
|
43
|
+
else:
|
|
44
|
+
if task.start_time is not None and task.start_time != 0:
|
|
45
|
+
err, start_time_2_cursor = task.client_adapter.get_cursor_by_time(task.shard_id, str(task.start_time))
|
|
46
|
+
if err is not None:
|
|
47
|
+
logger.error("error fetching initial position, get cursor by time error: {}", err)
|
|
48
|
+
return TaskResult(err)
|
|
49
|
+
start_time_by_cursor = start_time_2_cursor.cursor
|
|
50
|
+
logger.debug("initialize task shardId {}, endTime {}, endTimeByCursor {}", task.shard_id, task.start_time,
|
|
51
|
+
start_time_by_cursor)
|
|
52
|
+
|
|
53
|
+
logger.debug("initialize result, shardId {}, startTimeByCursor {}, endTimeByCursor {}, isCursorPersistent {}",
|
|
54
|
+
task.shard_id, start_time_by_cursor, end_time_by_cursor, is_cursor_persistent)
|
|
55
|
+
return InitTaskResult(start_time_by_cursor, end_time_by_cursor, is_cursor_persistent)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from consumer.interface.consumer_check_point_tracker import DefaultLogConsumerCheckPointTracker
|
|
2
|
+
from consumer.interface.consumer_processor import ILogConsumerProcessor
|
|
3
|
+
from consumer.model.task_result import TaskResult, ProcessTaskResult
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ProcessTask(object):
|
|
7
|
+
def __init__(self, processor: ILogConsumerProcessor, log_groups,
|
|
8
|
+
checkpoint_tracker: DefaultLogConsumerCheckPointTracker,
|
|
9
|
+
final_fetch_cursor):
|
|
10
|
+
self.processor = processor
|
|
11
|
+
self.chunk = log_groups
|
|
12
|
+
self.checkpoint_tracker = checkpoint_tracker
|
|
13
|
+
self.final_fetch_cursor = final_fetch_cursor
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def process_task(task: ProcessTask) -> TaskResult:
|
|
17
|
+
task.checkpoint_tracker.pending_check_point = task.checkpoint_tracker.next_cursor
|
|
18
|
+
checkpoint = task.processor.process(task.chunk, task.checkpoint_tracker)
|
|
19
|
+
task.processor.shard_consumer_thread_success(task.checkpoint_tracker.shard_id,
|
|
20
|
+
task.final_fetch_cursor == task.checkpoint_tracker.next_cursor)
|
|
21
|
+
err = task.checkpoint_tracker.consume_data_end_flush_checkpoint()
|
|
22
|
+
if err is None:
|
|
23
|
+
return ProcessTaskResult(checkpoint)
|
|
24
|
+
else:
|
|
25
|
+
return TaskResult(err)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
|
|
3
|
+
from consumer.interface.consumer_check_point_tracker import DefaultLogConsumerCheckPointTracker
|
|
4
|
+
from consumer.interface.consumer_processor import ILogConsumerProcessor
|
|
5
|
+
from consumer.model.task_result import TaskResult
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ShutDownTask(object):
|
|
9
|
+
def __init__(self, processor: ILogConsumerProcessor, checkpoint_tracker: DefaultLogConsumerCheckPointTracker):
|
|
10
|
+
self.processor = processor
|
|
11
|
+
self.checkpoint_tracker = checkpoint_tracker
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def shutdown_task(task: ShutDownTask):
|
|
15
|
+
try:
|
|
16
|
+
task.processor.shutdown(task.checkpoint_tracker)
|
|
17
|
+
except Exception as e:
|
|
18
|
+
logger.error("could not shut down processor {}", e)
|
|
19
|
+
|
|
20
|
+
err = task.checkpoint_tracker.flush_check_point()
|
|
21
|
+
if err is not None:
|
|
22
|
+
return TaskResult(None)
|
|
23
|
+
else:
|
|
24
|
+
return TaskResult(err)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
from typing import List
|
|
5
|
+
|
|
6
|
+
from loguru import logger
|
|
7
|
+
|
|
8
|
+
from consumer.core.client_consumer_worker import get_client_consumer_worker
|
|
9
|
+
from consumer.interface.consumer_check_point_tracker import ILogConsumerCheckPointTracker
|
|
10
|
+
from consumer.interface.consumer_processor import ILogConsumerProcessor
|
|
11
|
+
from consumer.interface.consumer_processor_factory import ILogConsumerProcessorFactory
|
|
12
|
+
from consumer.model.consumer_config import ConsumerConfig
|
|
13
|
+
from consumer.model.log_data import LogData
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DemoLogConsumerProcessor(ILogConsumerProcessor):
|
|
17
|
+
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self.log_count = 0
|
|
20
|
+
|
|
21
|
+
def initialize(self, shard_id):
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
def process(self, log_group: List[LogData], tracker: ILogConsumerCheckPointTracker) -> str:
|
|
25
|
+
self.log_count += len(log_group)
|
|
26
|
+
logger.info("this time consume log {} total log num {}", len(log_group), self.log_count)
|
|
27
|
+
|
|
28
|
+
def shutdown(self, tracker: ILogConsumerCheckPointTracker):
|
|
29
|
+
return tracker.save_check_point(True)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class DemoLogConsumerProcessorFactory(ILogConsumerProcessorFactory):
|
|
33
|
+
def generate_processor(self):
|
|
34
|
+
return DemoLogConsumerProcessor()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def start_consume(endpoint, region_name, project_id, log_group_id, log_stream_id, access_key, access_secret,
|
|
38
|
+
consumer_group_name, start_time, end_time, log_level, is_test, consumer_count, consume_batch_size):
|
|
39
|
+
logger.remove()
|
|
40
|
+
logger.add(sys.stderr, level=log_level)
|
|
41
|
+
if is_test:
|
|
42
|
+
logger.add("/opt/cloud/log.log", level="DEBUG")
|
|
43
|
+
logger.info("start time {}, end time {}", start_time, end_time)
|
|
44
|
+
workers = []
|
|
45
|
+
|
|
46
|
+
for i in range(consumer_count):
|
|
47
|
+
config = ConsumerConfig(endpoint, region_name, project_id, log_group_id, log_stream_id, access_key,
|
|
48
|
+
access_secret, consumer_group_name, start_time, end_time, consume_batch_size)
|
|
49
|
+
work = get_client_consumer_worker(DemoLogConsumerProcessorFactory(), config)
|
|
50
|
+
if work is None:
|
|
51
|
+
logger.error("get work error, work is none")
|
|
52
|
+
else:
|
|
53
|
+
workers.append(work)
|
|
54
|
+
|
|
55
|
+
for work in workers:
|
|
56
|
+
work.start()
|
|
57
|
+
|
|
58
|
+
time.sleep(30000 * 60)
|
|
59
|
+
for work in workers:
|
|
60
|
+
work.shutdown()
|
|
61
|
+
|
|
62
|
+
time.sleep(60)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
if __name__ == '__main__':
|
|
66
|
+
parser = argparse.ArgumentParser(description='lts python sdk consume log help tester information')
|
|
67
|
+
parser.add_argument('--endpoint', dest='endpoint', type=str, help='lts endpoint', default="https://endpoint")
|
|
68
|
+
parser.add_argument('--project_id', dest='project_id', type=str, help='huaweicloud project_id', default="projectId")
|
|
69
|
+
parser.add_argument('--region', dest='region', type=str, help='huaweicloud region', default="region")
|
|
70
|
+
parser.add_argument('--group_id', dest='group_id', type=str, help='send log group_id', default="group_id")
|
|
71
|
+
parser.add_argument('--stream_id', dest='stream_id', type=str, help='send log stream_id', default="stream_id")
|
|
72
|
+
parser.add_argument('--ak', dest='ak', type=str, help='huaweicloud ak', default="ak")
|
|
73
|
+
parser.add_argument('--sk', dest='sk', type=str, help='huaweicloud sk', default="sk")
|
|
74
|
+
parser.add_argument('--consumer_count', dest='consumer_count', type=int, help='consumer count', default=1)
|
|
75
|
+
parser.add_argument('--consume_batch_size', dest='consume_batch_size', type=int, help='each fetch max log nums',
|
|
76
|
+
default=1000)
|
|
77
|
+
parser.add_argument('--consumer_group_name', dest='consumer_group_name', type=str, help='consumer group name',
|
|
78
|
+
default="consumer_group_name")
|
|
79
|
+
parser.add_argument('--start_time', dest='start_time', type=int, help='consume log start time ms',
|
|
80
|
+
default=213123123123)
|
|
81
|
+
parser.add_argument('--end_time', dest='end_time', type=int, help='consume log end time ms', default=0)
|
|
82
|
+
parser.add_argument('--log_level', dest='log_level', type=str, help='consume log end time ms', default="INFO")
|
|
83
|
+
parser.add_argument('--is_test', dest='is_test', type=bool, help='test consumer will write log to node',
|
|
84
|
+
default=True)
|
|
85
|
+
args = parser.parse_args()
|
|
86
|
+
start_consume(args.endpoint, args.region, args.project_id, args.group_id, args.stream_id, args.ak,
|
|
87
|
+
args.sk, args.consumer_group_name, args.start_time, args.end_time, args.log_level, args.is_test,
|
|
88
|
+
args.consumer_count, args.consume_batch_size)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import random
|
|
2
|
+
import time
|
|
3
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
4
|
+
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.core.producer import Producer
|
|
8
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import lts_store
|
|
9
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.config import Config
|
|
10
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.utils import common
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def generate_random_str(str_len=16):
|
|
14
|
+
"""
|
|
15
|
+
生成一个指定长度的随机字符串
|
|
16
|
+
"""
|
|
17
|
+
random_str = ''
|
|
18
|
+
base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'
|
|
19
|
+
length = len(base_str) - 1
|
|
20
|
+
for i in range(str_len):
|
|
21
|
+
random_str += base_str[random.randint(0, length)]
|
|
22
|
+
return random_str
|
|
23
|
+
|
|
24
|
+
def send_log_single_producer():
|
|
25
|
+
thread_num = 100
|
|
26
|
+
threads = []
|
|
27
|
+
begin_ms = common.current_time_ms()
|
|
28
|
+
submit_send_log_thread_pool = ThreadPoolExecutor(max_workers=thread_num, thread_name_prefix="send_log_thread")
|
|
29
|
+
|
|
30
|
+
config = Config()
|
|
31
|
+
config.endpoint = ""
|
|
32
|
+
config.access_key = ""
|
|
33
|
+
config.access_secret = ""
|
|
34
|
+
config.region_id = ""
|
|
35
|
+
config.project_id = ""
|
|
36
|
+
producer = Producer.init_producer(config)
|
|
37
|
+
producer.start_producer()
|
|
38
|
+
|
|
39
|
+
group_id = ""
|
|
40
|
+
stream_id = ""
|
|
41
|
+
|
|
42
|
+
log_content = generate_random_str(1024)
|
|
43
|
+
log = [log_content]
|
|
44
|
+
labels = {"keyA": "valueA"}
|
|
45
|
+
log_p = lts_store.generate_log(log, labels)
|
|
46
|
+
|
|
47
|
+
for i in range(thread_num):
|
|
48
|
+
new_thread = submit_send_log_thread_pool.submit(send_log_function, producer, group_id, stream_id, log_p)
|
|
49
|
+
threads.append(new_thread)
|
|
50
|
+
|
|
51
|
+
for t in threads:
|
|
52
|
+
t.result()
|
|
53
|
+
end_ms = common.current_time_ms()
|
|
54
|
+
logger.info("end send log, cost [{}]ms", end_ms - begin_ms)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def send_log_function(one_producer, group_id, stream_id, log_p):
|
|
58
|
+
for i in range(2000):
|
|
59
|
+
one_producer.send_log(group_id, stream_id, log_p)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
if __name__ == '__main__':
|
|
63
|
+
send_log_single_producer()
|
|
64
|
+
time.sleep(1000)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
from loguru import logger
|
|
2
|
+
|
|
3
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import log_batch
|
|
4
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log import Log
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading
|
|
6
|
+
|
|
7
|
+
DELIMITER = "|"
|
|
8
|
+
|
|
9
|
+
log_num = 0
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Accumulator(object):
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self._log_batch_map = {}
|
|
16
|
+
self._accumulator_lock = lts_threading.ReadWriteLock()
|
|
17
|
+
self._config = None
|
|
18
|
+
self._io_worker = None
|
|
19
|
+
self._producer = None
|
|
20
|
+
self._io_thread_pool = None
|
|
21
|
+
self._already_send_num = 0
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def init_accumulator(config, io_worker, producer, thread_pool):
|
|
25
|
+
accumulator = Accumulator()
|
|
26
|
+
accumulator.config = config
|
|
27
|
+
accumulator.io_thread_pool = thread_pool
|
|
28
|
+
accumulator.io_worker = io_worker
|
|
29
|
+
accumulator.producer = producer
|
|
30
|
+
return accumulator
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def log_batch_map(self):
|
|
34
|
+
return self._log_batch_map
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def accumulator_lock(self):
|
|
38
|
+
return self._accumulator_lock
|
|
39
|
+
|
|
40
|
+
@log_batch_map.setter
|
|
41
|
+
def log_batch_map(self, value):
|
|
42
|
+
self._log_batch_map = value
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def config(self):
|
|
46
|
+
return self._config
|
|
47
|
+
|
|
48
|
+
@config.setter
|
|
49
|
+
def config(self, value):
|
|
50
|
+
self._config = value
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def io_worker(self):
|
|
54
|
+
return self._io_worker
|
|
55
|
+
|
|
56
|
+
@io_worker.setter
|
|
57
|
+
def io_worker(self, value):
|
|
58
|
+
self._io_worker = value
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def io_thread_pool(self):
|
|
62
|
+
return self._io_thread_pool
|
|
63
|
+
|
|
64
|
+
@io_thread_pool.setter
|
|
65
|
+
def io_thread_pool(self, value):
|
|
66
|
+
self._io_thread_pool = value
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def producer(self):
|
|
70
|
+
return self._producer
|
|
71
|
+
|
|
72
|
+
@producer.setter
|
|
73
|
+
def producer(self, value):
|
|
74
|
+
self._producer = value
|
|
75
|
+
|
|
76
|
+
def add_log_to_log_batch_map(self, log_data: Log, group_id: str, stream_id: str, call_back):
|
|
77
|
+
global log_num
|
|
78
|
+
try:
|
|
79
|
+
key = self.get_log_batch_key(group_id, stream_id)
|
|
80
|
+
self._accumulator_lock.acquire_write()
|
|
81
|
+
try:
|
|
82
|
+
if key in self.log_batch_map:
|
|
83
|
+
batch_value = self.log_batch_map.get(key)
|
|
84
|
+
# TODO 需要计算producer的总大小
|
|
85
|
+
log_size = log_data.getSize()
|
|
86
|
+
batch_value.add_total_data_size(log_size)
|
|
87
|
+
self._add_or_send_producer_batch(key, group_id, stream_id, batch_value, log_data, call_back)
|
|
88
|
+
|
|
89
|
+
else:
|
|
90
|
+
self._create_new_producer_log_batch(log_data, key, group_id, stream_id, call_back)
|
|
91
|
+
|
|
92
|
+
finally:
|
|
93
|
+
self._accumulator_lock.release_write()
|
|
94
|
+
|
|
95
|
+
return None
|
|
96
|
+
finally:
|
|
97
|
+
log_num += len(log_data.contents)
|
|
98
|
+
if log_num % 10000 == 0:
|
|
99
|
+
logger.warning("add log num {}", log_num)
|
|
100
|
+
|
|
101
|
+
def _create_new_producer_log_batch(self, log_data: Log, key: str, group_id: str, stream_id: str, call_back):
|
|
102
|
+
_new_batch = log_batch.init_product_batch_var_single_log(log_data, call_back, group_id, stream_id, self.config)
|
|
103
|
+
self.log_batch_map[key] = _new_batch
|
|
104
|
+
|
|
105
|
+
def _add_or_send_producer_batch(self, key: str, group_id: str, stream_id: str, batch_value: log_batch.LogBatch,
|
|
106
|
+
log: Log,
|
|
107
|
+
call_back):
|
|
108
|
+
total_data_count = batch_value.log_group_count + 1
|
|
109
|
+
# batch中日志大小超过MaxBatchSize && batch中日志大小< 5242880 && batch中日志条数 <= MaxBatchCount
|
|
110
|
+
# 直接发送
|
|
111
|
+
if (self.config.batch_size_threshold_in_bytes < batch_value.total_data_size < 5242880
|
|
112
|
+
and total_data_count <= self.config.batch_count_threshold):
|
|
113
|
+
batch_value.add_log_to_log_group(log)
|
|
114
|
+
if call_back is not None:
|
|
115
|
+
batch_value.add_call_back(call_back)
|
|
116
|
+
self._inner_send_to_server(key, batch_value)
|
|
117
|
+
# batch中日志大小和条数都没有满足 配置,则log加入batch中先缓存
|
|
118
|
+
elif (batch_value.total_data_size <= self.config.batch_size_threshold_in_bytes
|
|
119
|
+
and total_data_count <= self.config.batch_count_threshold):
|
|
120
|
+
|
|
121
|
+
batch_value.add_log_to_log_group(log)
|
|
122
|
+
if call_back is not None:
|
|
123
|
+
batch_value.add_call_back(call_back)
|
|
124
|
+
|
|
125
|
+
else:
|
|
126
|
+
self._inner_send_to_server(key, batch_value)
|
|
127
|
+
self._create_new_producer_log_batch(log, key, group_id, stream_id, call_back)
|
|
128
|
+
|
|
129
|
+
def _inner_send_to_server(self, key: str, batch: log_batch.LogBatch):
|
|
130
|
+
self.io_thread_pool.add_task(batch)
|
|
131
|
+
self.log_batch_map.pop(key)
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def get_log_batch_key(group_id: str, stream_id: str) -> str:
|
|
135
|
+
return group_id + DELIMITER + stream_id + DELIMITER
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import queue
|
|
2
|
+
import threading
|
|
3
|
+
import time
|
|
4
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
5
|
+
|
|
6
|
+
from loguru import logger
|
|
7
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.log_batch import LogBatch
|
|
8
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class IOThreadPool(threading.Thread):
|
|
12
|
+
def __init__(self, io_worker):
|
|
13
|
+
super().__init__()
|
|
14
|
+
self._thread_pool_lock = lts_threading.ReadWriteLock()
|
|
15
|
+
self._deal_batch_queue = queue.Queue()
|
|
16
|
+
self._submit_thread_pool = ThreadPoolExecutor(max_workers=10240, thread_name_prefix="io_thread_pool_sender")
|
|
17
|
+
self._io_worker = io_worker
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def io_worker(self):
|
|
21
|
+
return self._io_worker
|
|
22
|
+
|
|
23
|
+
@io_worker.setter
|
|
24
|
+
def io_worker(self, value: int):
|
|
25
|
+
self._io_worker = value
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def thread_pool_lock(self):
|
|
29
|
+
return self._thread_pool_lock
|
|
30
|
+
|
|
31
|
+
@thread_pool_lock.setter
|
|
32
|
+
def thread_pool_lock(self, value: int):
|
|
33
|
+
self._thread_pool_lock = value
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def deal_batch_queue(self):
|
|
37
|
+
self._thread_pool_lock.acquire_read()
|
|
38
|
+
try:
|
|
39
|
+
return self._deal_batch_queue
|
|
40
|
+
finally:
|
|
41
|
+
self._thread_pool_lock.release_read()
|
|
42
|
+
|
|
43
|
+
@deal_batch_queue.setter
|
|
44
|
+
def deal_batch_queue(self, value: int):
|
|
45
|
+
self._thread_pool_lock.acquire_write()
|
|
46
|
+
try:
|
|
47
|
+
self._deal_batch_queue = value
|
|
48
|
+
finally:
|
|
49
|
+
self._thread_pool_lock.release_write()
|
|
50
|
+
|
|
51
|
+
def add_task(self, batch: LogBatch):
|
|
52
|
+
|
|
53
|
+
self._thread_pool_lock.acquire_write()
|
|
54
|
+
try:
|
|
55
|
+
self._deal_batch_queue.put_nowait(batch)
|
|
56
|
+
except queue.Full as e:
|
|
57
|
+
logger.error("log batch queue is full, log generate is too fast")
|
|
58
|
+
finally:
|
|
59
|
+
self._thread_pool_lock.release_write()
|
|
60
|
+
|
|
61
|
+
def take_task(self):
|
|
62
|
+
self._thread_pool_lock.acquire_read()
|
|
63
|
+
try:
|
|
64
|
+
if self._deal_batch_queue is None or self._deal_batch_queue.empty():
|
|
65
|
+
return None
|
|
66
|
+
batch = self._deal_batch_queue.get_nowait()
|
|
67
|
+
return batch
|
|
68
|
+
finally:
|
|
69
|
+
self._thread_pool_lock.release_read()
|
|
70
|
+
|
|
71
|
+
def has_task(self):
|
|
72
|
+
self._thread_pool_lock.acquire_read()
|
|
73
|
+
try:
|
|
74
|
+
if self._deal_batch_queue is None:
|
|
75
|
+
return False
|
|
76
|
+
return not self._deal_batch_queue.empty()
|
|
77
|
+
finally:
|
|
78
|
+
self._thread_pool_lock.release_read()
|
|
79
|
+
|
|
80
|
+
def task_queue_size(self):
|
|
81
|
+
self._thread_pool_lock.acquire_read()
|
|
82
|
+
try:
|
|
83
|
+
if self._deal_batch_queue is None:
|
|
84
|
+
return 0
|
|
85
|
+
return self._deal_batch_queue.qsize()
|
|
86
|
+
finally:
|
|
87
|
+
self._thread_pool_lock.release_read()
|
|
88
|
+
|
|
89
|
+
def run(self):
|
|
90
|
+
try:
|
|
91
|
+
while True:
|
|
92
|
+
batch = self.take_task()
|
|
93
|
+
if batch is None:
|
|
94
|
+
time.sleep(0.1)
|
|
95
|
+
else:
|
|
96
|
+
self.io_worker.start_this_send_task()
|
|
97
|
+
|
|
98
|
+
def send_to_server_handler(io_worker, log_batch):
|
|
99
|
+
try:
|
|
100
|
+
io_worker.io_worker_send_to_server(log_batch)
|
|
101
|
+
finally:
|
|
102
|
+
io_worker.end_this_send_task()
|
|
103
|
+
|
|
104
|
+
self._submit_thread_pool.submit(send_to_server_handler, self.io_worker, batch)
|
|
105
|
+
|
|
106
|
+
finally:
|
|
107
|
+
self.io_worker.dec_task_count()
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import math
|
|
2
|
+
import queue
|
|
3
|
+
import threading
|
|
4
|
+
|
|
5
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.lts_http import http_client
|
|
6
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import log_batch
|
|
7
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model import result
|
|
8
|
+
from huaweicloud_encryptionsdk._lts_sdk.producer.model.error import Error
|
|
9
|
+
from huaweicloud_encryptionsdk._lts_sdk.utils import lts_threading, common
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class IOWorker(threading.Thread):
|
|
13
|
+
def __init__(self, max_io_worker_count, no_retry_code, producer):
|
|
14
|
+
super().__init__()
|
|
15
|
+
self._task_count_lock = lts_threading.ReadWriteLock()
|
|
16
|
+
self._task_count = 0
|
|
17
|
+
# 控制io_worker数量,超过限制时,后面的都进行等待,等待前面io_worker处理完
|
|
18
|
+
self._max_io_worker = queue.Queue(max_io_worker_count)
|
|
19
|
+
self._no_retry_status_code = no_retry_code
|
|
20
|
+
self._producer = producer
|
|
21
|
+
self._retry_queue_lock = lts_threading.ReadWriteLock()
|
|
22
|
+
self._retry_queue = queue.Queue()
|
|
23
|
+
self._lock = threading.Lock()
|
|
24
|
+
self._client = http_client.HttpClient()
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def producer(self):
|
|
28
|
+
return self._producer
|
|
29
|
+
|
|
30
|
+
@producer.setter
|
|
31
|
+
def producer(self, value):
|
|
32
|
+
self._producer = value
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def task_count(self):
|
|
36
|
+
self._task_count_lock.acquire_read()
|
|
37
|
+
try:
|
|
38
|
+
return self._task_count
|
|
39
|
+
finally:
|
|
40
|
+
self._task_count_lock.release_read()
|
|
41
|
+
|
|
42
|
+
@task_count.setter
|
|
43
|
+
def task_count(self, value):
|
|
44
|
+
self._task_count_lock.acquire_write()
|
|
45
|
+
try:
|
|
46
|
+
self._task_count = value
|
|
47
|
+
finally:
|
|
48
|
+
self._task_count_lock.release_write()
|
|
49
|
+
|
|
50
|
+
def io_worker_send_to_server(self, batch: log_batch.LogBatch):
|
|
51
|
+
begin_time = common.current_time_ms()
|
|
52
|
+
# TODO 此处进行日志发送
|
|
53
|
+
err = self._client.put_logs(batch.group_id, batch.stream_id, batch.log_group, self._producer.producer_config)
|
|
54
|
+
if err is None:
|
|
55
|
+
if batch.attempt_count < self._producer.producer_config.max_reserved_attempts:
|
|
56
|
+
now_time = common.current_time_ms()
|
|
57
|
+
attempt = result.Attempt(True, 200, "", "", "", now_time, now_time - begin_time)
|
|
58
|
+
batch.add_attempt(attempt)
|
|
59
|
+
batch.result.success = True
|
|
60
|
+
if len(batch.call_back_list) > 0:
|
|
61
|
+
for call_back in batch.call_back_list:
|
|
62
|
+
call_back.invoke_on_success(batch.result)
|
|
63
|
+
|
|
64
|
+
else:
|
|
65
|
+
if err.http_code in self._no_retry_status_code:
|
|
66
|
+
self.add_error_msg_to_batch_attempt(batch, err, False, begin_time)
|
|
67
|
+
self.exec_failed_call_back(batch)
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
if batch.attempt_count < self._producer.producer_config.retries:
|
|
71
|
+
self.add_error_msg_to_batch_attempt(batch, err, True, begin_time)
|
|
72
|
+
retry_wait_time = self._producer.producer_config.base_retry_backoff_ms * math.pow(2,
|
|
73
|
+
batch.attempt_count - 1)
|
|
74
|
+
if retry_wait_time < self.producer.producer_config.max_retry_backoff_ms:
|
|
75
|
+
batch.next_retry_ms = common.current_time_ms() + retry_wait_time
|
|
76
|
+
else:
|
|
77
|
+
batch.next_retry_ms = common.current_time_ms() + self.producer.producer_config.max_retry_backoff_ms
|
|
78
|
+
self.send_to_retry_queue(batch)
|
|
79
|
+
else:
|
|
80
|
+
self.exec_failed_call_back(batch)
|
|
81
|
+
|
|
82
|
+
def end_this_send_task(self):
|
|
83
|
+
self._max_io_worker.get()
|
|
84
|
+
self.dec_task_count()
|
|
85
|
+
|
|
86
|
+
def start_this_send_task(self):
|
|
87
|
+
self.inc_task_count()
|
|
88
|
+
self._max_io_worker.put(1)
|
|
89
|
+
|
|
90
|
+
def inc_task_count(self):
|
|
91
|
+
self._task_count_lock.acquire_write()
|
|
92
|
+
try:
|
|
93
|
+
self._task_count += 1
|
|
94
|
+
finally:
|
|
95
|
+
self._task_count_lock.release_write()
|
|
96
|
+
|
|
97
|
+
def dec_task_count(self):
|
|
98
|
+
self._task_count_lock.acquire_write()
|
|
99
|
+
try:
|
|
100
|
+
self._task_count -= 1
|
|
101
|
+
finally:
|
|
102
|
+
self._task_count_lock.release_write()
|
|
103
|
+
|
|
104
|
+
def send_to_retry_queue(self, batch: log_batch.LogBatch):
|
|
105
|
+
self._retry_queue_lock.acquire_write()
|
|
106
|
+
try:
|
|
107
|
+
self._retry_queue.put_nowait(batch)
|
|
108
|
+
finally:
|
|
109
|
+
self._retry_queue_lock.release_write()
|
|
110
|
+
|
|
111
|
+
def add_error_msg_to_batch_attempt(self, batch: log_batch.LogBatch, err: Error, retry: bool, begin_ms: int):
|
|
112
|
+
if batch.attempt_count < self.producer.producer_config.max_reserved_attempts:
|
|
113
|
+
now_ms = common.current_time_ms()
|
|
114
|
+
attempt = result.Attempt(False, err.http_code, err.request_id, err.error_code, err.error_msg, now_ms,
|
|
115
|
+
now_ms - begin_ms)
|
|
116
|
+
batch.add_attempt(attempt)
|
|
117
|
+
batch.result.success = False
|
|
118
|
+
batch.attempt_count += 1
|
|
119
|
+
|
|
120
|
+
@classmethod
|
|
121
|
+
def exec_failed_call_back(cls, batch: log_batch.LogBatch):
|
|
122
|
+
if len(batch.call_back_list) > 0:
|
|
123
|
+
for call_back in batch.call_back_list:
|
|
124
|
+
call_back.invoke_on_failed(batch.result)
|