Storage systems may utilize an array of storage devices to provide high performance scale-out storage. A storage system may use various metadata to process I/O operations. Such metadata may be cached in primary memory (e.g., volatile RAM) to avoid accessing relatively slower non-volatile storage devices (e.g., solid-state drives or SSDs). Primary memory may also be used for other purposes, such as maintaining a journal of pending writes. System performance may be limited by primary memory capacity and/or by how primary memory capacity is allocated.
Described herein are embodiments of a process that can be used to balance the allocation of primary memory for different purposes. In some embodiments, primary memory allocation is balanced dynamically based on observed client I/O patterns. Related system embodiments are also described.
According to an aspect of the disclosure, a method comprises: calculating a relationship of a first number of read operations and a second number of write operations of a plurality of I/O operations made to a storage system having a volatile memory; selecting a memory allocation scheme based upon the relationship between the first number of read operations and the second number of write operations; and applying the memory allocation scheme, wherein applying the memory allocation scheme comprises allocating capacity of the volatile memory based upon selected allocation scheme. In some embodiments, calculating the relationship of a first number of read operations and the second number of write operations comprises calculating a moving average of the relationship of the first number of read operations and the second number of write operations. In certain embodiments, selecting a memory allocation scheme is further based upon moving averages of read I/O latency and write I/O latency.
In one embodiment, the method further comprises, according to the selected memory allocation scheme, allocating a first amount of volatile memory as a metadata cache and allocating a second amount of volatile memory as a journal. In some embodiments, mapping logical block addresses (LBA) of the storage system to chunk hashes and mapping the chunk hashes to physical storage locations on storage devices of the storage system.
s In certain embodiments, the method further comprises de-allocating capacity of the volatile memory based upon the selected allocation scheme. In some embodiments, applying the memory allocation scheme further comprises determining if the memory allocation scheme should be applied. In one embodiment, the method further comprises using hysteresis to determine if the memory allocation scheme should be applied. In particular embodiments, calculating the relationship of the first number of read operations and the second number of write operations comprises calculating a ratio of the first number of read operations and the second number of write operations, the method further comprising selecting a first memory allocation scheme if the ratio exceeds a first threshold; selecting a second memory allocation scheme if ratio exceeds a second threshold; and selecting a third memory allocation scheme if the ratio exceeds neither the first threshold nor the second threshold.
According to another aspect of the disclosure, a system comprises a processor, a volatile memory, and a non-volatile memory. The non-volatile memory may store computer program code that when executed on the processor causes the processor to execute a process operable to perform one or more embodiments of the method described hereinabove.
According to yet another aspect of the disclosure, a computer program product may be tangibly embodied in a non-transitory computer-readable medium, the computer-readable medium storing program instructions that are executable to perform one or more embodiments of the methods described hereinabove.
The foregoing features may be more fully understood from the following description of the drawings in which:
The drawings are not necessarily to scale, or inclusive of all elements of a system, emphasis instead generally being placed upon illustrating the concepts, structures, and techniques sought to be protected herein.
Before describing embodiments of the structures and techniques sought to be protected herein, some terms are explained. As used herein, the term “storage system” may be broadly construed so as to encompass, for example, private or public cloud computing systems for storing data as well as systems for storing data comprising virtual infrastructure and those not comprising virtual infrastructure. As used herein, the terms “client” and “user” may refer to any person, system, or other entity that uses a storage system to read/write data.
As used herein, the term “storage device” may refer to any non-volatile memory (NVM) device, including hard disk drives (HDDs), flash devices (e.g., NAND flash devices), and next generation NVM devices, any of which can be accessed locally and/or remotely (e.g., via a storage attached network (SAN)). The term “storage array” may be used herein to refer to any collection of storage devices.
As used herein, the term “random access storage device” may refer to any non-volatile random access memory (i.e., non-volatile memory wherein data can be read or written in generally the same amount of time irrespective of the physical location of data inside the memory). Non-limiting examples of random access storage devices may include NAND-based flash memory, single level cell (SLC) flash, multilevel cell (MLC) flash, and next generation non-volatile memory (NVM). For simplicity of explanation, the term “disk” may be used synonymously with “storage device” herein.
While vendor-specific terminology may be used herein to facilitate understanding, it is understood that the concepts, techniques, and structures sought to be protected herein are not limited to use with any specific commercial products.
The primary memory 118 can be any type of memory having access times that are significantly faster compared to the storage devices 108. In some embodiments, primary memory 118 may be provided as dynamic random-access memory (DRAM). In certain embodiments, primary memory 118 may be provided as synchronous DRAM (SDRAM). In one embodiment, primary memory 118 may be provided as double data rate SDRAM (DDR SDRAM), such as DDR3 SDRAM.
In the embodiment shown, the subsystems 102 include a routing subsystem 102a, a control subsystem 102b, a data subsystem 102c, and a journal subsystem 102d. In one embodiment, the subsystems 102 may be provided as software components, i.e., computer program code that, when executed on a processor, may cause a computer to perform functionality described herein. In a certain embodiment, the storage system 100 includes an operating system (OS) and one or more of the subsystems 102 may be provided as user space processes executable by the OS. In other embodiments, a subsystem 102 may be provided, at least in part, as hardware such as digital signal processor (DSP) or an application specific integrated circuit (ASIC) configured to perform functionality described herein.
The routing subsystem 102a may be configured to receive I/O operations from clients 116 using an external application programming interface (API) and to translate the I/O operations into internal commands. In some embodiments, the routing subsystem 102a is configured to receive Small Computer System Interface (SCSI) commands from clients. In certain embodiments, the system 100 may store data in fixed-size chunks, for example 4K chunks, where each chunk may have a unique hash value (referred to herein as a “chunk hash”). In such embodiments, the routing subsystem 102a may be configured to split client data (or “user data”) into fixed-size chunks and to calculate the corresponding chunk hashes. In one embodiment, chunk hashes are calculated using Secure Hash Algorithm 1 (SHA-1) processing. In some embodiments, a chunk corresponds to a fixed number of contiguous blocks within a storage device.
The control subsystem 102b may be configured to maintain a mapping between I/O addresses associated with data and the corresponding chunk hashes. As shown in
The data subsystem 102c may be configured to maintain a mapping between chunk hashes and physical storage addresses (i.e., storage locations within the storage array 106 and/or within individual storage devices 108). As shown in
It will be appreciated that combinations of the A2H table 112 and the H2P table 114 can provide multiple levels of indirection between the logical (or “I/O”) address a client 116 uses to access data and the physical address where that data is stored. Among other advantages, this may give the storage system 100 freedom to relocate data within the storage array 106 without affecting a client's 116 access to that data.
In addition to storing data, the storage array 106 may store various types of metadata used by the system 100. Such metadata may include information within the A2H table 112 and information within the H2P table 114. In some embodiments, the system also maintains reference counts for chunk hashes as metadata. Metadata may be used by the various subsystems 102 during the course of processing I/O operations. Moreover, some I/O operations may result in changes to metadata, as discussed further below.
To increase efficiency, metadata 120 may be cached within primary memory 118. This can allow the various subsystems 102 to efficiently process I/O operations without having to fetch metadata from the storage array 106. The size of the metadata cache 120 may be limited by available memory resources. In various embodiments, the metadata cache 120 may be too small to store all system metadata. If processing of a particular I/O operation requires access to uncached metadata, it may be necessary for a subsystem 102 to fetch the uncached metadata from the storage array 106. Depending on the cache policy, the fetched metadata may be added to the metadata cache 120, while other metadata may be demoted (or “evicted”) from metadata cache 120 as needed.
In some embodiments, the system 100 provides a mechanism whereby subsystems 102 can make changes to metadata without directly writing those changes to the storage array 106. In particular, subsystems 102a-102c can change metadata directly within the cache 120 in primary memory 118 and then notify the journal subsystem 102d of the metadata changes. The journal subsystem 102d may be responsible for ensuring that the metadata changes are written to the storage array 106 (or “hardened”).
The journal subsystem 102d may be configured to maintain a journal 122 of pending metadata changes (i.e., metadata changes that have not yet been written to the storage array 106). The journal 122 may be stored in primary memory 118, as shown. At some future time, the journal subsystem 102d may commit the metadata changes from the journal 122 to non-volatile storage 106 using a process referred to as “de-staging.” By maintaining a journal 122 of metadata changes, the journal subsystem 102d can amortize writes to the storage array 106. In some embodiments, the journal subsystem 102d may run the de-staging process on a periodic basis.
The size of the journal 122 may be limited based on the amount of primary memory 118 allocated thereto. Thus, at any given time, the journal 122 has a fixed size meaning that it can store a limited number of pending metadata changes. When the journal 122 becomes full, the journal subsystem 102d may be forced to commence the de-staging process to free space within the journal 122, thereby forcing de-staging to run prematurely (i.e., before it is otherwise scheduled to run).
It is appreciated that system performance may be limited by primary memory 118 and, in particular, the amount of primary memory 118 allocated for the metadata cache 120 and/or for the journal 122. If insufficient memory 118 is allocated for the metadata cache 120, I/O operation processing may require fetching metadata from the storage array 106. On the other hand, if insufficient memory 118 is allocated for the journal 122, the system 100 may be forced to run the de-staging process frequently, increasing the number of writes to the storage array 106.
In some embodiments, the system 100 includes features used in EMC® XTREMIO®.
Referring to
In some embodiments, read operation processing may benefit by increasing the size of the metadata cache 120 and decreasing the size of the journal 122 because read operations do not generally cause metadata changes that would benefit from increased journal 122 size. On the other hand, write operation processing may benefit from a larger journal 122 because, particularly using content-based addressing, a write operation may require updating the A2H table 112 and/or the H2P table 114 (
In various embodiments, a storage system 100 (
Referring to
At block 304, a relationship of a number of read operations and a number of write operations may be calculated (e.g., using information obtained at block 302). In various embodiments, block 304 includes calculating a ratio of the number of read operations and the number of write operations. In some embodiments, block 304 may include calculating a moving average of the relationship of the number of read and write operations. For example, the ratio of the number read operations and the number of write operations may be calculated every M minutes, and the last N calculations may be averaged.
At block 306, the relationship of the number of read operations and the number of write operations may be used to select a memory allocation scheme. In certain embodiments, a fixed number of memory allocation schemes are defined to accommodate expected I/O patterns. In some embodiments, the set of possible memory allocation schemes includes a “read only” memory allocation scheme, a “write only” memory allocation scheme, and a “read-write” memory allocation scheme. The “read only” scheme may be selected if the ratio of reads to writes exceeds a first threshold (e.g., 95:5), the “write only” scheme may be selected if the ratio of writes to reads exceeds a second threshold (e.g., 95:5), and the “read-write” scheme may be selected if neither condition is met. In some embodiments, a predefined “read only” scheme comprises allocating significantly more primary memory for metadata compared to journaling, whereas a predefined “write only” scheme comprises allocating significantly more primary memory to journaling compared to metadata.
s In addition to using the read-write ratio to select a memory allocation scheme, a scheme may be selected or adjusted based upon I/O performance statistics, according to some embodiments. For example, in one embodiment, average read and write latency for the last M minutes (i.e., moving averages) may be calculated. If average write latency exceeds a predetermined threshold, a new memory allocation scheme may be selected (or the previously selected scheme may be adjusted) to provide more journal space. Conversely, if average read latency exceeds a predetermined threshold, the memory allocation scheme may be selected/adjust to provide more metadata space.
In some embodiments, at block 308, the process can include a hysteresis-like mechanism to filter fast changes and prevent the memory allocation scheme from changing rapidly. For example, if the memory allocation scheme changes when the read-write ratio exceeds a given threshold T1, the scheme may change again only when the read-write ratio falls below a second threshold T2, where T2<T1.
At blocks 310 and 312, the selected memory allocation scheme may be applied by allocating unused primary memory capacity and/or by de-allocating existing allocated memory. In some embodiments, if primary memory was previously allocated for metadata and/or journaling, some or all of that previously allocated memory may be de-allocated (or “freed”) to make space for the new allocation scheme (block 310). For example, if the amount of metadata space is to be increased, existing journal memory may be de-allocated by running the de-staging process and the freed memory may be allocated to metadata. As another example, if the amount of journal space is to be increased, existing metadata space may be freed by evicting entries from cache and allocating the freed space for journaling.
In some embodiments, the process 300 may be executed in a continuous fashion to provide adaptive memory allocation by continuously monitor client read/write patterns.
In the embodiment shown, computer instructions 412 include router instructions 412a that may correspond to an implementation of a router 102a (
The volatile memory 404 may be configured to store journal data 404a and metadata 404b. In some embodiments, the amount of memory allocated for the journal data 404a and/or the metadata 404b is determined processing illustrated in
Processing may be implemented in hardware, software, or a combination of the two. In various embodiments, processing is provided by computer programs executing on programmable computers/machines that each includes a processor, a storage medium or other article of manufacture that is readable by the processor (including volatile and non-volatile memory and/or storage elements), at least one input device, and one or more output devices. Program code may be applied to data entered using an input device to perform processing and to generate output information.
The system can perform processing, at least in part, via a computer program product, (e.g., in a machine-readable storage device), for execution by, or to control the operation of, data processing apparatus (e.g., a programmable processor, a computer, or multiple computers). Each such program may be implemented in a high level procedural or object-oriented programming language to communicate with a computer system. However, the programs may be implemented in assembly or machine language. The language may be a compiled or an interpreted language and it may be deployed in any form, including as a stand-alone program or as a module, component, subroutine, or other unit suitable for use in a computing environment. A computer program may be deployed to be executed on one computer or on multiple computers at one site or distributed across multiple sites and interconnected by a communication network. A computer program may be stored on a storage medium or device (e.g., CD-ROM, hard disk, or magnetic diskette) that is readable by a general or special purpose programmable computer for configuring and operating the computer when the storage medium or device is read by the computer. Processing may also be implemented as a machine-readable storage medium, configured with a computer program, where upon execution, instructions in the computer program cause the computer to operate.
Processing may be performed by one or more programmable processors executing one or more computer programs to perform the functions of the system. All or part of the system may be implemented as special purpose logic circuitry (e.g., an FPGA (field programmable gate array) and/or an ASIC (application-specific integrated circuit)).
All references cited herein are hereby incorporated herein by reference in their entirety.
Having described certain embodiments, which serve to illustrate various concepts, structures, and techniques sought to be protected herein, it will be apparent to those of ordinary skill in the art that other embodiments incorporating these concepts, structures, and techniques may be used. Elements of different embodiments described hereinabove may be combined to form other embodiments not specifically set forth above and, further, elements described in the context of a single embodiment may be provided separately or in any suitable sub-combination. Accordingly, it is submitted that scope of protection sought herein should not be limited to the described embodiments but rather should be limited only by the spirit and scope of the following claims.
Number | Name | Date | Kind |
---|---|---|---|
5204958 | Cheng et al. | Apr 1993 | A |
5453998 | Dang | Sep 1995 | A |
5603001 | Sukegawa et al. | Feb 1997 | A |
6085198 | Skinner et al. | Jul 2000 | A |
6125399 | Hamilton | Sep 2000 | A |
6671694 | Baskins et al. | Dec 2003 | B2 |
7073115 | English et al. | Jul 2006 | B2 |
7203796 | Muppalaneni et al. | Apr 2007 | B1 |
7472249 | Cholleti et al. | Dec 2008 | B2 |
7908484 | Haukka et al. | Mar 2011 | B2 |
8386425 | Kadayam et al. | Feb 2013 | B1 |
8386433 | Kadayam | Feb 2013 | B1 |
8799705 | Hallak et al. | Aug 2014 | B2 |
9026729 | Hallak et al. | May 2015 | B1 |
9063910 | Hallak et al. | Jun 2015 | B1 |
9104326 | Frank et al. | Aug 2015 | B2 |
9703789 | Bowman et al. | Jul 2017 | B2 |
20030061227 | Baskins et al. | Mar 2003 | A1 |
20040267835 | Zwilling et al. | Dec 2004 | A1 |
20060271540 | Williams | Nov 2006 | A1 |
20070089045 | Corbett et al. | Apr 2007 | A1 |
20070240125 | Degenhardt et al. | Oct 2007 | A1 |
20080082969 | Agha et al. | Apr 2008 | A1 |
20080235793 | Schunter et al. | Sep 2008 | A1 |
20090216953 | Rossi | Aug 2009 | A1 |
20100005233 | Hosokawa | Jan 2010 | A1 |
20100250611 | Krishnamurthy | Sep 2010 | A1 |
20110087854 | Rushworth et al. | Apr 2011 | A1 |
20110137916 | Deen et al. | Jun 2011 | A1 |
20110302587 | Nishikawa et al. | Dec 2011 | A1 |
20120023384 | Naradasi et al. | Jan 2012 | A1 |
20120124282 | Frank et al. | May 2012 | A1 |
20120158736 | Milby | Jun 2012 | A1 |
20120204077 | D'Abreu et al. | Aug 2012 | A1 |
20120233432 | Feldman | Sep 2012 | A1 |
20130036289 | Welnicki et al. | Feb 2013 | A1 |
20130212074 | Romanski et al. | Aug 2013 | A1 |
20130290285 | Gopal et al. | Oct 2013 | A1 |
20130318053 | Provenzano et al. | Nov 2013 | A1 |
20130326318 | Haswell | Dec 2013 | A1 |
20130346716 | Resch | Dec 2013 | A1 |
20140019764 | Gopal et al. | Jan 2014 | A1 |
20140032992 | Hara et al. | Jan 2014 | A1 |
20140122823 | Gupta et al. | May 2014 | A1 |
20140188805 | Vijayan | Jul 2014 | A1 |
20140244598 | Haustein et al. | Aug 2014 | A1 |
20150019507 | Aronovich | Jan 2015 | A1 |
20150098563 | Gulley et al. | Apr 2015 | A1 |
20150149789 | Seo | May 2015 | A1 |
20150186215 | Das Sharma et al. | Jul 2015 | A1 |
20150199244 | Venkatachalam et al. | Jul 2015 | A1 |
20150205663 | Sundaram et al. | Jul 2015 | A1 |
20160011941 | He et al. | Jan 2016 | A1 |
20160110252 | Hyun et al. | Apr 2016 | A1 |
20160132270 | Miki | May 2016 | A1 |
20170123995 | Freyensee et al. | May 2017 | A1 |
20170255515 | Kim et al. | Sep 2017 | A1 |
Number | Date | Country |
---|---|---|
2014-206884 | Oct 2014 | JP |
Entry |
---|
Notice of Allowance dated Apr. 26, 2016 corresponding to U.S. Appl. No. 14/228,982; 9 Pages. |
Request for Continued Examination (RCE) and Response to Final Office Action dated Feb. 25, 2016 corresponding to U.S. Appl. No. 14/228,971; Response filed on May 25, 2016; 12 Pages. |
U.S. Office Action dated Jun. 10, 2016 corresponding to U.S. Appl. No. 14/228,971; 27 Pages. |
Response to Office Action dated Jan. 12, 2016 corresponding to U.S. Appl. No. 14/229,491; Response filed on Jun. 2, 2016; 7 Pages. |
Notice of Allowance dated Jul. 25, 2016 corresponding to U.S. Appl. No. 14/229,491; 10 Pages. |
Office Action dated Jul. 15, 2016 corresponding to U.S. Appl. No. 14/751,652; 11 Pages. |
U.S. Non-Final Office Action dated Apr. 21, 2017 for U.S. Appl. No. 15/079,215; 53 Pages. |
EMC Corporation, “Introduction to the EMC XtremIO Storage Array;” Version 4.0; White Paper—A Detailed Review; Apr. 2015; 65 Pages. |
Vijay Swami, “XtremIO Hardware/Software Overview & Architecture Deepdive;” EMC On-Line Blog; Nov. 13, 2013; Retrieved from < http://vjswami.com/2013/11/13/xtremio-hardwaresoftware-overview-architecture-deepdive/>; 18 Pages. |
U.S. Appl. No. 14/228,971, filed Mar. 28, 2014, Shoikhet et al. |
U.S. Appl. No. 14/228,360, filed Mar. 28, 2014, Lempel et al. |
U.S. Appl. No. 14/228,982, filed Mar. 28, 2014, Ben-Moshe et al. |
U.S. Appl. No. 14/229,491, filed Mar. 28, 2014, Luz et al. |
U.S. Appl. No. 14/496,359, filed Sep. 25, 2014, Love et al. |
U.S. Appl. No. 14/751,652, filed Jun. 26, 2015, Natanzon et al. |
U.S. Appl. No. 14/979,890, filed Dec. 28, 2015, Meiri et al. |
U.S. Appl. No. 15/085,168, filed Mar. 30, 2016, Meiri et al. |
U.S. Appl. No. 15/081,137, filed Mar. 25, 2016, Natanzon et al. |
U.S. Appl. No. 15/079,205, filed Mar. 24, 2016, Dorfman et al. |
U.S. Appl. No. 15/079,208, filed Mar. 24, 2016, Ben-Moshe et al. |
U.S. Appl. No. 15/079,215, filed Mar. 24, 2016, Krakov et al. |
U.S. Office Action dated Aug. 27, 2015 corresponding to U.S. Appl. No. 14/228,971; 23 Pages. |
Response to U.S. Office Action dated Aug. 27, 2015 corresponding to U.S. Appl. No. 14/228,971; Response filed on Jan. 14, 2016; 10 Pages. |
U.S. Final Office Action dated Feb. 25, 2016 corresponding to U.S. Appl. No. 14/228,971; 27 Pages. |
U.S. Office Action dated Sep. 22, 2015 corresponding to U.S. Appl. No. 14/228,982; 17 Pages. |
Response to U.S. Office Action dated Sep. 22, 2015 corresponding to U.S. Appl. No. 14/228,982; Response filed on Feb. 1, 2016; 10 Pages. |
U.S. Office Action dated Jan. 12, 2016 corresponding to U.S. Appl. No. 14/229,491; 12 Pages. |
U.S. Office Action dated Dec. 4, 2014 corresponding to U.S. Appl. No. 14/496,262; 16 Pages. |
Response to U.S. Office Action dated Dec. 4, 2014 corresponding to U.S. Appl. No. 14/496,262; Response filed on Dec. 11, 2014; 12 Pages. |
U.S. Notice of Allowance dated Jan. 9, 2015 corresponding to U.S. Appl. No. 14/496,262; 8 Pages. |
312 Amendment filed Feb. 5, 2015 corresponding to U.S. Appl. No. 14/496,262; 9 Pages. |
U.S. Notice of Allowance dated Mar. 16, 2015 corresponding to U.S. Appl. No. 14/620,631; 10 Pages. |
U.S. Appl. No. 15/282,546, filed Sep. 30, 2016, Kucherov et al. |
U.S. Appl. No. 15/281,593,. filed Sep. 30, 2016, Braunschvig et al. |
U.S. Appl. No. 15/281,597, filed Sep. 30, 2016, Bigman. |
Request for Continued Examination (RCE) and Response to U.S. Final Office Action dated Oct. 4, 2016 corresponding to U.S. Appl. No. 14/228,971; RCE and Response filed on Jan. 4, 217; 19 Pages. |
U.S. Non-Final Office Action dated Feb. 9, 2017 for 14/228,971; 38 Pages. |
Response to U.S. Non-Final Office Action dated Feb. 9, 2017 for U.S. Appl. No. 14/228,971; Response filed on May 9, 2017; 12 Pages. |
U.S. Final Office Action dated Jun. 20, 2017 for U.S. Appl. No. 14/228,971; 40 Pages. |
Response to Office Action dated Jun. 2, 2017 from U.S. Appl. No. 15/079,208, filed Sep. 5, 2017; 10 Pages. |
Response to U.S. Non-Final Office Action dated Apr. 21, 2017 for U.S. Appl. No. 15/079,215; Response filed on Jul. 21, 2017; 9 Pages. |
Notice of Allowance dated Sep. 22, 2017 for U.S. Appl. No. 15/079,215; 9 Pages. |
Response (w/RCE) to U.S. Final Office Action dated Jun. 20, 2017 for U.S. Appl. No. 14/228,971; Response filed Sep. 13, 2017; 14 Pages. |
Response to U.S. Office Action dated Jun. 10, 2016 corresponding to U.S. Appl. No. 14/228,971; Response filed Aug. 17, 2016; 10 Pages. |
U.S. Final Office Action dated Oct. 4, 2016 corresponding to U.S. Appl. No. 14/228,971; 37 Pages. |
U.S. Non-Final Office Action dated Jun. 2, 2017 for U.S. Appl. No. 15/079,208; 19 Pages. |
U.S. Non-Final Office Action dated Oct. 4, 2017 for U.S. Appl. No. 14/228,971; 37 pages. |
U.S. Non-Final Office Action dated Nov. 28, 2017 corresponding to U.S. Appl. No. 15/079,205; 9 Pages. |
U.S. Non-Final Office Action dated Dec. 29, 2017 corresponding to U.S. Appl. No. 15/079,208; 10 Pages. |
U.S. Non-Final Office Action dated Dec. 22, 2017 corresponding to U.S. Appl. No. 15/282,546; 12 Pages. |
Response to U.S. Non-Final Office Action dated Dec. 1, 2017 for U.S. Appl. No. 14/979,890; Response filed on Feb. 28, 2018; 9 Pages. |
Response to U.S. Non-Final Office Action dated Nov. 28, 2017 for U.S. Appl. No. 15/079,205; Response filed on Feb. 28, 2018; 11 Pages. |
Response to U.S. Non-Final Office Action dated Oct. 4, 2017 corresponding to U.S. Appl. No. 14/228,971; Response filed Jan. 26, 2018; 11 Pages. |
Response to U.S. Non-Final Office Action dated Dec. 29, 2017 for U.S. Appl. No. 15/079,208; Response filed on Apr. 30, 2018; 7 Pages. |
Response to U.S. Non-Final Office Action dated Dec. 22, 2017 for U.S. Appl. No. 15/282,546; Response filed May 17, 2018; 8 Pages. |
U.S. Final Office Action dated May 29, 2018 for U.S. Appl. No. 14/228,971; 35 pages. |
U.S. Non-Final Office Action dated May 31, 2018 for U.S. Appl. No. 15/281,593; 10 pages. |
U.S. Non-Final Office Action dated Dec. 1, 2017 for U.S. Appl. No. 14/979,890; 10 Pages. |