summaryrefslogtreecommitdiff
path: root/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/ContainerManager.java
blob: 2ff636e87fd807d58eaee77165da52bf7f58eeab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.hadoop.ozone.container.common.interfaces;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdds.scm.container.common.helpers.Pipeline;
import org.apache.hadoop.hdds.scm.container.common.helpers
    .StorageContainerException;
import org.apache.hadoop.hdfs.server.datanode.StorageLocation;
import org.apache.hadoop.hdfs.util.RwLock;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto
    .StorageContainerDatanodeProtocolProtos.ContainerReportsRequestProto;
import org.apache.hadoop.hdds.protocol.proto
    .StorageContainerDatanodeProtocolProtos.ReportState;
import org.apache.hadoop.hdds.protocol.proto
    .StorageContainerDatanodeProtocolProtos.SCMNodeReport;
import org.apache.hadoop.ozone.container.common.helpers.ContainerData;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * Interface for container operations.
 */
@InterfaceAudience.Private
@InterfaceStability.Unstable
public interface ContainerManager extends RwLock {

  /**
   * Init call that sets up a container Manager.
   *
   * @param config        - Configuration.
   * @param containerDirs - List of Metadata Container locations.
   * @param datanodeDetails - DatanodeDetails
   * @throws StorageContainerException
   */
  void init(Configuration config, List<StorageLocation> containerDirs,
            DatanodeDetails datanodeDetails) throws IOException;

  /**
   * Creates a container with the given name.
   *
   * @param pipeline      -- Nodes which make up this container.
   * @param containerData - Container Name and metadata.
   * @throws StorageContainerException
   */
  void createContainer(Pipeline pipeline, ContainerData containerData)
      throws StorageContainerException;

  /**
   * Deletes an existing container.
   *
   * @param pipeline      - nodes that make this container.
   * @param containerName - name of the container.
   * @param forceDelete   - whether this container should be deleted forcibly.
   * @throws StorageContainerException
   */
  void deleteContainer(Pipeline pipeline, String containerName,
      boolean forceDelete) throws StorageContainerException;

  /**
   * Update an existing container.
   *
   * @param pipeline container nodes
   * @param containerName name of the container
   * @param data container data
   * @param forceUpdate if true, update container forcibly.
   * @throws StorageContainerException
   */
  void updateContainer(Pipeline pipeline, String containerName,
      ContainerData data, boolean forceUpdate) throws StorageContainerException;

  /**
   * As simple interface for container Iterations.
   *
   * @param prefix - Return only values matching this prefix
   * @param count   - how many to return
   * @param prevKey - Previous key - Server returns results from this point.
   * @param data    - Actual containerData
   * @throws StorageContainerException
   */
  void listContainer(String prefix, long count, String prevKey,
                     List<ContainerData> data)
      throws StorageContainerException;

  /**
   * Choose containers for block deletion.
   *
   * @param count   - how many to return
   * @throws StorageContainerException
   */
  List<ContainerData> chooseContainerForBlockDeletion(int count)
      throws StorageContainerException;

  /**
   * Get metadata about a specific container.
   *
   * @param containerName - Name of the container
   * @return ContainerData - Container Data.
   * @throws StorageContainerException
   */
  ContainerData readContainer(String containerName)
      throws StorageContainerException;

  /**
   * Closes a open container, if it is already closed or does not exist a
   * StorageContainerException is thrown.
   * @param containerName - Name of the container.
   * @throws StorageContainerException
   */
  void closeContainer(String containerName)
      throws StorageContainerException, NoSuchAlgorithmException;

  /**
   * Checks if a container exists.
   * @param containerName - Name of the container.
   * @return true if the container is open false otherwise.
   * @throws StorageContainerException  - Throws Exception if we are not
   * able to find the container.
   */
  boolean isOpen(String containerName) throws StorageContainerException;

  /**
   * Supports clean shutdown of container.
   *
   * @throws StorageContainerException
   */
  void shutdown() throws IOException;

  /**
   * Sets the Chunk Manager.
   *
   * @param chunkManager - ChunkManager.
   */
  void setChunkManager(ChunkManager chunkManager);

  /**
   * Gets the Chunk Manager.
   *
   * @return ChunkManager.
   */
  ChunkManager getChunkManager();

  /**
   * Sets the Key Manager.
   *
   * @param keyManager - Key Manager.
   */
  void setKeyManager(KeyManager keyManager);

  /**
   * Gets the Key Manager.
   *
   * @return KeyManager.
   */
  KeyManager getKeyManager();

  /**
   * Get the Node Report of container storage usage.
   * @return node report.
   */
  SCMNodeReport getNodeReport() throws IOException;

  /**
   * Gets container report.
   * @return container report.
   * @throws IOException
   */
  ContainerReportsRequestProto getContainerReport() throws IOException;

  /**
   * Gets container reports.
   * @return List of all closed containers.
   * @throws IOException
   */
  List<ContainerData> getContainerReports() throws IOException;

  /**
   * Increase pending deletion blocks count number of specified container.
   *
   * @param numBlocks
   *          increment  count number
   * @param containerId
   *          container id
   */
  void incrPendingDeletionBlocks(int numBlocks, String containerId);

  /**
   * Decrease pending deletion blocks count number of specified container.
   *
   * @param numBlocks
   *          decrement count number
   * @param containerId
   *          container id
   */
  void decrPendingDeletionBlocks(int numBlocks, String containerId);

  /**
   * Increase the read count of the container.
   * @param containerName - Name of the container.
   */
  void incrReadCount(String containerName);

  /**
   * Increse the read counter for bytes read from the container.
   * @param containerName - Name of the container.
   * @param readBytes - bytes read from the container.
   */
  void incrReadBytes(String containerName, long readBytes);


  /**
   * Increase the write count of the container.
   * @param containerName - Name of the container.
   */
  void incrWriteCount(String containerName);

  /**
   * Increase the write counter for bytes write into the container.
   * @param containerName - Name of the container.
   * @param writeBytes - bytes write into the container.
   */
  void incrWriteBytes(String containerName, long writeBytes);

  /**
   * Increase the bytes used by the container.
   * @param containerName - Name of the container.
   * @param used - additional bytes used by the container.
   * @return the current bytes used.
   */
  long incrBytesUsed(String containerName, long used);

  /**
   * Decrease the bytes used by the container.
   * @param containerName - Name of the container.
   * @param used - additional bytes reclaimed by the container.
   * @return the current bytes used.
   */
  long decrBytesUsed(String containerName, long used);

  /**
   * Get the bytes used by the container.
   * @param containerName - Name of the container.
   * @return the current bytes used by the container.
   */
  long getBytesUsed(String containerName);

  /**
   * Get the number of keys in the container.
   * @param containerName - Name of the container.
   * @return the current key count.
   */
  long getNumKeys(String containerName);

  /**
   * Get the container report state to send via HB to SCM.
   * @return container report state.
   */
  ReportState getContainerReportState();
}