Project

General

Profile

Revision 6567

Added by Chris Jones about 9 years ago

Modify CNodeService's updateSystemMetadata(), setReplicationStatus(), setReplicationPolicy(), and setOwner() with support for SystemMetadata's serialVersion field. Other methods still pending an update. Use the hzSystemMetadata map for all system metadata reads using a lock on the pid in order to get the very latest version.

View differences:

src/edu/ucsb/nceas/metacat/dataone/CNodeService.java
23 23

  
24 24
package edu.ucsb.nceas.metacat.dataone;
25 25

  
26
import java.math.BigInteger;
27
import java.util.Calendar;
26 28
import java.util.Date;
27 29
import java.util.List;
28 30
import java.util.Set;
......
116 118
   */
117 119
  @Override
118 120
  public boolean setReplicationPolicy(Session session, Identifier pid,
119
    ReplicationPolicy policy) 
120
    throws NotImplemented, NotFound, NotAuthorized, ServiceFailure, InvalidRequest, InvalidToken {
121

  
122
    // get the subject
123
    Subject subject = session.getSubject();
124
    // get the system metadata
125
    String guid = pid.getValue();
126
    
127
    // are we allowed to do this?
128
    if (!isAuthorized(session, pid, Permission.CHANGE_PERMISSION)) {
129
      throw new NotAuthorized("4881", Permission.CHANGE_PERMISSION + " not allowed by " + subject.getValue() + " on " + guid);  
130
    }
131
    
132
    SystemMetadata systemMetadata = null;
133
    try {
134
      systemMetadata = IdentifierManager.getInstance().getSystemMetadata(guid);
135
    } catch (McdbDocNotFoundException e) {
136
      throw new NotFound("4884", "No record found for: " + guid);
137
    }
121
      ReplicationPolicy policy) 
122
      throws NotImplemented, NotFound, NotAuthorized, ServiceFailure, 
123
      InvalidRequest, InvalidToken {
124
      
125
      // get the subject
126
      Subject subject = session.getSubject();
127
      
128
      // are we allowed to do this?
129
      if (!isAuthorized(session, pid, Permission.CHANGE_PERMISSION)) {
130
        throw new NotAuthorized("4881", Permission.CHANGE_PERMISSION + 
131
            " not allowed by " + subject.getValue() + " on " + pid.getValue());  
132
      }
133
      
134
      SystemMetadata systemMetadata = null;
135
      try {
136
          HazelcastService.getInstance().getSystemMetadataMap().lock(pid);
137
          systemMetadata = HazelcastService.getInstance().getSystemMetadataMap().get(pid);
138 138
        
139
    // set the new policy
140
    systemMetadata.setReplicationPolicy(policy);
139
      } catch (Exception e) { // Catch is generic since HZ throws RuntimeException
140
        throw new NotFound("4884", "No record found for: " + pid.getValue());
141
        
142
      }
143
          
144
      // set the new policy
145
      systemMetadata.setReplicationPolicy(policy);
146
      
147
      // update the metadata
148
      try {
149
        systemMetadata.setSerialVersion(systemMetadata.getSerialVersion().add(BigInteger.ONE));
150
        systemMetadata.setDateSysMetadataModified(Calendar.getInstance().getTime());
151
	      HazelcastService.getInstance().getSystemMetadataMap().put(systemMetadata.getIdentifier(), systemMetadata);
152
	      HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
153
	      
154
      } catch (Exception e) {
155
		      throw new ServiceFailure("4882", e.getMessage());
156
		  
157
	    } finally {
158
	        HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
159
	        
160
	    }
141 161
    
142
    // update the metadata
143
    try {
144
	    HazelcastService.getInstance().getSystemMetadataMap().lock(systemMetadata.getIdentifier());
145
	    HazelcastService.getInstance().getSystemMetadataMap().put(systemMetadata.getIdentifier(), systemMetadata);
146
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
147
    } catch (Exception e) {
148
		throw new ServiceFailure("4882", e.getMessage());
149
	} finally {
150
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
151
	}
152
    
153
    return true;
162
      return true;
154 163
  }
155 164

  
156 165
  /**
......
178 187

  
179 188
    // get the subject
180 189
    Subject subject = session.getSubject();
181
    // get the system metadata
182
    String guid = pid.getValue();
183 190
    
184 191
    // are we allowed to do this?
185 192
    if (!isAuthorized(session, pid, Permission.WRITE)) {
186
      throw new NotAuthorized("4720", Permission.WRITE + " not allowed by " + subject.getValue() + " on " + guid);  
193
      throw new NotAuthorized("4720", Permission.WRITE + " not allowed by " + 
194
          subject.getValue() + " on " + pid.getValue());  
187 195
    }
188 196
    
189 197
    SystemMetadata systemMetadata = null;
190
    try {
191
      systemMetadata = IdentifierManager.getInstance().getSystemMetadata(guid);
192
    } catch (McdbDocNotFoundException e) {
193
      throw new NotFound("4740", "No record found for: " + guid);
198
    try {      
199
        HazelcastService.getInstance().getSystemMetadataMap().lock(pid);
200
        systemMetadata = HazelcastService.getInstance().getSystemMetadataMap().get(pid);
201

  
202
    } catch (Exception e) { // Catch is generic since HZ throws RuntimeException
203
      throw new NotFound("4740", "No record found for: " + pid.getValue() +
204
          " : " + e.getMessage());
205
      
194 206
    }
195 207
        
196
    // set the status for each replica
197
    // TODO: should this method select a certain replica?
208
    // set the status for the replica
198 209
    List<Replica> replicas = systemMetadata.getReplicaList();
199 210
    for (Replica replica: replicas) {
200
      replica.setReplicationStatus(status);
211
        if (replica.getReplicaMemberNode().getValue().equals(targetNode.getValue())) {
212
            replica.setReplicationStatus(status);
213
            
214
        }
201 215
    }
202 216
    
203 217
    // [re]set the list -- redundant?
......
205 219
    
206 220
    // update the metadata
207 221
    try {
208
	    HazelcastService.getInstance().getSystemMetadataMap().lock(systemMetadata.getIdentifier());
209
	    HazelcastService.getInstance().getSystemMetadataMap().put(systemMetadata.getIdentifier(), systemMetadata);
210
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
222
        systemMetadata.setSerialVersion(systemMetadata.getSerialVersion().add(BigInteger.ONE));
223
        systemMetadata.setDateSysMetadataModified(Calendar.getInstance().getTime());
224
	      HazelcastService.getInstance().getSystemMetadataMap().put(systemMetadata.getIdentifier(), systemMetadata);
225
	      HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
226
	    
211 227
    } catch (Exception e) {
212
		throw new ServiceFailure("4700", e.getMessage());
213
	} finally {
214
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
215
	}
228
		    throw new ServiceFailure("4700", e.getMessage());
229
		
230
	  } finally {
231
	      HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
232
	      
233
	  }
216 234
	
217 235
    return true;
218 236
  }
......
575 593
   */
576 594
  @Override
577 595
  public boolean updateSystemMetadata(Session session, Identifier guid,
578
    SystemMetadata sysmeta) 
579
    throws NotImplemented, NotAuthorized, ServiceFailure, InvalidRequest, 
580
    InvalidSystemMetadata, NotFound {
596
      SystemMetadata sysmeta) 
597
      throws NotImplemented, NotAuthorized, ServiceFailure, InvalidRequest, 
598
      InvalidSystemMetadata, NotFound {
581 599

  
582
    // TODO: control who can call this?
583
        if (session == null) {
584
            //TODO: many of the thrown exceptions do not use the correct error codes
585
            //check these against the docs and correct them
586
            throw new NotAuthorized("4861", "No Session - could not authorize for update." +
587
                    "  If you are not logged in, please do so and retry the request.");
588
        }
589
        
590
        // verify that guid == SystemMetadata.getIdentifier()
591
        logMetacat.debug("Comparing guid|sysmeta_guid: " + guid.getValue() + "|" + sysmeta.getIdentifier().getValue());
592
        if (!guid.getValue().equals(sysmeta.getIdentifier().getValue())) {
593
            throw new InvalidRequest("4863", 
594
                "GUID in method call (" + guid.getValue() + ") does not match GUID in system metadata (" +
595
                sysmeta.getIdentifier().getValue() + ").");
596
        }
600
      // TODO: control who can call this?
601
      if (session == null) {
602
          //TODO: many of the thrown exceptions do not use the correct error codes
603
          //check these against the docs and correct them
604
          throw new NotAuthorized("4861", "No Session - could not authorize for update." +
605
                  "  If you are not logged in, please do so and retry the request.");
606
      }
607
      
608
      // verify that guid == SystemMetadata.getIdentifier()
609
      logMetacat.debug("Comparing guid|sysmeta_guid: " + guid.getValue() + "|" + 
610
          sysmeta.getIdentifier().getValue());
611
      if (!guid.getValue().equals(sysmeta.getIdentifier().getValue())) {
612
          throw new InvalidRequest("4863", 
613
              "GUID in method call (" + guid.getValue() + 
614
              ") does not match GUID in system metadata (" +
615
              sysmeta.getIdentifier().getValue() + ").");
616
      }
597 617

  
598
        logMetacat.debug("Checking if identifier exists...");
599
        // Check that the identifier exists
600
        if (!IdentifierManager.getInstance().identifierExists(guid.getValue())) {
601
            throw new NotFound("000", 
602
                "GUID does not exist");
603
        }
618
      logMetacat.debug("Checking if identifier exists...");
619
      // Check that the identifier exists
620
      if (!IdentifierManager.getInstance().identifierExists(guid.getValue())) {
621
          throw new NotFound("000", 
622
              "GUID does not exist");
623
      }
604 624

  
605
        // update the system metadata into the object store
606
        logMetacat.debug("Starting to update SystemMetadata...");
607
        sysmeta.setDateSysMetadataModified(new Date());
608
        
609
        // update system metadata
610
        try {
625
      // update the system metadata into the object store
626
      logMetacat.debug("Starting to update SystemMetadata...");
627
      
628
      // update system metadata
629
      try {
611 630
    	    HazelcastService.getInstance().getSystemMetadataMap().lock(sysmeta.getIdentifier());
612
    	    HazelcastService.getInstance().getSystemMetadataMap().put(sysmeta.getIdentifier(), sysmeta);
631
          SystemMetadata currentSysMeta = 
632
              HazelcastService.getInstance().getSystemMetadataMap().get(sysmeta.getIdentifier());
633
          sysmeta.setSerialVersion(currentSysMeta.getSerialVersion().add(BigInteger.ONE));
634
          sysmeta.setDateSysMetadataModified(Calendar.getInstance().getTime());
635
          HazelcastService.getInstance().getSystemMetadataMap().put(sysmeta.getIdentifier(), sysmeta);
613 636
    	    HazelcastService.getInstance().getSystemMetadataMap().unlock(sysmeta.getIdentifier());
614
        } catch (Exception e) {
615
    		throw new ServiceFailure("4852", e.getMessage());
637
    	    
638
      } catch (Exception e) {
639
    	throw new ServiceFailure("4852", e.getMessage());
640
    	
616 641
    	} finally {
617 642
    	    HazelcastService.getInstance().getSystemMetadataMap().unlock(sysmeta.getIdentifier());
643
    	  
618 644
    	}
619
        
620
        logMetacat.debug("Returning from updateSystemMetadata");
621
        EventLog.getInstance().log(request.getRemoteAddr(), request.getHeader("User-Agent"), session.getSubject().getValue(), guid.getValue(), "updateSystemMetadata");
622
        return true;
645
      
646
      logMetacat.debug("Returning from updateSystemMetadata");
647
      EventLog.getInstance().log(request.getRemoteAddr(), 
648
                                 request.getHeader("User-Agent"), 
649
                                 session.getSubject().getValue(), 
650
                                 guid.getValue(), "updateSystemMetadata");
651
      return true;
623 652
  }
624 653
  
625 654
  /**
......
713 742
    
714 743
    // get the subject
715 744
    Subject subject = session.getSubject();
716
    // get the system metadata
717
    String guid = pid.getValue();
718 745
    
719 746
    // are we allowed to do this?
720 747
    if (!isAuthorized(session, pid, Permission.CHANGE_PERMISSION)) {
721
      throw new NotAuthorized("4440", "not allowed by " + subject.getValue() + " on " + guid);  
748
      throw new NotAuthorized("4440", "not allowed by " + subject.getValue() + " on " + pid.getValue());  
722 749
    }
723 750
    
724 751
    SystemMetadata systemMetadata = null;
725 752
    try {
726
      systemMetadata = IdentifierManager.getInstance().getSystemMetadata(guid);
727
    } catch (McdbDocNotFoundException e) {
728
      throw new NotFound("4460", "No record found for: " + guid);
753
        HazelcastService.getInstance().getSystemMetadataMap().lock(pid);
754
        systemMetadata = HazelcastService.getInstance().getSystemMetadataMap().get(pid);
755
        
756
    } catch (Exception e) { // Catch is generic since HZ throws RuntimeException
757
        throw new NotFound("4460", "No record found for: " + pid.getValue());
758
        
729 759
    }
730 760
        
731 761
    // set the new rights holder
......
733 763
    
734 764
    // update the metadata
735 765
    try {
736
	    HazelcastService.getInstance().getSystemMetadataMap().lock(systemMetadata.getIdentifier());
737
	    HazelcastService.getInstance().getSystemMetadataMap().put(systemMetadata.getIdentifier(), systemMetadata);
738
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
766
        systemMetadata.setSerialVersion(systemMetadata.getSerialVersion().add(BigInteger.ONE));
767
        systemMetadata.setDateSysMetadataModified(Calendar.getInstance().getTime());
768
	      HazelcastService.getInstance().getSystemMetadataMap().put(pid, systemMetadata);
769
	      HazelcastService.getInstance().getSystemMetadataMap().unlock(pid);
770
	      
739 771
    } catch (Exception e) {
740 772
		throw new ServiceFailure("4490", e.getMessage());
741
	} finally {
742
	    HazelcastService.getInstance().getSystemMetadataMap().unlock(systemMetadata.getIdentifier());
743
	}
773
		
774
	  } finally {
775
	      HazelcastService.getInstance().getSystemMetadataMap().unlock(pid);
776
	  }
744 777
    
745 778
    return pid;
746 779
  }

Also available in: Unified diff