BUG 1853 : Clustered Data Store causes Out of Memory
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / test / java / org / opendaylight / controller / cluster / datastore / utils / InMemorySnapshotStore.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.cluster.datastore.utils;
10
11 import akka.dispatch.Futures;
12 import akka.japi.Option;
13 import akka.persistence.SelectedSnapshot;
14 import akka.persistence.SnapshotMetadata;
15 import akka.persistence.SnapshotSelectionCriteria;
16 import akka.persistence.snapshot.japi.SnapshotStore;
17 import com.google.common.collect.Iterables;
18 import scala.concurrent.Future;
19
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 public class InMemorySnapshotStore extends SnapshotStore {
26
27     Map<String, List<Snapshot>> snapshots = new HashMap<>();
28
29     @Override public Future<Option<SelectedSnapshot>> doLoadAsync(String s,
30         SnapshotSelectionCriteria snapshotSelectionCriteria) {
31         List<Snapshot> snapshotList = snapshots.get(s);
32         if(snapshotList == null){
33             return Futures.successful(Option.<SelectedSnapshot>none());
34         }
35
36         Snapshot snapshot = Iterables.getLast(snapshotList);
37         SelectedSnapshot selectedSnapshot =
38             new SelectedSnapshot(snapshot.getMetadata(), snapshot.getData());
39         return Futures.successful(Option.some(selectedSnapshot));
40     }
41
42     @Override public Future<Void> doSaveAsync(SnapshotMetadata snapshotMetadata, Object o) {
43         List<Snapshot> snapshotList = snapshots.get(snapshotMetadata.persistenceId());
44
45         if(snapshotList == null){
46             snapshotList = new ArrayList<>();
47             snapshots.put(snapshotMetadata.persistenceId(), snapshotList);
48         }
49         snapshotList.add(new Snapshot(snapshotMetadata, o));
50
51         return Futures.successful(null);
52     }
53
54     @Override public void onSaved(SnapshotMetadata snapshotMetadata) throws Exception {
55     }
56
57     @Override public void doDelete(SnapshotMetadata snapshotMetadata) throws Exception {
58         List<Snapshot> snapshotList = snapshots.get(snapshotMetadata.persistenceId());
59
60         if(snapshotList == null){
61             return;
62         }
63
64         int deleteIndex = -1;
65
66         for(int i=0;i<snapshotList.size(); i++){
67             Snapshot snapshot = snapshotList.get(i);
68             if(snapshotMetadata.equals(snapshot.getMetadata())){
69                 deleteIndex = i;
70                 break;
71             }
72         }
73
74         if(deleteIndex != -1){
75             snapshotList.remove(deleteIndex);
76         }
77
78     }
79
80     @Override public void doDelete(String s, SnapshotSelectionCriteria snapshotSelectionCriteria)
81         throws Exception {
82         List<Snapshot> snapshotList = snapshots.get(s);
83
84         if(snapshotList == null){
85             return;
86         }
87
88         // TODO : This is a quick and dirty implementation. Do actual match later.
89         snapshotList.clear();
90         snapshots.remove(s);
91     }
92
93     private static class Snapshot {
94         private final SnapshotMetadata metadata;
95         private final Object data;
96
97         private Snapshot(SnapshotMetadata metadata, Object data) {
98             this.metadata = metadata;
99             this.data = data;
100         }
101
102         public SnapshotMetadata getMetadata() {
103             return metadata;
104         }
105
106         public Object getData() {
107             return data;
108         }
109     }
110 }