checkIfLoaded();
final long now = getNow();
earlyWriteCleanup(now);
markRecordStoreExpirable(ttl);
Record record = records.get(key);
Object oldValue;
if (record == null) {
oldValue = mapDataStore.load(key);
value = mapServiceContext.interceptPut(name, null, value);
value = mapDataStore.add(key, value, now);
record = createRecord(key, value, ttl, now);
records.put(key, record);
updateSizeEstimator(calculateRecordHeapCost(record));
saveIndex(record);
} else {
oldValue = record.getValue();
value = mapServiceContext.interceptPut(name, oldValue, value);
value = mapDataStore.add(key, value, now);
onStore(record);
// if key exists before, first reduce size
updateSizeEstimator(-calculateRecordHeapCost(record));