1717
1818package org .apache .hadoop .ozone .om .request .key ;
1919
20- import static org .apache .hadoop .ozone .om .exceptions .OMException .ResultCodes .KEY_NOT_FOUND ;
21- import static org .apache .hadoop .ozone .om .exceptions .OMException .ResultCodes .KEY_UNDER_LEASE_RECOVERY ;
22- import static org .apache .hadoop .ozone .om .lock .OzoneManagerLock .LeveledResource .BUCKET_LOCK ;
23-
2420import jakarta .annotation .Nonnull ;
2521import java .io .IOException ;
26- import java .nio .file .InvalidPathException ;
27- import java .util .Collections ;
28- import java .util .List ;
29- import java .util .Map ;
30- import java .util .Objects ;
31- import org .apache .hadoop .hdds .client .ReplicationConfig ;
32- import org .apache .hadoop .ozone .OzoneConsts ;
33- import org .apache .hadoop .ozone .audit .AuditLogger ;
34- import org .apache .hadoop .ozone .audit .OMAction ;
3522import org .apache .hadoop .ozone .om .OMMetadataManager ;
36- import org .apache .hadoop .ozone .om .OMMetrics ;
37- import org .apache .hadoop .ozone .om .OzoneManager ;
38- import org .apache .hadoop .ozone .om .exceptions .OMException ;
39- import org .apache .hadoop .ozone .om .execution .flowcontrol .ExecutionContext ;
4023import org .apache .hadoop .ozone .om .helpers .BucketLayout ;
4124import org .apache .hadoop .ozone .om .helpers .OmBucketInfo ;
4225import org .apache .hadoop .ozone .om .helpers .OmFSOFile ;
4326import org .apache .hadoop .ozone .om .helpers .OmKeyInfo ;
44- import org .apache .hadoop .ozone .om .helpers .OmKeyLocationInfo ;
4527import org .apache .hadoop .ozone .om .helpers .OzoneFSUtils ;
46- import org .apache .hadoop .ozone .om .helpers .QuotaUtil ;
4728import org .apache .hadoop .ozone .om .request .file .OMFileRequest ;
48- import org .apache .hadoop .ozone .om .request .util .OmResponseUtil ;
4929import org .apache .hadoop .ozone .om .response .OMClientResponse ;
5030import org .apache .hadoop .ozone .om .response .key .OMAllocateBlockResponseWithFSO ;
51- import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos ;
52- import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos .AllocateBlockRequest ;
53- import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos .AllocateBlockResponse ;
54- import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos .KeyArgs ;
5531import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos .OMRequest ;
5632import org .apache .hadoop .ozone .protocol .proto .OzoneManagerProtocolProtos .OMResponse ;
57- import org .slf4j .Logger ;
58- import org .slf4j .LoggerFactory ;
5933
6034/**
6135 * Handles allocate block request - prefix layout.
6236 */
6337public class OMAllocateBlockRequestWithFSO extends OMAllocateBlockRequest {
6438
65- private static final Logger LOG =
66- LoggerFactory .getLogger (OMAllocateBlockRequestWithFSO .class );
67-
6839 public OMAllocateBlockRequestWithFSO (OMRequest omRequest ,
6940 BucketLayout bucketLayout ) {
7041 super (omRequest , bucketLayout );
7142 }
7243
7344 @ Override
74- public OMClientResponse validateAndUpdateCache (OzoneManager ozoneManager , ExecutionContext context ) {
75- final long trxnLogIndex = context .getIndex ();
76-
77- AllocateBlockRequest allocateBlockRequest =
78- getOmRequest ().getAllocateBlockRequest ();
79-
80- KeyArgs keyArgs =
81- allocateBlockRequest .getKeyArgs ();
82-
83- OzoneManagerProtocolProtos .KeyLocation blockLocation =
84- allocateBlockRequest .getKeyLocation ();
85- Objects .requireNonNull (blockLocation , "blockLocation == null" );
86-
87- String volumeName = keyArgs .getVolumeName ();
88- String bucketName = keyArgs .getBucketName ();
89- String keyName = keyArgs .getKeyName ();
90- long clientID = allocateBlockRequest .getClientID ();
91-
92- OMMetrics omMetrics = ozoneManager .getMetrics ();
93- omMetrics .incNumBlockAllocateCalls ();
94-
95- AuditLogger auditLogger = ozoneManager .getAuditLogger ();
96-
97- Map <String , String > auditMap = buildKeyArgsAuditMap (keyArgs );
98- auditMap .put (OzoneConsts .CLIENT_ID , String .valueOf (clientID ));
99-
100- OMMetadataManager omMetadataManager = ozoneManager .getMetadataManager ();
101- String openKeyName = null ;
102-
103- OMResponse .Builder omResponse = OmResponseUtil .getOMResponseBuilder (
104- getOmRequest ());
105- OMClientResponse omClientResponse = null ;
106-
107- OmKeyInfo openKeyInfo = null ;
108- Exception exception = null ;
109- OmBucketInfo omBucketInfo = null ;
110- boolean acquiredLock = false ;
111-
112- try {
113- validateBucketAndVolume (omMetadataManager , volumeName ,
114- bucketName );
115-
116- // Here we don't acquire bucket/volume lock because for a single client
117- // allocateBlock is called in serial fashion. With this approach, it
118- // won't make 'fail-fast' during race condition case on delete/rename op,
119- // assuming that later it will fail at the key commit operation.
120- openKeyName = getOpenKeyName (volumeName , bucketName , keyName , clientID ,
121- ozoneManager );
122- openKeyInfo = getOpenKeyInfo (omMetadataManager , openKeyName , keyName );
123- if (openKeyInfo == null ) {
124- throw new OMException ("Open Key not found " + openKeyName ,
125- KEY_NOT_FOUND );
126- }
127- if (openKeyInfo .getMetadata ().containsKey (OzoneConsts .LEASE_RECOVERY )) {
128- throw new OMException ("Open Key " + openKeyName + " is under lease recovery" ,
129- KEY_UNDER_LEASE_RECOVERY );
130- }
131- if (openKeyInfo .getMetadata ().containsKey (OzoneConsts .DELETED_HSYNC_KEY ) ||
132- openKeyInfo .getMetadata ().containsKey (OzoneConsts .OVERWRITTEN_HSYNC_KEY )) {
133- throw new OMException ("Open Key " + openKeyName + " is already deleted/overwritten" ,
134- KEY_NOT_FOUND );
135- }
136- List <OmKeyLocationInfo > newLocationList = Collections .singletonList (
137- OmKeyLocationInfo .getFromProtobuf (blockLocation ));
138-
139- mergeOmLockDetails (
140- omMetadataManager .getLock ().acquireWriteLock (BUCKET_LOCK ,
141- volumeName , bucketName ));
142- acquiredLock = getOmLockDetails ().isLockAcquired ();
143- omBucketInfo = getBucketInfo (omMetadataManager , volumeName , bucketName );
144- // check bucket and volume quota
145- long preAllocatedKeySize = newLocationList .size ()
146- * ozoneManager .getScmBlockSize ();
147- long hadAllocatedKeySize =
148- openKeyInfo .getLatestVersionLocations ().getLocationList ().size ()
149- * ozoneManager .getScmBlockSize ();
150- ReplicationConfig repConfig = openKeyInfo .getReplicationConfig ();
151- long totalAllocatedSpace = QuotaUtil .getReplicatedSize (
152- preAllocatedKeySize , repConfig ) + QuotaUtil .getReplicatedSize (
153- hadAllocatedKeySize , repConfig );
154- checkBucketQuotaInBytes (omMetadataManager , omBucketInfo ,
155- totalAllocatedSpace );
156- // Append new block
157- openKeyInfo .appendNewBlocks (newLocationList , false );
158-
159- // Set modification time.
160- openKeyInfo .setModificationTime (keyArgs .getModificationTime ());
161-
162- // Set the UpdateID to current transactionLogIndex
163- openKeyInfo = openKeyInfo .toBuilder ()
164- .setUpdateID (trxnLogIndex )
165- .build ();
166-
167- // Add to cache.
168- addOpenTableCacheEntry (trxnLogIndex , omMetadataManager , openKeyName , keyName ,
169- openKeyInfo );
170-
171- omResponse .setAllocateBlockResponse (AllocateBlockResponse .newBuilder ()
172- .setKeyLocation (blockLocation ).build ());
173- long volumeId = omMetadataManager .getVolumeId (volumeName );
174- omClientResponse = getOmClientResponse (clientID , omResponse ,
175- openKeyInfo , omBucketInfo .copyObject (), volumeId );
176- LOG .debug ("Allocated block for Volume:{}, Bucket:{}, OpenKey:{}" ,
177- volumeName , bucketName , openKeyName );
178- } catch (IOException | InvalidPathException ex ) {
179- omMetrics .incNumBlockAllocateCallFails ();
180- exception = ex ;
181- omClientResponse = new OMAllocateBlockResponseWithFSO (
182- createErrorOMResponse (omResponse , exception ), getBucketLayout ());
183- LOG .error ("Allocate Block failed. Volume:{}, Bucket:{}, OpenKey:{}. " +
184- "Exception:{}" , volumeName , bucketName , openKeyName , exception );
185- } finally {
186- if (acquiredLock ) {
187- mergeOmLockDetails (
188- omMetadataManager .getLock ().releaseWriteLock (
189- BUCKET_LOCK , volumeName , bucketName ));
190- }
191- if (omClientResponse != null ) {
192- omClientResponse .setOmLockDetails (getOmLockDetails ());
193- }
194- }
195-
196- markForAudit (auditLogger , buildAuditMessage (OMAction .ALLOCATE_BLOCK , auditMap ,
197- exception , getOmRequest ().getUserInfo ()));
198-
199- return omClientResponse ;
200- }
201-
202- private OmKeyInfo getOpenKeyInfo (OMMetadataManager omMetadataManager ,
45+ protected OmKeyInfo getOpenKeyInfo (OMMetadataManager omMetadataManager ,
20346 String openKeyName , String keyName ) throws IOException {
20447 String fileName = OzoneFSUtils .getFileName (keyName );
20548 return OMFileRequest .getOmKeyInfoFromFileTable (true ,
20649 omMetadataManager , openKeyName , fileName );
20750 }
20851
209- private String getOpenKeyName (String volumeName , String bucketName ,
210- String keyName , long clientID , OzoneManager ozoneManager )
52+ @ Override
53+ protected String getOpenKeyName (String volumeName , String bucketName ,
54+ String keyName , long clientID , OMMetadataManager omMetadataManager )
21155 throws IOException {
212- OMMetadataManager omMetadataManager = ozoneManager .getMetadataManager ();
213-
21456 return new OmFSOFile .Builder ()
21557 .setVolumeName (volumeName )
21658 .setBucketName (bucketName )
@@ -219,18 +61,30 @@ private String getOpenKeyName(String volumeName, String bucketName,
21961 .build ().getOpenFileName (clientID );
22062 }
22163
222- private void addOpenTableCacheEntry (long trxnLogIndex ,
64+ @ Override
65+ protected void addOpenTableCacheEntry (long trxnLogIndex ,
22366 OMMetadataManager omMetadataManager , String openKeyName , String keyName ,
22467 OmKeyInfo openKeyInfo ) {
22568 OMFileRequest .addOpenFileTableCacheEntry (omMetadataManager , openKeyName ,
22669 openKeyInfo , keyName , trxnLogIndex );
22770 }
22871
72+ @ Override
22973 @ Nonnull
230- private OMClientResponse getOmClientResponse (long clientID ,
74+ protected OMClientResponse getOmClientResponse (long clientID ,
23175 OMResponse .Builder omResponse , OmKeyInfo openKeyInfo ,
232- OmBucketInfo omBucketInfo , long volumeId ) {
76+ OmBucketInfo omBucketInfo , OMMetadataManager omMetadataManager )
77+ throws IOException {
78+ long volumeId = omMetadataManager .getVolumeId (openKeyInfo .getVolumeName ());
23379 return new OMAllocateBlockResponseWithFSO (omResponse .build (), openKeyInfo ,
23480 clientID , getBucketLayout (), volumeId , omBucketInfo .getObjectID ());
23581 }
82+
83+ @ Override
84+ @ Nonnull
85+ protected OMClientResponse getOmClientErrorResponse (
86+ OMResponse .Builder omResponse , Exception exception ) {
87+ return new OMAllocateBlockResponseWithFSO (
88+ createErrorOMResponse (omResponse , exception ), getBucketLayout ());
89+ }
23690}
0 commit comments