2020import org .springframework .stereotype .Component ;
2121
2222import java .util .*;
23- import java .util .concurrent .Semaphore ;
24- import java .util .concurrent .TimeUnit ;
2523import java .util .stream .Collectors ;
2624
2725@ Component
2826public class VSCodeIdUpdateService {
2927 private static final Logger LOGGER = LoggerFactory .getLogger (VSCodeIdUpdateService .class );
30- private static final Semaphore LOCK = new Semaphore (1 );
3128
3229 @ Autowired
3330 RepositoryService repositories ;
@@ -36,75 +33,69 @@ public class VSCodeIdUpdateService {
3633 VSCodeIdService service ;
3734
3835 public void update (String namespaceName , String extensionName ) throws InterruptedException {
39- var acquired = LOCK .tryAcquire (15 , TimeUnit .SECONDS );
40- if (!acquired ) {
41- throw new RuntimeException ("Failed to update public id for " + NamingUtil .toExtensionId (namespaceName , extensionName ));
42- }
4336 if (BuiltInExtensionUtil .isBuiltIn (namespaceName )) {
4437 LOGGER .debug ("SKIP BUILT-IN EXTENSION {}" , NamingUtil .toExtensionId (namespaceName , extensionName ));
4538 return ;
4639 }
4740
4841 var extension = repositories .findPublicId (namespaceName , extensionName );
4942 var extensionUpdates = new HashMap <Long , String >();
50- updateExtensionPublicId (extension , extensionUpdates );
43+ updateExtensionPublicId (extension , extensionUpdates , false );
5144 if (!extensionUpdates .isEmpty ()) {
5245 repositories .updateExtensionPublicIds (extensionUpdates );
5346 }
5447
5548 var namespaceUpdates = new HashMap <Long , String >();
56- updateNamespacePublicId (extension , namespaceUpdates );
49+ updateNamespacePublicId (extension , namespaceUpdates , false );
5750 if (!namespaceUpdates .isEmpty ()) {
5851 repositories .updateNamespacePublicIds (namespaceUpdates );
5952 }
60- LOCK .release ();
6153 }
6254
63- private void updateExtensionPublicId (Extension extension , Map <Long , String > updates ) {
55+ private void updateExtensionPublicId (Extension extension , Map <Long , String > updates , boolean mustUpdate ) {
6456 LOGGER .debug ("updateExtensionPublicId: {}" , NamingUtil .toExtensionId (extension ));
65- service . getUpstreamPublicIds ( extension );
66- if (extension . getPublicId () == null ) {
67- var publicId = "" ;
57+ var oldPublicId = extension . getPublicId ( );
58+ var newPublicId = service . getUpstreamPublicIds (extension ). extension ();
59+ if ( newPublicId == null || ( mustUpdate && newPublicId . equals ( oldPublicId ))) {
6860 do {
69- publicId = UUID . randomUUID (). toString ();
70- LOGGER .debug ("RANDOM EXTENSION PUBLIC ID: {}" , publicId );
71- } while (updates .containsValue (publicId ) || repositories .extensionPublicIdExists (publicId ));
72- LOGGER .debug ("RANDOM PUT UPDATE: {} - {}" , extension .getId (), publicId );
73- updates .put (extension .getId (), publicId );
74- } else {
75- LOGGER .debug ("UPSTREAM PUT UPDATE: {} - {}" , extension .getId (), extension . getPublicId () );
76- updates .put (extension .getId (), extension . getPublicId () );
77- var duplicatePublicId = repositories .findPublicId (extension . getPublicId () );
61+ newPublicId = service . getRandomPublicId ();
62+ LOGGER .debug ("RANDOM EXTENSION PUBLIC ID: {}" , newPublicId );
63+ } while (updates .containsValue (newPublicId ) || repositories .extensionPublicIdExists (newPublicId ));
64+ LOGGER .debug ("RANDOM PUT UPDATE: {} - {}" , extension .getId (), newPublicId );
65+ updates .put (extension .getId (), newPublicId );
66+ } else if (! newPublicId . equals ( oldPublicId )) {
67+ LOGGER .debug ("UPSTREAM PUT UPDATE: {} - {}" , extension .getId (), newPublicId );
68+ updates .put (extension .getId (), newPublicId );
69+ var duplicatePublicId = repositories .findPublicId (newPublicId );
7870 if (duplicatePublicId != null ) {
79- updateExtensionPublicId (duplicatePublicId , updates );
71+ updateExtensionPublicId (duplicatePublicId , updates , true );
8072 }
8173 }
8274 }
8375
84- private void updateNamespacePublicId (Extension extension , Map <Long , String > updates ) {
76+ private void updateNamespacePublicId (Extension extension , Map <Long , String > updates , boolean mustUpdate ) {
8577 LOGGER .debug ("updateNamespacePublicId: {}" , extension .getNamespace ().getName ());
86- service . getUpstreamPublicIds ( extension );
87- var namespace = extension . getNamespace ();
88- if ( namespace . getPublicId () == null ) {
89- var publicId = "" ;
78+ var oldPublicId = extension . getNamespace (). getPublicId ( );
79+ var newPublicId = service . getUpstreamPublicIds ( extension ). namespace ();
80+ var id = extension . getNamespace (). getId ();
81+ if ( newPublicId == null || ( mustUpdate && newPublicId . equals ( oldPublicId ))) {
9082 do {
91- publicId = UUID . randomUUID (). toString ();
92- LOGGER .debug ("RANDOM NAMESPACE PUBLIC ID: {}" , publicId );
93- } while (updates .containsValue (publicId ) || repositories .namespacePublicIdExists (publicId ));
94- LOGGER .debug ("RANDOM PUT UPDATE: {} - {}" , namespace . getId (), publicId );
95- updates .put (namespace . getId (), publicId );
96- } else {
97- LOGGER .debug ("UPSTREAM PUT UPDATE: {} - {}" , namespace . getId (), namespace . getPublicId () );
98- updates .put (namespace . getId (), namespace . getPublicId () );
99- var duplicatePublicId = repositories .findNamespacePublicId (namespace . getPublicId () );
83+ newPublicId = service . getRandomPublicId ();
84+ LOGGER .debug ("RANDOM NAMESPACE PUBLIC ID: {}" , newPublicId );
85+ } while (updates .containsValue (newPublicId ) || repositories .namespacePublicIdExists (newPublicId ));
86+ LOGGER .debug ("RANDOM PUT UPDATE: {} - {}" , id , newPublicId );
87+ updates .put (id , newPublicId );
88+ } else if (! newPublicId . equals ( oldPublicId )) {
89+ LOGGER .debug ("UPSTREAM PUT UPDATE: {} - {}" , id , newPublicId );
90+ updates .put (id , newPublicId );
91+ var duplicatePublicId = repositories .findNamespacePublicId (newPublicId );
10092 if (duplicatePublicId != null ) {
101- updateNamespacePublicId (duplicatePublicId , updates );
93+ updateNamespacePublicId (duplicatePublicId , updates , true );
10294 }
10395 }
10496 }
10597
10698 public void updateAll () throws InterruptedException {
107- LOCK .acquire ();
10899 LOGGER .debug ("DAILY UPDATE ALL" );
109100 var extensions = repositories .findAllPublicIds ();
110101 var extensionPublicIdsMap = extensions .stream ()
@@ -124,16 +115,16 @@ public void updateAll() throws InterruptedException {
124115 }
125116
126117 LOGGER .trace ("GET UPSTREAM PUBLIC ID: {} | {}" , extension .getId (), NamingUtil .toExtensionId (extension ));
127- service .getUpstreamPublicIds (extension );
118+ var publicIds = service .getUpstreamPublicIds (extension );
128119 if (upstreamExtensionPublicIds .get (extension .getId ()) == null ) {
129- LOGGER .trace ("ADD EXTENSION PUBLIC ID: {} - {}" , extension .getId (), extension . getPublicId ());
130- upstreamExtensionPublicIds .put (extension .getId (), extension . getPublicId ());
120+ LOGGER .trace ("ADD EXTENSION PUBLIC ID: {} - {}" , extension .getId (), publicIds . extension ());
121+ upstreamExtensionPublicIds .put (extension .getId (), publicIds . extension ());
131122 }
132123
133124 var namespace = extension .getNamespace ();
134125 if (upstreamNamespacePublicIds .get (namespace .getId ()) == null ) {
135- LOGGER .trace ("ADD NAMESPACE PUBLIC ID: {} - {}" , namespace .getId (), namespace . getPublicId ());
136- upstreamNamespacePublicIds .put (namespace .getId (), namespace . getPublicId ());
126+ LOGGER .trace ("ADD NAMESPACE PUBLIC ID: {} - {}" , namespace .getId (), publicIds . namespace ());
127+ upstreamNamespacePublicIds .put (namespace .getId (), publicIds . namespace ());
137128 }
138129 }
139130
@@ -160,8 +151,6 @@ public void updateAll() throws InterruptedException {
160151
161152 repositories .updateNamespacePublicIds (changedNamespacePublicIds );
162153 }
163-
164- LOCK .release ();
165154 }
166155
167156 private Map <Long , String > getChangedPublicIds (Map <Long , String > upstreamPublicIds , Map <Long , String > currentPublicIds ) {
@@ -190,15 +179,15 @@ private void updatePublicIdNulls(Map<Long, String> changedPublicIds, Set<String>
190179 return remove ;
191180 });
192181
193- // put random UUIDs where upstream public id is missing
182+ // put random public ids where upstream public id is missing
194183 for (var key : changedPublicIds .keySet ()) {
195184 if (changedPublicIds .get (key ) != null ) {
196185 continue ;
197186 }
198187
199188 String publicId = null ;
200189 while (newPublicIds .contains (publicId )) {
201- publicId = UUID . randomUUID (). toString ();
190+ publicId = service . getRandomPublicId ();
202191 LOGGER .debug ("NEW PUBLIC ID - {}: '{}'" , key , publicId );
203192 }
204193
0 commit comments