With the development of computing and network technologies, numerous Big-Data-based analytic applications have their roles in today's production environment. In general, the workflow of the analytic applications can be divided into two phases: collecting data and analyzing. In the ideal case, since new information is not generated during data collection, it is expected to apply as much available computing resource as possible in the analyzing phase while spending the least computing resource during data collection, to minimize the cost. Nonetheless, in the real case, considerable resource may be consumed in the data collection phase.
In accordance with a plurality of implementations of the subject matter as described herein, there is provided a solution for accessing a storage device via a data plane of a switch. At a data plane of the switch, a response signal for a first packet transmitted from the switch to the storage device is received from a storage device, where the first packet encapsulates a packet sequence number and first data to be transmitted by the switch, and the response signal contains the packet sequence number. In response to determining that the response signal is a negative acknowledgement response signal, a first state sequence number of the switch is updated with the packet sequence number included in the response signal, where the first state sequence number represents a sequence number of a packet to be transmitted by the switch. The first state sequence number and second data to be transmitted by the switch are encapsulated in a second packet, and the second packet is transmitted to the storage device.
The Summary is to introduce a selection of concepts in a simplified form that are further described below in the Detailed Description. This Summary is not intended to identify key features or essential features of the subject matter as described herein, nor is it intended to be used to limit the scope of the subject matter as described herein.
Throughout the drawings, the same or similar reference symbols refer to the same or similar components.
The subject matter as described herein will now be discussed with reference to several example implementations. It is to be understood that these implementations are discussed only for the purpose of enabling those skilled in the art to better understand and thus implement the subject matter as described herein, rather than suggesting any limitations on the scope of the subject matter as described herein.
As used herein, the term “includes” and its variants are to be read as open terms that mean “includes, but is not limited to.” The term “based on” is to be read as “based at least in part on.” The term “one implementation” and “an implementation” are to be read as “at least one implementation.” The term “another implementation” is to be read as “at least one other implementation.” The terms “first,” “second,” and the like may refer to different or same objects. Other definitions, either explicit or implicit, may be included below.
A loss-tolerant application is an application that is not sensitive to loss of data to be processed. For example, some data analytic applications focus on mining out useful semantics from the statistics of data and therefore are not sensitive to loss of data. Examples of these applications include a packet-mirror-based telemetry system (e.g. EverFlow, NetSight, and the like) and a logging analysis system (e.g. an audit log of a search engine). In accordance with implementations of the subject matter as described herein, direct access to a storage device is implemented using a data plane of a switch in a loss-tolerant application. When a transmission error occurs in a packet, a sequence number in the packet may be used to encapsulate or package the next packet to be transmitted, so as to satisfy the requirements of reliable transmission. In this way, the subject matter as described herein can save computing resources and thus lower the requirements on the computing resources during the data collection phase without considering the problem of data loss. Reference now will be made to the drawings to describe various implementations of the subject matter.
Non-Volatile Memory express (NVMe) transmission refers to a non-volatile memory based transmission specification, which intends to provide reliable storage access and data transmission, for example, via a PCIe bus and the like. Based on the transmission via a PCIe bus and the like, network storage of the data center can be supported via an NVMe (NVMe over Fabric, NVMe-oF) extension. A RDMA-supporting fabric structure may be selected from InfiniBand (IB), RDMA over Converged Ethernet (RoCE), Internet Wide Area RDMA Protocol (iWARP) and the like. The implementations of the subject matter will be described mainly in connection with those scenarios. However, it would be appreciated that the implementations may also be applied to any other appropriate standards or protocols.
As shown in
At block 302, an NVMe-oF connection is established between the switch 102 and the storage device 112. For example, an NVMe connection and an RDMA reliable connection (RC) are established between the switch 102 and the storage device 112, respectively, to establish the NVMe-oF connection between the switch 102 and the storage device 112. For example, after the NVMe connection and the RDMA RC connection are established, metadata exchange can be performed between the switch 102 and the storage device 112.
At block 304, after the NVMe-oF connection between the switch 102 and the storage device 112 is established, the control plane 108 of the switch 102 offloads the metadata, or supplies the metadata to the data plane 110 of the switch 102. For example, the control plane 108 may provide the metadata to the data plane 110 via an Application Programming Interface (API) of the data plane 110. Upon receiving the metadata, the data plane 110 can implement the function of encapsulating or packaging a packet based on the received metadata.
For example, the switch 102 can receive data 106, such as an EverFlow packet, from one or more data sources. At block 402, based on a first state sequence number of the switch 102, the data received by the switch 102 from the data source are encapsulated or packaged in a packet, for example, a NVMe-oF packet. For the RDMA RC type, reliable transmission can be achieved using a Packet Sequence Number (PSN) field in an IB Base Transport header. In order to achieve reliable transmission, the switch 102 needs to maintain the state sequence number, representing the sequence number of the packet to be transmitted (also referred to as Packet Sequence Number, PSN). Otherwise, the packet transmitted by the switch 102 is probably rejected by the RNIC at the server 104.
In some implementations, the first state sequence number may be maintained by the data plane 110 of the switch 102, which represents the sequence number of the packet to be transmitted.
For example, the data 106 and the first state sequence number are encapsulated as part of the NVMe-oF packet. In some implementations, the data plane 110 of the switch 102 may include a plurality of virtual interfaces, such as Queue Pairs (QPs). For example, a first state sequence number are maintained for each virtual interface. For ease of discussion, description will be made with reference to one QP, but it would be appreciated that the method described herein can be applied to any other QP(s).
In some implementations, based on the RDMA over Converged Ethernet version 2 (RoCEv2) and NVMe-oF specification, a valid packet includes headers such as an Ethernet header, Internet Protocol (IP) header, User Datagram Protocol (UDP) header, IB Base Transport header, NVMe command capsule, and the like. The metadata for crafting those headers can be acquired through a metadata offloading process as illustrated at block 304 in
At block 404, the first state sequence number is incremented by 1. In this way, the updated first state sequence number can be used for encapsulating the next packet.
At block 406, it is determined whether the switch does not receive any response signal for a predetermined number of packets subsequent to a packet for which a most recent response signal has been received. For convenience, G is used to denote the predetermined number, which is also referred to as a threshold value. The response signal herein includes an Acknowledge response signal (ACK) and a Negative Acknowledgement response signal (NACK).
If it is determined at block 406 that the switch does not receive any response signal for G packets subsequent to the packet for which the most recent response signal has been received, it can be determined that the receiver is currently at a “black hole” state as shown in
If it is determined at block 406 that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received (i.e., a “black hole” state), the method 400 proceeds to block 408. At block 408, the first state sequence number is updated based on a second state sequence number, where the second sequence number represents a sequence number of the packet for which the most recent acknowledgement response signal has been received. The second state sequence number may be maintained by the data plane 110 of the switch 102. For example, the packet encapsulated at block 402 can be regarded as the first packet subsequent to the packet for which the most recent acknowledgement response signal has been received. Therefore, the first state number may be reset to a second state number plus one (1). Then, the method 400 proceeds to block 410 where the switch 102 transmits the encapsulated packet to the storage device 112.
If it is determined at block 406 that it is not the case that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received, the method 400 proceeds to block 410. At block 410, the switch 102 transmits the encapsulated packet to the storage device 112. In this way, in the data plane 110 of the switch 102, the problem of trapping into the “black hole” state can be solved.
In some implementations, a counter may be relied on to determine whether the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received, thereby determining whether a “black hole” state has been entered. In order to count the number of packets that have been transmitted, the counter can be increased by one every time when a packet is transmitted. In addition, if a response signal (ACK or NACK) is received, the counter will be reset to 0. Therefore, when the counter reaches a predetermined number or threshold value (G), it can be determined that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received. Otherwise, when the counter does not reach a predetermined number or threshold value (G), it can be determined that it is not the case that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received.
At block 412, if necessary, the data plane 110 of the switch 102 can notify the control plane 108 of the switch 102. In some implementations, the control plane 108 of the switch 102 may be notified via a data amount based notification mechanism. For example, the data plane 110 of the switch 102 may maintain a counter which represents the number of packets that have been transmitted. If the counter reaches a threshold value, the control plane 108 of the switch 102 will be notified. The server 104 is not capable of determining the amount of data received by the storage device 112. Therefore, upon receiving the notification of the data plane 110, the control plane 108 of the switch 102 may send a message to the server 104 to notify the server 104 that the amount of the received data has reached the threshold value. At this time, the server 104 has acquired enough data and thus can perform subsequent processing on the data. Hereinafter, reference will be made to
At block 502, the control plane 108 of the switch 102 receives a notification sent by the data plane 108 of the switch 102. As described above with reference to block 412 of
At block 504, the control plane 108 of the switch 102 sends a notification to the server 104. Upon receiving the notification, the server 104 can process the data received by the storage device 112. Since the storage device 112 directly participates in the data transmission process but the processor of the server 104 does not, the server 104 cannot acquire when the data transmission is completed, when data processing is started, and the like. By means of the method 500, the server 104 can acquire the above information for subsequent data processing.
At block 602, the data plane 110 of the switch 102 receives a response signal from the storage device 112. At block 604, the data plane 110 of the switch 102 determines whether the response signal is an acknowledgement signal (ACK) or a negative acknowledgement signal (NACK). If it is determined at block 604 that the response signal is NACK, at block 606, the data plane 110 of the switch 102 updates or resets the first state sequence number of the switch 102 based on the sequence number contained or specified in the NACK. Reference will be made to
In general, RDMA accomplishes reliable data transmission using a Priority Flow Control (PFC) mechanism. However, in some circumstances, some packets may still be dropped by the RDMA Network Interface Card (RNIC) due to invalid checksum caused by bit-error. Moreover, a RDMA receiver may also reject some packets due to insufficient resource. In those cases, the RDMA receiver may transmit, to the RDMA transmitter, NACK containing an expected PSN of a next packet to be transmitted by RDMA. Then, the RDMA transmitter needs to trigger a go-back-N retransmission mechanism to implement retransmission.
For example, in the example of
Returning to
If it is determined at block 604 that the response signal is ACK, the second state signal is updated at block 610, based on the sequence number contained or specified in the ACK. For example, the second state sequence number may be updated as the sequence number contained or specified in the ACK.
After completing execution of the NVMe command, the storage device 112 transmits an NVMe-oF completion packet to the switch 102. Since the RDMA-supporting NVMe-oF data transmission is established on RDMA RC, from the RDMA's perspective, the NVMe completion packet is just a payload and needs a response from the switch 102. Therefore, the switch 102, as a receive terminal of the RDMA QP of the storage device 112, needs to maintain the expected sequence number of the RDMA QP of the storage device 112, which may be represented as ePSN.
At block 702, upon receiving the NVMe-oF completion packet, the switch 102 acquires a QP number (QPN) and a Packet Sequence Number (PSN) corresponding to the QP.
At block 704, it is determined whether PSN is greater than, equal to, or less than ePSN. If it is determined at block 704 that PSN is equal to ePSN, at block 706, the switch 102 transmits an acknowledgement signal to the storage device 112 and updates ePSN (e.g. increasing ePSN by 1). For example, an ACK packet can be built by adding an appropriate header and truncating the received payload.
If it is determined at block 704 that PSN is less than ePSN, at block 708, the switch 102 sends an acknowledgement response to the storage device 112 but does not update the ePSN. If it is determined at block 704 that PSN is greater than ePSN, at block 710, the switch 102 sends a negative acknowledgement response signal to the storage device 112 but does not update the ePSN. For example, a NACK packet can be built by adding an appropriate header and truncating the received payload.
The NVMe-oF completion packet carries a status of the storage device 112. If necessary, the data plane 110 of the switch 102 may transmit to the control plane 108 a notification on the status of the storage device 112. For example, the data plane 110 may examine the NVMe-oF completion packet to determine the status of the storage device 112. If the control plane 110 of the switch 102 determines that the status of the storage device 112 is abnormal (e.g. disconnected or the like), the data plane 110 of the switch 102 may notify the control plane 108 of the switch 102.
In some implementations, a Keep Alive command may be transmitted periodically based on a timer, to guarantee that the RDMA connection between the switch 102 and the storage device 112 is in a normal state. For example, according to the RDMA-supporting NVMe-oF specification, it is required to support a Keep Alive command. The transmission frequency for the Keep Alive command is kept low (e.g., every few seconds), thereby avoiding occupying too much resource of the control plane.
At block 802, in response to expiry of the timer, the switch 102 determines to transmit the Keep Alive command. The timer can be triggered periodically, where the period can be a few seconds, for example.
At block 804, the switch 102 creates a Keep Alive command, for example, via queues in an Admin Queue according to the NVMe protocol.
At block 806, the Packet Sequence Number (PSN) of the system queue is increased by 1. At block 808, the packet of the Keep Alive command is transmitted to the server 104 to notify the latter that the connection therebetween is valid and further prevent the latter from disconnecting and releasing resource.
In accordance with a plurality of implementations of the subject matter as described herein, the switch receives data from a data source and stores the data in a remote storage device. The channel from the data source to the remote storage device can be abstracted as a logic flow. The data source appends data to the logic flow, where the data contain a corresponding logical address in the logic flow. In addition, when the data from the data source are encapsulated in a packet, the switch can dynamically allocate a physical address to the data. For example, the physical address may be a physical address according to the NVMe protocol. The switch can maintain a register in the data plane for indexing a next physical address of the data received from the data source to be stored, encapsulate the data and the corresponding physical address thereof in a packet, and transmit the packet to the remote storage device. For example, the remote storage device can parse the physical address of the data according to the NVMe protocol and store the data at a corresponding location.
In some implementations, a data appending operation can be implemented based on a multilevel page table. The data plane of the switch 102 can include a plurality of registers for storing respective offsets of the multilevel page table to record the current storage status. For example, with respect to a two-level page table, the data plane of the switch 102 may include three registers for storing three offsets, respectively. Moreover, a multilevel page table can be stored in the storage device 112 of the server 104 to lower the requirements imposed on the storage capacity of the data plane of the switch 102.
When the first offset or the second offset is moving, a new page table entry can be written into the storage device 112. Processing of metadata, such as page table entries and the like, can be implemented via the metadata transmission pipeline 206 as shown in
In some implementations, the mirror function of the switch 102 can be applied to a packet to obtain a mirror packet. The packet can be transmitted to the storage device 112 via an encapsulation operation. In addition, the mirror packet is processed to determine the metadata (e.g. entries of the multilevel page table), and the metadata of the mirror packet is transmitted to the storage device 112.
The lower the generation frequency of a higher level metadata is, the greater the loss impact will be; the higher the generation frequency of a lower level metadata is, the less the loss impact will be. For example, data loss of an entry in a first level page table (a high level) in a multilevel page table probably causes all entries in the entire second level page table not available, thereby bringing about serious impact. In some implementations, the transmission strategy is varied with the level of the metadata. For example, with respect to a high level metadata (e.g. first level page table entries), reliable transmission may be performed by the control plane, such as a retransmission mechanism. With respect to a low level metadata (e.g., second level page table entries), the reliability can be improved through redundant transmission. For example, R entries are transmitted during each transmission, where R entries include 1 new entry and R−1 old entries. Suppose that the loss ratio is l and the probability of loss of level-2 metadata can be reduced to lR by the redundant transmission solution. Furthermore, for the data per se, no special processing is required.
At block 1402, the data plane of the switch receives from the storage device a response signal for a first packet transmitted from the switch to the storage device. The first packet encapsulates therein a packet sequence number and first data received by the switch from a data source. The response signal contains the packet sequence number.
At block 1404, the data plane of the switch determines whether the response signal is an acknowledgement signal or a negative acknowledgement signal.
If it is determined at block 1404 that the response signal is a negative acknowledgement signal, the method 1400 moves to block 1406 where the data plane of the switch updates a first state sequence number of the switch as a packet sequence number contained or specified in the response signal. The first state sequence number represents a sequence number of a packet to be transmitted by the switch.
At block 1408, the data plane of the switch encapsulates the first state sequence number and second data received by the switch from a data source in a second packet. For example, the switch can receive first data from the first data source and second data from the second data source, where the first data source may be identical to or different than the second data source.
At block 1410, the data plane of the switch transmits the second packet to the storage device.
In some implementations, the method 1400 further includes: determining, based on a logical address of second data, a physical address of the second data in the storage device via a multilevel page table. For example, as shown in
In some implementations, the logical address includes a plurality of offsets associated with the multilevel page table, where the plurality of offsets are stored in the data plane. For example, in the implementation of
In some implementations, the multilevel page table is stored in the storage device.
In some implementations, a high level page table entry in the multilevel page table is transmitted via a control plane of the switch.
In some implementations, a low level page table entry in the multilevel page table is transmitted through redundant transmission.
In some implementations, the method 1400 further includes: determining whether the switch does not receive any response signal for a predetermined number of packets subsequent to a packet for which a most recent response signal has been received; and in response to determining that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received, updating the first state sequence number based on a second state sequence number of the switch, the second sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received. For example, the first state sequence number can be updated through blocks 406 and 408 as shown in
In some implementations, the method 1400 further includes: in response to determining that the response signal is a negative acknowledgement response signal, updating a second state sequence number of the switch with the first state sequence number minus one, the second state sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received. For example, the second state sequence number is updated through the method as shown in block 608 in
In some implementations, If it is determined at block 1404 that the response signal is an acknowledgement response signal, the method 1400 moves to block 1412 where the second state sequence number is updated with the packet sequence number contained or specified in the response signal. For example, the second state sequence number can be updated through the method as shown in block 610 in
Some exemplary implementations of the subject matter as described herein will be listed below. In a first aspect, a method implemented at a switch is provided in the subject matter as described herein. The method comprises at a data plane of the switch: receiving, from a storage device, a response signal for a first packet transmitted from the switch to the storage device, the first packet encapsulating a packet sequence number and first data to be transmitted by the switch, and the response signal including the packet sequence number; in response to determining that the response signal is a negative acknowledgement response signal, updating a first state sequence number of the switch with the packet sequence number included in the response signal, the first state sequence number representing a sequence number of a packet to be transmitted by the switch; encapsulating the first state sequence number and second data to be transmitted by the switch in a second packet; and transmitting the second packet to the storage device.
In some implementations, the method further comprises determining, based on a logical address of the second data, a physical address of the second data in the storage device via a multilevel page table.
In some implementations, the logical address comprises a plurality of offsets associated with the multilevel page table, the plurality of offsets being stored in the data plane.
In some implementations, the multilevel page table is stored in the storage device.
In some implementations, a high level page table entry in the multilevel page table is transmitted via a control plane of the switch.
In some implementations, a low level page table entry in the multilevel page table is transmitted through redundant transmission.
In some implementations, the method further comprises determining whether the switch does not receive any response signal for a predetermined number of packets subsequent to a packet for which a most recent response signal has been received; and in response to determining that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received, updating the first state sequence number based on a second state sequence number of the switch, the second sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In some implementations, the method further comprises in response to determining that the response signal is a negative acknowledgement response signal, updating a second state sequence number of the switch with the first state sequence number minus one, the second state sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In some implementations, the method further comprises in response to determining that the response signal is an acknowledgement response signal, updating a second state sequence number of the switch with the packet sequence number included in the response signal, the second state sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In a second aspect, a switch is provided in the subject matter as described herein. The switch comprises: a data plane configured to receive, from a storage device, a response signal for a first packet transmitted from the switch to the storage device, the first packet encapsulating a packet sequence number and first data to be transmitted by the switch, and the response signal including the packet sequence number; in response to determining that the response signal is a negative acknowledgement response signal, update a first state sequence number of the switch with the packet sequence number included in the response signal, the first state sequence number representing a sequence number of a packet to be transmitted by the switch; encapsulate the first state sequence number and second data to be transmitted by the switch in a second packet; and transmit the second packet to the storage device.
In some implementations, the data plane is further configured to: determine, based on a logical address of the second data, a physical address of the second data in the storage device via a multilevel page table.
In some implementations, the logical address comprises a plurality of offsets associated with the multilevel page table, the plurality of offsets being stored in the data plane.
In some implementations, the multilevel page table is stored in the storage device.
In some implementations, a high level page table entry in the multilevel page table is transmitted via a control plane of the switch.
In some implementations, a low level page table entry in the multilevel page table is transmitted through redundant transmission.
In some implementations, the data plane is further configured to: determine whether the switch does not receive any response signal for a predetermined number of packets subsequent to a packet for which a most recent response signal has been received; and in response to determining that the switch does not receive any response signal for the predetermined number of packets subsequent to the packet for which the most recent response signal has been received, update the first state sequence number based on a second state sequence number of the switch, the second sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In some implementations, the data plane is further configured to: in response to determining that the response signal is a negative acknowledgement response signal, update a second state sequence number of the switch with the first state sequence number minus one, the second state sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In some implementations, the data plane is further configured to: in response to determining that the response signal is an acknowledgement response signal, update a second state sequence number of the switch with the packet sequence number included in the response signal, the second state sequence number representing a sequence number of a packet for which a most recent acknowledgement response signal has been received.
In a third aspect, an apparatus is provided in the subject matter as described herein. The apparatus comprises: a processing unit; and a memory coupled to the processing unit and having instructions stored thereon, the instructions, when executed by the processing unit, causing the apparatus to perform the method in accordance with the first aspect of the subject matter as described herein.
In a fourth aspect, a computer program product is provided in the subject matter as described herein. The computer program product is tangibly stored in a computer storage medium and comprising computer executable instructions which cause, when executed by an apparatus, the apparatus to perform the method in accordance with the first aspect of the subject matter as described herein.
In a fifth aspect, a computer readable storage medium is provided in the subject matter as described herein, which has computer executable instructions stored thereon. The computer executable instructions cause, when executed by an apparatus, the apparatus to perform the method in accordance with the first aspect of the subject matter as described herein.
The functionally described herein can be performed, at least in part, by one or more hardware logic components. For example, and without limitation, illustrative types of hardware logic components that can be used include Field-Programmable Gate Arrays (FPGAs), Application-specific Integrated Circuits (ASICs), Application-specific Standard Products (ASSPs), System-on-a-chip systems (SOCs), Complex Programmable Logic Devices (CPLDs), and the like.
Program code for carrying out methods of the subject matter as described herein may be written in any combination of one or more programming languages. These program codes may be provided to a processor or controller of a general purpose computer, special purpose computer, or other programmable data processing apparatus, such that the program codes, when executed by the processor or controller, cause the functions/operations specified in the flowcharts and/or block diagrams to be implemented. The program code may execute entirely on a machine, partly on the machine, as a stand-alone software package, partly on the machine and partly on a remote machine or entirely on the remote machine or server.
In the context of this disclosure, a machine readable medium may be any tangible medium that may contain, or store a program for use by or in connection with an instruction execution system, apparatus, or device. The machine readable medium may be a machine readable signal medium or a machine readable storage medium. A machine readable medium may include but not limited to an electronic, magnetic, optical, electromagnetic, infrared, or semiconductor system, apparatus, or device, or any suitable combination of the foregoing. More specific examples of the machine readable storage medium would include an electrical connection having one or more wires, a portable computer diskette, a hard disk, a random access memory (RAM), a read-only memory (ROM), an erasable programmable read-only memory (EPROM or Flash memory), an optical fiber, a portable compact disc read-only memory (CD-ROM), an optical storage device, a magnetic storage device, or any suitable combination of the foregoing.
Further, while operations are depicted in a particular order, this should not be understood as requiring that such operations be performed in the particular order shown or in sequential order, or that all illustrated operations be performed, to achieve desirable results. In certain circumstances, multitasking and parallel processing may be advantageous. Likewise, while several specific implementation details are contained in the above discussions, these should not be construed as limitations on the scope of the subject matter as described herein, but rather as descriptions of features that may be specific to particular implementations. Certain features that are described in the context of separate implementations may also be implemented in combination in a single implementation. Conversely, various features that are described in the context of a single implementation may also be implemented in multiple implementations separately or in any suitable sub-combination.
Although the subject matter has been described in language specific to structural features and/or methodological acts, it is to be understood that the subject matter specified in the appended claims is not necessarily limited to the specific features or acts described above. Rather, the specific features and acts described above are disclosed as example forms of implementing the claims.
Number | Date | Country | Kind |
---|---|---|---|
202110901026.3 | Aug 2021 | CN | national |
Filing Document | Filing Date | Country | Kind |
---|---|---|---|
PCT/US2022/037956 | 7/22/2022 | WO |