A method for managing access to a multi-device composite data storage system, the method comprising: managing a first data structure storing data for each unit in a first set of units on a first non-volatile data storage device, wherein for each unit in the first set of units, the data structure includes a value indicating a count of recent accesses and pinned status for the unit, wherein managing the first data structure comprises receiving a request to access a first logical block of the multi-device composite data storage system, accessing the first logical block from a first unit on the first non-volatile data storage device, and updating the count of recent accesses for the first unit; and managing a second data structure that probabilistically indicates whether a second unit on a second non-volatile data storage device has been recently referenced, wherein the second data structure is a queue of one or more Bloom filters and each unit on the first and second data storage device includes multiple logical blocks, wherein managing the second data structure comprises receiving a request to access a second block of the multi-device composite data storage system, searching the second data structure for a value that indicates the second unit has been referenced, and migrating the second unit to the first non-volatile data storage device if searching the second data structure for a value indicates that the second unit has been referenced, and if the first non-volatile data storage device is full, then prior to migrating the second unit to the first non-volatile data storage device, removing from the first non-volatile data storage device the data for an unit in the first set of units based on the value indicating the count of recent accesses. managing a first data structure storing data for each unit in a first set of units on a first non-volatile data storage device, wherein for each unit in the first set of units, the data structure includes a value indicating a count of recent accesses and pinned status for the unit, wherein managing the first data structure comprises receiving a request to access a first logical block of the multi-device composite data storage system, accessing the first logical block from a first unit on the first non-volatile data storage device, and updating the count of recent accesses for the first unit; and managing a second data structure that probabilistically indicates whether a second unit on a second non-volatile data storage device has been recently referenced, wherein the second data structure is a queue of one or more Bloom filters and each unit on the first and second data storage device includes multiple logical blocks, wherein managing the second data structure comprises receiving a request to access a second block of the multi-device composite data storage system, searching the second data structure for a value that indicates the second unit has been referenced, and migrating the second unit to the first non-volatile data storage device if searching the second data structure for a value indicates that the second unit has been referenced, and if the first non-volatile data storage device is full, then prior to migrating the second unit to the first non-volatile data storage device, removing from the first non-volatile data storage device the data for an unit in the first set of units based on the value indicating the count of recent accesses.