This application is based upon and claims the benefit of priority from Japanese Patent Application No. 2017-007293, filed on Jan. 19, 2017; the entire contents of which are incorporated herein by reference.
Embodiments described herein relate generally to a storage control device, a storage control method, and a computer readable recording medium.
In the related art, a storage system including a plurality of block storage devices such as a hard disk drive (HDD) and a solid state drive (SSD) has been known. For example, an all flash array (AFA) including a plurality of SSDs has been known. In general, in a storage system such as an AFA, as the number of times of writing to an SSD increases, the failure rate of the SSD increases. For this reason, the period during which the AFA can be used without exchanging the SSD becomes shorter as the number of times of writing to the SSD increases. As a method of writing data in the storage system, for example, a log-structured method has been known. In the log-structured method, an address of a data write destination is determined as an unwritten area regardless of an address designated by a write command transmitted from a host device. As one of features of the log-structured method, garbage collection (GC) occurs as necessary.
However, in the related art, it was difficult to extend the lifetime of the storage system.
In general, according to one embodiment, a storage control device has, as a unit of storage, a stripe including one or more chunks being storage areas included in any of a plurality of storages. The storage control device includes a first selector, a divider, and a determiner. The first selector is configured to select a stripe from a plurality of stripes on the basis of the number of one or more pieces of valid first data included in the stripe. The divider is configured to divide the chunk included in the stripe selected by the first selector into a plurality of partial chunks. The determiner is configured to determine the partial chunk that is to be a target of garbage collection on the basis of the number of one or more pieces of the valid first data included in the partial chunk.
Exemplary embodiments of a storage control device, a storage control method, and a computer readable recording medium will be described below in detail with reference to the accompanying drawings.
First, an example of a hardware configuration of a storage control device according to an embodiment will be described.
Example of Hardware Configuration
Hereinafter, in the case of not distinguishing between the SSDs 5-1 to 5-n, the SSDs are simply referred to as SSDs 5.
The host I/F 1 receives a request for a write command, a read command, a trim command, a shutdown command, or the like from a host device. The host device may be arbitrary. The host device is, for example, a personal computer, a smart device, and the like.
The write command is a command to write first data in the SSDs 5. The write command includes the first data and a first address specifying the first data. The first data may be arbitrary. The first data is, for example, user data used by a user of the host device.
The read command is a command to read the first data from the SSD 5. The read command includes the first address.
The trim command is a request to invalidate the first data specified by the first address designated by the host device. The first data specified by the first address designated by the trim command is erased in a case where garbage collection is performed.
The shutdown command is a request to shut down the storage control device 100.
The processor 2 reads a program from an auxiliary storage device such as the SSD 5 and executes the program.
The main memory 3 is a storage area used as a work area by the processor 2.
The switch 4 connects the processor 2 and the SSDs 5-1 to 5-n. Alternatively, in a case where the number of SSDs 5 is small and the processor 2 and the SSDs 5 can be directly connected thereto, the switch 4 may not be provided.
The SSDs 5 store data. The data to be stored in the SSDs 5 are, for example, the first data, the second data, the control data, and the like above described.
The second data is data for restoring the first data. The format of the second data may be arbitrary. The second data is, for example, a redundant format, a reed-solomon (RS) code, a Hamming code, or the like used in redundant array of inexpensive disks (RAID)-1 to RAID-6. In addition, for example, the second data may simply be a copy of the first data.
The control data is a table or the like used for controlling the storage control device 100. The control data is, for example, first address information (refer to
In addition, in the example of
Next, an example of a functional configuration of the storage control device 100 according to the embodiment will be described.
Example of Functional Configuration
In
Outline of Operations
The buffer 10 temporarily stores data that is to be a target of processing. The buffer 10 is realized by, for example, the main memory 3. The buffer 10 stores, for example, the first data designated by the write command received by the receiver 12.
The storages 11-1 to 11-n store data. The storages 11-1 to 11-n are realized by, for example, the SSDs 5-1 to 5-n. The data stored in the storages 11-1 to 11-n are, for example, the first data, the second data, the control data, and the like. Hereinafter, in the case of not distinguishing between the storages 11-1 to 11-n, the storages are simply referred to as storages 11.
The receiver 12 receives a request for a write command, a read command, a trim command, a shutdown command, or the like from the host device.
The generator 13 generates a stripe which is a unit of storing one or more pieces of first data and one or more pieces of second data. The stripe includes one or more chunks included in any of the plurality of storages 11. The chunk is a storage area having a predetermined size. Identification information which identifies an unused stripe is stored in the buffer 10, the storage 11, and the like by a method such as first in, first out (FIFO). Identification information which identifies a stripe is, for example, a stripe ID or the like.
In addition, when the process of storing one or more pieces of first data in the storage 11 is to be performed, the generator 13 generates the above-mentioned one or more pieces of the second data from one or more pieces of the first data.
When one or more pieces of the first data and one or more pieces of the second data are to be stored in the storage 11, the selector 14 selects a stripe that is to store one or more pieces of the first data and one or more pieces of the second data. The selector 14 sequentially selects a stripe that is to store one or more pieces of the first data and one or more pieces of the second data from the stripes identified by the identification information of unused stripes stored in, for example, the head of FIFO.
In addition, when a garbage collection process of the storage 11 is to be performed, the selector 14 selects a stripe that is to be a target of garbage collection.
In addition, when a stripe combination process is to be performed, the selector 14 selects a plurality of stripes of which the chuck sizes are equal to or smaller than a threshold value (fourth threshold value) and a stripe of copy destination of which the chuck size is equal to or larger than a threshold value (fifth threshold value).
Example of Stripe
In the example of
In addition, each chunk included in the stripe may not be stored by consecutively using the plurality of adjacent storages 11. A combination of the storages 11 that are to store the chunks may be arbitrary.
Returning to
The chunks for storing one or more pieces of the second data may be arbitrary. The storage controller 15 determines at least one of the chunks for storing one or more pieces of the first data and the chunks for storing one or more pieces of the second data for example on the basis of the state of the storages 11-1 to 11-n.
The states of the storages 11-1 to 11-n can be, for example, the total write capacities of the storages 11-1 to 11-n. Since the second data is required to be updated every time when the first data included in the same stripe as the second data is updated, in some cases, the update frequency of the second data may be higher than the first data. For this reason, the storage controller 15 can further extend the lifetime of the storages 11-1 to 11-n by writing the second data in the storages 11 with smaller total write capacities.
In addition, the states of the storages 11-1 to 11-n can be, for example, the write ratios of the storages 11-1 to 11-n. The write ratio is a ratio of the total write capacity of the storage 11 to the capacity of the storage 11. For example, in a case where the capacity of the storage 11 is 128 GB and the total write capacity is 64 GB, the write ratio is 50%. In addition, for example, in a case where the capacity of the storage 11 is 128 GB and the total write capacity is 512 GB, the write ratio is 400%.
The lifetime of the storage system becomes longer in the state where all the storages 11 included in the storage system are exhausted at the same speed than in the state where only the specific storage 11 included in the storage system tends to be exhausted.
For this reason, in a case where the capacities of the storages 11-1 to 11-n are the same, the storage controller 15 can use the total write capacity as the states of the storages 11-1 to 11-n. In addition, in a case where the capacities of the storages 11-1 to 11-n are not the same, the storage controller can use the write ratios as the states of the storages 11-1 to 11-n.
For example, in a case where the capacity of the storage 11-1 is 128 GB, the capacity of the storage 11-2 is 512 GB, and the size of the data that is to be an object of writing is 128 GB, it is possible to ease the increase of the write ratio by writing the data in the storage 11-2 rather than writing the data in the storage 11-1. The storage controller 15 can extend the lifetime of the storage system by determining at least one of the chunks for storing one or more pieces of the first data and a chunk for storing one or more pieces of the second data on the basis of the write ratio. The storage controller 15 determines the chunk included in the storage 11 of which write ratio is smaller than that of the other storages 11 as a chunk that stores one or more pieces of the second data.
In addition, for example, the storage controller 15 can randomly determines at least one of the chunk that stores one or more pieces of the first data and the chunk that stores one or more pieces of the second data. As a result, it is possible to prevent the second data having the update frequency higher than that of the first data from being stored in the same storage 11 at all times, so that it is possible to further extend the lifetime of the storages 11-1 to 11-n.
The divider 16 divides the chunk into a plurality of partial chunks. The number of divisions may be arbitrary. In the description of the embodiment, for the simplicity, a case where the number of divisions is two will be described as an example. For example, in a case where the chunk size is four and the number of divisions is two, the divider 16 divides the chunk having a chunk size of four into two partial chunks having a chunk size of two.
The determiner 17 determines the partial chunk that is to be a target of garbage collection on the basis of the number of valid data included in the partial chunk. The valid data indicates valid first data. Details of the valid data will be described later.
The combiner 18 copies the valid data included in the plurality of stripes including the chunk of which the chuck size is equal to or smaller than a threshold value (fourth threshold value) to an unused stripe including the chunk of which the chuck size is equal to or larger than a threshold value (fifth threshold value). Then, the combiner 18 deletes the plurality of stripes. Therefore, the combiner combines the plurality of stripes with one stripe.
The operations of each functional block will be described in detail below with reference to a flowchart. First, an example of a write command process according to the embodiment will be described.
Example of Write Command Process
Next, the generator 13 determines whether or not the number of the first data (or the data size of the first data stored in the buffer 10) stored in the buffer 10 is equal to or larger than a threshold value (step S4). The threshold value can be determined arbitrarily. The threshold value is determined on the basis of, for example, the data size necessary to generate one stripe. In a case where the number of first data stored in the buffer 10 is not equal to or larger than the threshold value (step S4, No), the process returns to step S1.
In a case where the number of first data stored in the buffer 10 is equal to or larger than the threshold value (step S4, Yes), the generator 13 generates one or more pieces of the second data for restoring the first data from one or more pieces of the first data (step S5).
Next, the selector 14 selects a stripe that is to store one or more pieces of the first data and one or more pieces of the second data (step S6).
Next, the storage controller 15 writes one or more pieces of the first data and one or more pieces of the second data in the chunk included in the stripe selected by the process of step S6 (step S7).
Next, the storage controller 15 receives a completion notice indicating the completion of writing from each SSD5 (step S8).
Next, the storage controller 15 updates the first address information and the second address information (step S9). Herein, examples of the first address information and the second address information will be described.
Example of First Address Information
The first address is an address of the first data designated by the write command received from the host device. In the host device, the storage position of the first data is specified by the first address.
The storage ID is identification information which identifies the storage 11. The second address is an address indicating a position in the storage 11 with the storage ID, where the first data is stored. In the storage control device 100, the storage position of the first data is specified by the storage ID and the second address.
In the example of
With the first address information described above, it is possible to associate the first address used in the host device, the storage ID used in the storage control device 100, and the second address.
In addition, in the example of
Example of Second Address Information
The storage controller 15 updates the first address information (refer to
Next, returning to
Example of Stripe Information
The use flag is information indicating whether or not a stripe is used. For example, a case where the use flag is 0 indicates that the stripe is not used, and a case where the use flag is 1 indicates that the stripe is used. The storage controller 15 updates the use flag of the stripe selected in step S6 from 0 to 1.
The stripe ID is identification information which identifies the stripe.
The chunk size is the size of a chunk included in the stripe.
The second data position is information indicating the storage 11 in which the second data is stored. In the example of
The storage ID, the start address, the number of valid data (first half), and the number of valid data (second half) indicate the storage position of the chunk and the number of valid data included in the chunk. The storage ID, the start address, the number of valid data (first half), and the number of valid data (second half) are retained corresponding to the number of chunks included in the stripe. The number of valid data is the number of valid data described above.
The storage ID is identification information which identifies the storage 11 to which the chunk is to be allocated.
The start address is an address indicating the storage area at the head of the chunk.
The number of valid data (first half) indicates the number of valid data in the first half of the area that stores the chunk. In the example where the stripe ID is 1 in
The number of valid data (the second half) indicates the number of valid data in the second half of the area that stores the chunk. In the example with the stripe ID of 1 in
Herein, details of the valid data and the invalid data will be described. The first data stored in the SSD5 wrote by the process of step S7 are all valid data. However, in a case where the first data designated by the first address specified by the write command has already been stored in the storage 11 (in the case of updating the first data or in the case of moving the first data by garbage collection described below), the before-updating first data included in the stripe already stored in the storage 11 is invalid data.
The storage controller 15 updates the stripe information of the stripe that stores the before-updating first data. Specifically, in a case where the before-updating first data is stored in the first half of the chunk, the storage controller 15 reduces the number of valid data (first half), and in a case where the before-updating first data is stored in the second half of the chunk, the storage controller reduces the number of valid data (second half).
It can be specified from the first address information (refer to
For example, in a case where the after-updating first data specified by the first address 0x0000 is stored in the second address 0x1234 of the storage 11-5 with the storage ID of 5, the storage controller 15 updates the first line of the first address information in
Since the first address information and the second address information are updated as described above, the valid data and the invalid data can be specified from the first address information and the second address information.
Specific Example of Valid Data
The first address 0x0000 acquired from the second address information of the storage 11-5 by using the second address 0x1234 and the storage ID and the second address {5, 0x1234} acquired from the first address information by using the first address 0x0000 are matched. Therefore, the first data stored in the second address 0x1234 of the storage 11-5 is valid data.
Specific Example of Invalid Data
The first address 0x0000 acquired from the second address information of the storage 11-5 by using the second address 0x1000 and the storage ID and the second address {5, 0x1234} acquired from the first address information by using the first address 0x0000 are not matched. Therefore, the first data stored in the second address 0x0000 of the storage 11-5 is invalid data.
As another example of the invalid data, the first data specified by the first address designated by the above-mentioned trim command, for example, may be exemplified.
Example of Stripe Including Invalid Data
Next, an example of a read command process according to the embodiment will be described.
Example of Read Command Process
Next, the storage controller 15 refers to the first address information by using the first address included in the read command received by the process of step S21 (step S22). The storage controller 15 specifies the storage 11 that stores the first data specified by the first address and the second address of the storage 11 by the process of step S22.
Next, the storage controller 15 reads the first data from the second address of the storage 11 specified by the process of step S22 (step S23).
Next, the receiver 12 transmits the first data read by the process of step S23 as a response to the read command received by the process of step S21 (step S24).
Next, an example of a garbage collection process according to the embodiment will be described.
Example of Garbage Collection Process
Next, the divider 16 divides the chunk included in the stripe selected by the process of step S31 into partial chunks (step S32). Herein, with respect to chunk division, a case where the chunk included in the stripe of
Next, the determiner 17 determines a partial chunk that is to be a target of garbage collection on the basis of the number of valid data included in the partial chunk (step S33). Specifically, the determiner 17 refers to the number of valid data (first half) and the number of valid data (second half) included in the stripe information of the stripe selected by the process of step S31. The number of valid data (first half) indicates the number of valid data included in the first half partial chunk. The number of valid data (the second half) indicates the number of valid data included in the second half partial chunk. The determiner 17 determines the partial chunk having a smaller number of valid data as a target of garbage collection. In addition, in a case where the numbers of valid data included in the two partial chunks are the same, the determiner 17 determines one of the partial chunks as a target of garbage collection.
Next, returning to
Specifically, the storage controller 15 updates the chunk size of the stripe information of the stripe having a stripe ID of 1 from four to two, updates the number of valid data (first half) from two to one, and updates the number of valid data (second half) from one to one (in this case, there is no change in the number of valid data (the second half)). In addition, the storage controller 15 newly generates {1, 100, 2, 0, 1, 0x0002, 0, 1} as the stripe information of the stripe having a stripe ID of 100. In addition, the stripe ID of the newly generated stripe is selected from the unused number.
Next, returning to
In a case where the number of valid data is not equal to or larger than the threshold value (step S35, No), the process returns to step S31.
In a case where the number of valid data is equal to or larger than the threshold value (step S35, Yes), the storage controller 15 determines valid/invalid data included in the partial chunk determined by the process of step S36 (step S36). Next, as the flow of the step S23 and S24 in the above-mentioned
Next, the storage controller 15 updates the stripe information (step S43). Specifically, the storage controller 15 updates the stripe information of the stripe including the partial chunk that is to be a target of garbage collection and newly generates the stripe information of the stripe including valid data that is moved by garbage collection.
Specifically, the storage controller 15 updates the use flag of the stripe information of the stripe having a stripe ID of 100 from 1 to 0 and updates the number of valid data (second half) from 1 to 0. In addition, the storage controller 15 newly generates {1, 200, 4, 0, 1, 0x0200, 2, 2} as the stripe information of the stripe having a stripe ID of 200.
As described in step S33 of
Next, an example of a stripe combination process will be described.
Example of Combination Process
Next, the selector 14 selects a stripe of copy-destination of valid data included in the stripe selected by the process of step S51 (step S52). The selector 14 selects a stripe of which, for example, the chuck size is equal to or larger than a threshold value (fifth threshold value). In addition, the selector 14 selects a stripe identified by identification information of an unused stripe, for example, stored at the head of a FIFO.
Next, the combiner 18 copies valid data included in the plurality of stripes selected by the process of step S51 to the stripe selected by the process of step S52 (step S53).
Next, the combiner 18 deletes a plurality of stripes of which the chuck size selected by the process of step S51 is equal to or smaller than the threshold value (fourth threshold value) (step S54).
Next, the storage controller 15 updates the first address information (refer to
Next, the storage controller 15 updates the stripe information (refer to
By the process of step S56, it is possible to prevent an increase in the data size of the stripe information. In addition, in a case where the table size of the stripe information is fixed, it is possible to prevent an increase in the number of entries stored as the stripe information.
The selector 14 may select stripes that are to be objects of combination by a method other than the above-described method of step S51. The selector 14 may select two stripes each including, for example, two adjacent chunks that are included in the same storage 11 and have chuck sizes, each of which is equal to or smaller than the threshold value.
As described above, in the storage control device 100 according to the embodiment, the selector 14 selects the stripes from the plurality of stripes on the basis of the number of valid data included in the stripes. The divider 16 divides the chunk included in the stripe selected by the selector 14 into a plurality of partial chunks. Then, the determiner 17 determines a partial chunk that is to be a target of garbage collection on the basis of the number of valid data included in the partial chunk.
As a result, according to the storage control device 100 according to the embodiment, movement of the first data of which updating (overwriting) has not been processed for a long time is less likely to occur, so that it is possible to ease the increase of the number of times of writing in the storage system (storages 11-1 to 11-n). Therefore, it further extends the lifetime of the storage system.
In the above description of the embodiment, for the simplicity, a case where the chunk is divided into two partial chunks by the divider 16 has been described, but the number of divisions may be arbitrary. For example, in a case where the number of divisions is four, the number of valid data (first half) and the number of valid data (second half) of the stripe information of
For example, in a case where the chunk size of the stripe is 20 and the start address is 0x0000, the four storage areas are a first storage area of 0x0000 to 0x0004, a second storage area of 0x0005 to 0x0009, a third storage area of 0x000A to 0x000E, and a fourth storage area of 0x000F to 0x0013.
In the above description of the embodiment, for the simplicity, a case where the chunk sizes of the partial chunks after division are the same has been described, but the chunk sizes of the partial chunks may be arbitrary. For example, in the case of dividing a chunk having a chunk size of four into two partial chunks, the chunk size of the stripe information in
In a case where the chunk is divided into four partial chunks by the divider 16, the number of partial chunks determined as a target of garbage collection by the determiner 17 may be arbitrary. The determiner 17 may determine the partial chunk of which the number of valid data included in the partial chunk is smaller than the number of the valid data included in the other partial chunks as a partial chunk that is to be a target of garbage collection. In addition, for example, the determiner 17 may determine the partial chunk of which the number of valid data included in partial chunks is equal to or smaller than a threshold value (second threshold) among the plurality of partial chunks as a partial chunk that is to be a target of garbage collection.
In addition, the number of partial chunks that are to be targets of garbage collection determined by the determiner 17 is not limited to one, and the number may be arbitrary. For example, the determiner 17 may determine three partial chunks that are to be targets of garbage collection among the four partial chunks acquired by dividing the chunk.
In addition, even in a case where the number of valid data for every four storage areas is retained in the stripe information, by referring to the number of valid data in the first and second storage areas and the number of valid data in the third and fourth storage areas, it is possible to cope with the case the chunk is divided into two partial chunks.
Next, Modified Example 1 of the embodiment will be described. In the description of Modified Example 1 of the embodiment, the components similar to those of the embodiment will be omitted, and the components different from those of the embodiment will be described. In Modified Example 1 of the embodiment, a case where the minimum unit is determined as the data size of the partial chunk will be described.
In addition, in the example of
In the storage control device 100 according to Modified Example 1 of the embodiment, the divider 16 divides the chunk into the plurality of partial chunks while maintaining the positional relationship of the plurality of second data. Therefore, in the storage control device 100 according to Modified Example 1 of the embodiment, when the predetermined number of storages 11 fails, it is possible to restore the first data, and it is possible to further extend the lifetime of the storages 11-1 to 11-n.
Next, Modified Example 2 of the embodiment will be described. In the description of Modified Example 2 of the embodiment, the components similar to those of the embodiment will be omitted, and the components different from those of the embodiment will be described. In Modified Example 2 of the embodiment, a case where the divider 16 performs several times of the division process on one stripe will be described.
First, the selector 14 selects a stripe that is to be a target of garbage collection (step S31). Next, the divider 16 divides the chunk included in the stripe selected by the process of step S31 into partial chunks (step S32-1).
Next, the divider 16 determines whether or not to further divide the partial chunk acquired by the process of step S32-1 (step S32-2). For example, in a case where the chunk size of the partial chunk acquired in the case of further dividing the partial chunk acquired by the process of step S32-1 is equal to or larger than the threshold value (the third threshold value), the divider 16 determines to further divide. In addition, for example, in a case where the data size of the stripe information or the number of entries is equal to or smaller than the threshold value, for example, the divider 16 determines to further divide the partial chunk acquired by the process of step S32-1.
In a case where the partial chunk is further divided (step S32-2, Yes), the process returns to step S32-1.
In a case where the partial chunk is not further divided (step S32-2, No), the process proceeds to step S33. The description of the processes of steps S33 to S43 is the same as the description of the garbage collection process according to the embodiment, and thus, the description will be omitted.
The divider 16 according to Modified Example 2 of the embodiment divides one stripe more finely than the divider 16 according to the embodiment. As a result, one stripe can be divided into a storage area having a relatively high update frequency (a partial chunk of which the number of valid data is equal to or smaller than a threshold value) and a storage area having a relatively low update frequency (a partial chunk of which the number of valid data is larger than the threshold value). Specifically, the storage controller 15 can generate the stripe including the first data having a relatively high update frequency by performing garbage collection on a stripe including partial chunks of which the number of valid data is equal to or smaller than a threshold value. In addition, the combiner 18 can generate a stripe including the first data having a relatively low update frequency by performing the above-described combination process on the partial chunk of which the number of valid data is larger than a threshold value.
According to the storage control device 100 according to Modified Example 2 of the embodiment, the locality of reference of the first data is further taken into consideration, so that it is possible to further ease the increase of the number of times of writing to the storages 11-1 to 11-n. As a result, it is possible to further extend the lifetime of the storages 11-1 to 11-n.
The function block (refer to
The program executed by the storage control device 100 according to the embodiment is stored in a computer-readable recording medium such as a CD-ROM, a memory card, a CD-R, and a digital versatile disk (DVD) as a file in an installable format or an executable format and provided as a computer program product.
In addition, the program executed by the storage control device 100 according to the embodiment may be configured to be stored on a computer connected to a network such as the Internet and provided by being downloaded via the network. In addition, the program executed by the storage control device 100 according to the embodiment may be configured to be provided via a network such as the Internet without downloading.
In addition, the program to be executed by the storage control device 100 according to the embodiment may be configured to be incorporated in advance in a ROM or the like and provided.
The program executed by the storage control device 100 according to the embodiment has a module configuration including functions realizable by the program among the functional configurations of the storage control device 100 according to the embodiment.
The functions realized by the program is loaded on the main memory 3 by the processor 2 reading and executing the program from the recording medium such as the SSD 5. Namely, the functions realized by the program are generated on the main memory 3.
In addition, a portion of the functions of the storage control device 100 according to the embodiment may be realized by one or more hardware such as an integrated circuit (IC). The IC is, for example, a processor that executes dedicated processes. In addition, for example, the IC is a field-programmable gate array (FPGA).
In addition, in a case where functions are realized by using a plurality of processors, each processor may realize one of the functions or may realize two or more of the functions.
While certain embodiments have been described, these embodiments have been presented by way of example only, and are not intended to limit the scope of the inventions. Indeed, the novel embodiments described herein may be embodied in a variety of other forms; furthermore, various omissions, substitutions and changes in the form of the embodiments described herein may be made without departing from the spirit of the inventions. The accompanying claims and their equivalents are intended to cover such forms or modifications as would fall within the scope and spirit of the inventions.
Number | Date | Country | Kind |
---|---|---|---|
2017-007293 | Jan 2017 | JP | national |