-
Notifications
You must be signed in to change notification settings - Fork 3.3k
add implementation for checkpointstoretable #19905
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 13 commits
a6875dd
6b6fd00
515f886
773020a
8b241bd
7a8a62d
63fb4cb
ffa5541
2986370
1f06d3c
68e6e05
be8362a
29c7a84
4fc4b19
9bca97a
0159f6d
eb6d52f
fc36f66
d698e8d
475b7a8
e5d68a6
9ff942c
319bb77
d585ec8
e732e86
22c6f2c
9a24922
233a993
1d82efb
5645319
a44af13
eb8a9b5
77d116f
7bfb04b
786a700
252dab6
877f1d8
bc2e430
a36a1c1
a2593d4
76ccc65
66a3670
dabe61a
54a913d
44bc8fe
ce4ea29
9b7f144
0cec994
cbd01b6
148312a
037d62d
6e56a1e
3d5c888
76a2d6c
7a01f35
061250c
bdda591
dca6422
ac89465
a91665e
3d6798e
5f496d3
bafce75
233d50f
578d18b
d4dd3f1
2c89a54
3bd50c7
790896b
65a9ddf
e997bc8
0bd82a9
2614ce3
676b235
a6aa61e
edbe697
5af3e05
d2dbb2a
610606e
eee983f
6bc5e7e
affd864
aef09bc
fc7fbcb
d67cabf
f97b399
695ed0b
aeeb27e
13f3ed3
8fd90ec
8a3951d
e991fed
7fb1c62
19cbf7e
0e8d95a
d6b450e
b3f333a
f3c3578
d2f9390
b148f1c
bc3b01d
5e2333e
f9af616
23e9546
ef11a52
bcb9dcc
e2c9ae4
a2bdb0f
00f1479
d02db94
0b9d28a
6712ea1
bcb95e2
879dae7
222a6c5
7353298
7c508e4
dbc12da
f93a037
a2b871c
d837f5b
43bbc11
141fbbd
dca1f0d
74d73e1
de08199
6553356
a6e9481
fb8fc57
96af725
de6ce7e
6be0ce9
0bce5e8
b156941
a545417
003f741
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -2,6 +2,11 @@ | |||||
| # Copyright (c) Microsoft Corporation. All rights reserved. | ||||||
| # Licensed under the MIT License. See License.txt in the project root for license information. | ||||||
| # -------------------------------------------------------------------------------------------- | ||||||
| from collections import defaultdict | ||||||
| from azure.data.tables import TableClient, UpdateMode | ||||||
| from azure.core import MatchConditions | ||||||
| from azure.data.tables._base_client import parse_connection_str | ||||||
| from azure.core.exceptions import ResourceModifiedError, ResourceExistsError, ResourceNotFoundError | ||||||
|
|
||||||
| class TableCheckpointStore: | ||||||
| """A CheckpointStore that uses Azure Table Storage to store the partition ownership and checkpoint data. | ||||||
|
|
@@ -22,17 +27,246 @@ class TableCheckpointStore: | |||||
| The hostname of the secondary endpoint. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is the secondary hostname actually able to be used, or can we remove it from the docs?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I removed it
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can't comment on the api_version line directly, but it says the default value is '2019-07-07'. However it looks like the default value is actually '2018-03-28' if we look at the tables package:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fixed it |
||||||
| """ | ||||||
|
|
||||||
| def __init__(self, **kwargs): | ||||||
| pass | ||||||
| def __init__(self, table_account_url, table_name, credential=None, **kwargs): | ||||||
| # type(str, str, Optional[Any], Any) -> None | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| self.table_client = kwargs.pop("table_client", None) | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| if not self.table_client: | ||||||
| api_version = kwargs.pop("api_version", None) | ||||||
| if api_version: | ||||||
| headers = kwargs.get("headers") | ||||||
| if headers: | ||||||
| headers["x-ms-version"] = api_version | ||||||
| else: | ||||||
| kwargs["headers"] = {"x-ms-version": api_version} | ||||||
| self.table_client = TableClient( | ||||||
| table_account_url, table_name, credential=credential, **kwargs | ||||||
| ) | ||||||
|
swathipil marked this conversation as resolved.
|
||||||
| self._cached_table_clients = defaultdict() # type: Dict[str, TableClient] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
|
|
||||||
| def list_ownership(self, namespace, eventhub, consumergroup, **kwargs): | ||||||
| pass | ||||||
| @classmethod | ||||||
| def from_connection_string(cls, conn_str, table_name, credential=None, **kwargs): | ||||||
|
swathipil marked this conversation as resolved.
|
||||||
| """Create TableCheckpointStore from a storage connection string. | ||||||
|
Jg1255 marked this conversation as resolved.
|
||||||
| :param str conn_str: | ||||||
| A connection string to an Azure Storage account. | ||||||
| :param table_name: | ||||||
| The table name. | ||||||
| :type table_name: str | ||||||
| :param credential: | ||||||
| The credentials with which to authenticate. This is optional if the | ||||||
| account URL already has a SAS token, or the connection string already has shared | ||||||
| access key values. The value can be a SAS token string, an account shared access | ||||||
| key, or an instance of a TokenCredentials class from azure.identity. | ||||||
| Credentials provided here will take precedence over those in the connection string. | ||||||
| :keyword str api_version: | ||||||
| The Storage API version to use for requests. Default value is '2019-07-07'. | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| :keyword str secondary_hostname: | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It doesn't look like the
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This comment was marked as resolved but I'm not sure why. Do we need It also looks like it is being accepted in the constructor as well, but I don't see how it is usable today.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes we do not need secondary_hostname
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sweet, please remove then 😄 |
||||||
| :returns: A table checkpoint store. | ||||||
| :rtype: ~azure.eventhub.extensions.checkpointstoretable.TableCheckpointStore | ||||||
| """ | ||||||
| endpoint, credential = parse_connection_str( | ||||||
| conn_str=conn_str, credential=None, keyword_args=kwargs | ||||||
| ) | ||||||
| return cls(endpoint, table_name=table_name, credential=credential, **kwargs) | ||||||
|
|
||||||
|
swathipil marked this conversation as resolved.
|
||||||
| def _create_entity_checkpoint(self, checkpoint): | ||||||
| my_new_entity = { | ||||||
| u'PartitionKey': u'', | ||||||
| u'RowKey': u'', | ||||||
| u'consumer_group': checkpoint['consumer_group'], | ||||||
| u'fully_qualified_namespace': checkpoint['fully_qualified_namespace'], | ||||||
| u'eventhub_name': checkpoint['eventhub_name'], | ||||||
| u'partition_id': checkpoint['partition_id'], | ||||||
| u'offset' : checkpoint['offset'], | ||||||
| u'sequence_number' : checkpoint['sequence_number'], | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| } | ||||||
| my_new_entity['RowKey'] = my_new_entity['partition_id'] | ||||||
| my_new_entity['PartitionKey'] = my_new_entity['eventhub_name'] + ' ' + \ | ||||||
| my_new_entity['fully_qualified_namespace'] + ' ' + my_new_entity['consumer_group'] + ' ' + 'Checkpoint' | ||||||
| self.table_client.create_entity(entity=my_new_entity) | ||||||
|
|
||||||
| def _create_entity_ownership(self, ownership): | ||||||
| my_new_entity = { | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit: I think a better name for this would be
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You marked this as resolved, but I'm not sure why. Do you disagree with the name change? |
||||||
| u'PartitionKey': u'', | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| u'RowKey': u'', | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| u'consumer_group': ownership['consumer_group'], | ||||||
| u'fully_qualified_namespace': ownership['fully_qualified_namespace'], | ||||||
| u'eventhub_name': ownership['eventhub_name'], | ||||||
| u'partition_id': ownership['partition_id'], | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| u'owner_id' : ownership['owner_id'], | ||||||
| } | ||||||
| my_new_entity['RowKey'] = my_new_entity['partition_id'] | ||||||
| my_new_entity['PartitionKey'] = my_new_entity['eventhub_name'] + ' ' \ | ||||||
| + my_new_entity['fully_qualified_namespace'] + ' ' + my_new_entity['consumer_group'] + ' ' + 'Ownership' | ||||||
| new_entity = self.table_client.create_entity(entity=my_new_entity) | ||||||
| return new_entity | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
|
|
||||||
| @classmethod | ||||||
| def _modify_entity_ownership(cls, ownership): | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| """ | ||||||
| create a dictionary with the new ownership attributes so that it can be updated in tables | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| """ | ||||||
| my_new_entity = { | ||||||
| u'PartitionKey': u'', | ||||||
| u'RowKey': u'', | ||||||
| u'consumer_group': ownership['consumer_group'], | ||||||
| u'fully_qualified_namespace': ownership['fully_qualified_namespace'], | ||||||
| u'eventhub_name': ownership['eventhub_name'], | ||||||
| u'partition_id': ownership['partition_id'], | ||||||
| u'owner_id' : ownership['owner_id'], | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| } | ||||||
| my_new_entity['RowKey'] = my_new_entity['partition_id'] | ||||||
| my_new_entity['PartitionKey'] = my_new_entity['eventhub_name'] + ' ' \ | ||||||
| + my_new_entity['fully_qualified_namespace'] + ' ' + my_new_entity['consumer_group'] + ' ' + 'Ownership' | ||||||
| return my_new_entity | ||||||
|
|
||||||
| @classmethod | ||||||
| def _modify_entity_checkpoint(cls, checkpoint): | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| """ | ||||||
| create a dictionary with the new checkpoint attributes so that it can be updated in tables | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| """ | ||||||
| my_new_entity = { | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nit: Since you're creating a checkpoint entity, renaming this to
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yea I will replace checkpoint_entity that make sense |
||||||
| u'PartitionKey': u'', | ||||||
| u'RowKey': u'', | ||||||
| u'consumer_group': checkpoint['consumer_group'], | ||||||
| u'fully_qualified_namespace': checkpoint['fully_qualified_namespace'], | ||||||
| u'eventhub_name': checkpoint['eventhub_name'], | ||||||
| u'partition_id': checkpoint['partition_id'], | ||||||
| u'offset' : checkpoint['offset'], | ||||||
| u'sequence_number' : checkpoint['sequence_number'],} | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| my_new_entity['RowKey'] = my_new_entity['partition_id'] | ||||||
| my_new_entity['PartitionKey'] = my_new_entity['eventhub_name'] + ' ' \ | ||||||
| + my_new_entity['fully_qualified_namespace'] + ' ' + my_new_entity['consumer_group'] + ' ' + 'Checkpoint' | ||||||
| return my_new_entity | ||||||
|
|
||||||
| def list_ownership(self, fully_qualified_namespace, eventhub_name, consumer_group): | ||||||
| """Retrieves a complete ownership list from the storage table. | ||||||
|
Jg1255 marked this conversation as resolved.
|
||||||
| :param str fully_qualified_namespace: The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| :param str eventhub_name: The name of the specific Event Hub the partition ownerships are associated with, | ||||||
| relative to the Event Hubs namespace that contains it. | ||||||
| :param str consumer_group: The name of the consumer group the ownerships are associated with. | ||||||
| :rtype: Iterable[Dict[str, Any]], Iterable of dictionaries containing partition ownership information: | ||||||
| - `fully_qualified_namespace` (str): The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| - `eventhub_name` (str): The name of the specific Event Hub the checkpoint is associated with, | ||||||
| relative to the Event Hubs namespace that contains it. | ||||||
| - `consumer_group` (str): The name of the consumer group the ownership are associated with. | ||||||
| - `partition_id` (str): The partition ID which the checkpoint is created for. | ||||||
| - `owner_id` (str): A UUID representing the current owner of this partition. | ||||||
| - `last_modified_time` (UTC datetime.datetime): The last time this ownership was claimed. | ||||||
| - `etag` (str): The Etag value for the last time this ownership was modified. Optional depending | ||||||
| on storage implementation. | ||||||
| """ | ||||||
|
swathipil marked this conversation as resolved.
|
||||||
| thePartitionKey = eventhub_name + ' ' + fully_qualified_namespace +' ' + consumer_group + ' '+ 'Ownership' | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| my_filter = "PartitionKey eq '"+ thePartitionKey + "'" | ||||||
| entities = self.table_client.query_entities(my_filter) | ||||||
| ownershiplist = [] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| for entity in entities: | ||||||
| dic = {} | ||||||
| dic[u'fully_qualified_namespace'] = entity[u'fully_qualified_namespace'] | ||||||
| dic[u'eventhub_name'] = entity[u'eventhub_name'] | ||||||
| dic[u'consumer_group'] = entity[u'consumer_group'] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| dic[u'partition_id'] = entity[u'partition_id'] | ||||||
| dic[u'owner_id'] = entity[u'owner_id'] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| dic[u'etag'] = entity.metadata.get('etag') | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| ownershiplist.append(dic) | ||||||
| return ownershiplist | ||||||
|
|
||||||
| def list_checkpoints(self, fully_qualified_namespace, eventhub_name, consumer_group): | ||||||
| """List the updated checkpoints from the storage blob. | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| :param str fully_qualified_namespace: The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| :param str eventhub_name: The name of the specific Event Hub the checkpoints are associated with, relative to | ||||||
| the Event Hubs namespace that contains it. | ||||||
| :param str consumer_group: The name of the consumer group the checkpoints are associated with. | ||||||
| :rtype: Iterable[Dict[str,Any]], Iterable of dictionaries containing partition checkpoint information: | ||||||
| - `fully_qualified_namespace` (str): The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| - `eventhub_name` (str): The name of the specific Event Hub the checkpoints are associated with, | ||||||
| relative to the Event Hubs namespace that contains it. | ||||||
| - `consumer_group` (str): The name of the consumer group the checkpoints are associated with. | ||||||
| - `partition_id` (str): The partition ID which the checkpoint is created for. | ||||||
| - `sequence_number` (int): The sequence number of the :class:`EventData<azure.eventhub.EventData>`. | ||||||
| - `offset` (str): The offset of the :class:`EventData<azure.eventhub.EventData>`. | ||||||
| """ | ||||||
| thePartitionKey = eventhub_name + ' ' + fully_qualified_namespace +' ' + consumer_group + ' '+ 'Checkpoint' | ||||||
| my_filter = "PartitionKey eq '"+ thePartitionKey + "'" | ||||||
| entities = self.table_client.query_entities(my_filter) | ||||||
| checkpointslist = [] | ||||||
| for entity in entities: | ||||||
| dic = {} | ||||||
|
chradek marked this conversation as resolved.
Outdated
|
||||||
| dic[u'fully_qualified_namespace'] = entity[u'fully_qualified_namespace'] | ||||||
| dic[u'eventhub_name'] = entity[u'eventhub_name'] | ||||||
| dic[u'consumer_group'] = entity[u'consumer_group'] | ||||||
| dic[u'partition_id'] = entity[u'partition_id'] | ||||||
| dic[u'sequence_number'] = entity[u'sequence_number'] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| dic[u'offset'] = entity[u'offset'] | ||||||
| checkpointslist.append(dic) | ||||||
| return checkpointslist | ||||||
|
|
||||||
| def update_checkpoint(self, checkpoint): | ||||||
| """Updates the checkpoint using the given information for the offset, associated partition and | ||||||
| consumer group in the storage table. | ||||||
|
Jg1255 marked this conversation as resolved.
|
||||||
| Note: If you plan to implement a custom checkpoint store with the intention of running between | ||||||
| cross-language EventHubs SDKs, it is recommended to persist the offset value as an integer. | ||||||
|
Jg1255 marked this conversation as resolved.
|
||||||
| :param Dict[str,Any] checkpoint: A dict containing checkpoint information: | ||||||
| - `fully_qualified_namespace` (str): The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| - `eventhub_name` (str): The name of the specific Event Hub the checkpoint is associated with, | ||||||
| relative to the Event Hubs namespace that contains it. | ||||||
| - `consumer_group` (str): The name of the consumer group the checkpoint is associated with. | ||||||
| - `partition_id` (str): The partition ID which the checkpoint is created for. | ||||||
| - `sequence_number` (int): The sequence number of the :class:`EventData<azure.eventhub.EventData>` | ||||||
| the new checkpoint will be associated with. | ||||||
| - `offset` (str): The offset of the :class:`EventData<azure.eventhub.EventData>` | ||||||
| the new checkpoint will be associated with. | ||||||
| :rtype: None | ||||||
| """ | ||||||
| try: | ||||||
| theentity = self._modify_entity_checkpoint(checkpoint) | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| self.table_client.update_entity(mode=UpdateMode.REPLACE, entity=theentity) | ||||||
| except ResourceNotFoundError: | ||||||
|
swathipil marked this conversation as resolved.
|
||||||
| self._create_entity_checkpoint(checkpoint) | ||||||
|
|
||||||
| def _upload_ownership(self, ownership): | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| try: | ||||||
| theentity = self._modify_entity_ownership(ownership) | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| entity = self.table_client.update_entity(mode=UpdateMode.REPLACE, entity=theentity, | ||||||
| etag=ownership['etag'], match_condition=MatchConditions.IfNotModified) | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| ownership['etag'] = entity['etag'] | ||||||
| ownership['last_modified_time'] = entity['date'] | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| except (ResourceNotFoundError, ValueError): | ||||||
| try: | ||||||
| entity = self._create_entity_ownership(ownership) | ||||||
| ownership['etag'] = entity['etag'] | ||||||
| ownership['last_modified_time'] = entity['date'] | ||||||
| except ResourceExistsError: | ||||||
| raise'your etag does not match the last time this ownership was modified.' | ||||||
|
Jg1255 marked this conversation as resolved.
Outdated
|
||||||
| except ResourceModifiedError: | ||||||
| raise'your etag does not match the last time this ownership was modified.' | ||||||
|
|
||||||
| def list_checkpoints(self, namespace, eventhub, consumergroup, **kwargs): | ||||||
| pass | ||||||
|
|
||||||
| def update_checkpoint(self, checkpoint, **kwargs): | ||||||
| pass | ||||||
| def _claim_one_partition(self, ownership): | ||||||
| self._upload_ownership(ownership) | ||||||
| return ownership | ||||||
|
|
||||||
| def claim_ownership(self, ownershiplist, **kwargs): | ||||||
| pass | ||||||
| def claim_ownership(self, ownershiplist): | ||||||
| # type: (Iterable[Dict[str, Any]], Any) -> Iterable[Dict[str, Any]] | ||||||
| """Tries to claim ownership for a list of specified partitions. | ||||||
|
swathipil marked this conversation as resolved.
|
||||||
| :param Iterable[Dict[str,Any]] ownership_list: Iterable of dictionaries containing all the ownerships to claim. | ||||||
| :rtype: Iterable[Dict[str,Any]], Iterable of dictionaries containing partition ownership information: | ||||||
| - `fully_qualified_namespace` (str): The fully qualified namespace that the Event Hub belongs to. | ||||||
| The format is like "<namespace>.servicebus.windows.net". | ||||||
| - `eventhub_name` (str): The name of the specific Event Hub the checkpoint is associated with, | ||||||
| relative to the Event Hubs namespace that contains it. | ||||||
| - `consumer_group` (str): The name of the consumer group the ownership are associated with. | ||||||
| - `partition_id` (str): The partition ID which the checkpoint is created for. | ||||||
| - `owner_id` (str): A UUID representing the owner attempting to claim this partition. | ||||||
| - `last_modified_time` (UTC datetime.datetime): The last time this ownership was claimed. | ||||||
| - `etag` (str): The Etag value for the last time this ownership was modified. Optional depending | ||||||
| on storage implementation. | ||||||
| """ | ||||||
| newlist = [] | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. snake case + consistency with
Suggested change
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok |
||||||
| for x in ownershiplist: | ||||||
| newlist.append(self._claim_one_partition(x)) | ||||||
| return newlist | ||||||
|
chradek marked this conversation as resolved.
Outdated
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,4 @@ | ||
| -e ../../../tools/azure-sdk-tools | ||
| ../../core/azure-core | ||
| ../../tables/azure-data-tables | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we copy the the tables code into a
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Jg1255 I think you can remove this line now |
||
| -e ../../../tools/azure-devtools | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -64,7 +64,7 @@ | |||||
| ] | ||||||
| ), | ||||||
| install_requires=[ | ||||||
| "azure-core<2.0.0,>=1.2.2", | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can we also add the dependencies required for vendored tables?
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. and also the tables dependencies to
(should be these 3:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok |
||||||
| "azure-core<2.0.0,>=1.14.0", | ||||||
| ], | ||||||
| extras_require={ | ||||||
| ":python_version<'3.0'": ["azure-nspkg"], | ||||||
|
|
||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this class should be extending the base
CheckpointStoreclass. You can look at the storage-blob implementation to see how that's being done there.